love5an: (Default)
Начал потихоньку допиливать LDX(я его буду использовать в Reactivity для рендеринга, а также в моем стартапе), и вот на днях приделал интерфейс к компилятору HLSL(d3dcompiler_43.dll).

Под катом пример использования:
Read more... )

DXGI

Mar. 13th, 2011 11:32 pm
love5an: (Default)
Начал работу над LDX.

Вот буквально сегодня накатал биндинги к DXGI. Накатал, надо сказать, очень быстро, буквально за пару часов.
А все почему? Макросы.

Вот так выглядит декларация интерфейса IDXGISwapChain в лиспе:
Read more... )

А вот так, например, можно узнать название своей видеокарты(первой из установленных, если их больше одной):

(string-trim '(#\space #\null)
(adapter-description (description (enum-adapters (create-dxgi-factory)))))

У меня на ноуте вычисляется в "ATI Mobility Radeon HD 5470", например.
Как видно, о release я не особо беспокоюсь - потому как COM-интерфейсы у меня привязаны к GC.
love5an: (Default)
Завел блог на английском, в котором буду описывать процесс разработки Virgil, Doors и LDX

http://love5an.wordpress.com/
love5an: (Default)
Библиотеку я не забросил, она продолжает развиваться, сейчас уже примерно 16000 строк кода.

Удалось запустить на ECL, собранном с помощью mingw/gcc-4.4.2. Хотя, там есть некоторые странности, связанные, видимо, с неправильной работой ECL с символьными макросами - он их почему-то иногда считает переменными и ругается на unbound-variables; с другой стороны, возможно это у меня в коде где-то баг.

Кроме того, работает на SBCL(основная платформа разработки, несмотря на отсутствие тредов), CCL и clisp.

На 64-битных версиях тоже должна, в принципе, т.к. в нужных местах расставлены соответствующие #+ и #-, хотя не проверял. Кроме того, частично выяснил причину медленной компиляции.

Для полноценного биндинга к Direct3D 10 осталось перенести примерно половину D3DX10 и дописать некоторые вещи в бэкенде. Ну и рефакторинг бэкенда.

Потом допишу биндинги к 10.1, благо там немного, и усовершенствованную часть DXGI. Ну и сэмплы из DX SDK надо бы перенести. А уже потом - другие части DX, в т.ч. D3D11.

Надо бы это все дело выложить на какой-нибудь хостинг проектов, типа common-lisp.net
И прикрутить к какой-либо системе управления версиями. Скорее всего будет svn. Хотел раньше git, но с ним на винде... не то чтобы жопа, но не особо удобно.

Еще надо подумать над некоторыми вопросами архитектуры, в основном связанными с ком-интерфейсами.

Например, вопрос о том, сколько должно быть врапперов у конкретного интерфейса - сколько угодно ли(и тогда надо извращаться со счетчиком ссылок, следить за ним постоянно) или один, как в SlimDX(тогда надо держать хеш-табличку и доставать из нее объект когда какая-нибудь нативная функция возвращает указатель на уже существующий, например, и т.п; но тут встают некоторые сложности с автоматическим управлением, опять же), о том, в какой форме юзер должен будет определять свои интерфейсы, и просто c++ классы, если понадобится, о потокобезопасности и т.п.
love5an: (Default)
Написал TODO для своей библиотеки.
Пока что небольшое, но вообще там должно быть больше пунктов, конечно.
* Fix d3d10effect.lisp - effect matrix variables
  should be of arbitrary size, not just 4x4.
* Make more use of %get-value-into and %read-value-into.
* Rewrite memory accessor code generators. At the time they look crappy.
* Compile and load speed is VERY SLOW at the moment, especially on clisp.
  Fix it, if possible.
love5an: (Default)
А никто случайно не знает как обойти вот это вот ограничение в MSVC++ (9.0) ?

А то из-за него ECL собранный из под оного не хочет компилировать мою библиотеку, например. И не только мою - например еще cl-unicode.
love5an: (Default)
Вот есть функция.
(defun vec3-normalize (v &optional out)
  (declare (type vector3 v)
           (type (or null vector3) out))
  (%with-value (p-out vector3)
    (external-funcall ("D3DXVec3Normalize" :library d3dx10)
      :pointer     p-out
      (:* vector3) v)
    (if (null out)
      (%get-value p-out vector3)
      (progn (setf (vec3-x out) (%get-value p-out :float 0)
                   (vec3-y out) (%get-value p-out :float 4)
                   (vec3-z out) (%get-value p-out :float 8))
             out))))

vector3 определяется вот так:
(define-struct (vector3 :constructor make-vec3
                        :copier copy-vec3
                        :prefix vec3-
                        :type (vector single-float)
                        :include vector2)
        ((z :float)))


Вобщем, я для этой функции(и для других подобных) решил зайдействовать интерфейс разделяемой памяти из cffi, with-pointer-to-vector-data
Получилось такое:
#+ldx:shareable-vectors
(defun vec3-normalize (v &optional out)
  (declare (type vector3 v)
           (type (or null vector3) out))
  (if (null out)
    (%with-value (p-out vector3)
      (external-funcall ("D3DXVec3Normalize" :library d3dx10)
        :pointer p-out 
        (:* vector3) v)
      (%get-value p-out vector3))
    (cffi:with-pointer-to-vector-data (p-out out)
      (external-funcall ("D3DXVec3Normalize" :library d3dx10)
        :pointer p-out
        (:* vector3) v)
      out)))


На SBCL производительность от этого выигрывает, примерно на треть.
(time (dotimes (i 10000000) (vec3-normalize *v* *out*))) вместо ~350-400 мс выполняется за ~250-300

А вот на CCL(clozure), хотя там тоже, вроде как, разделяемая память работает, получается медленнее первого варианта, вместо 2.3 секунд ~2.5-2.6, что странно.


Еще, ищу как бы заюзать SSE для операций над векторами :)
Для SBCL есть какое-то описание вот тут:
http://www.pvk.ca/Blog/Lisp/hacking_SSE_intrinsics-part_1.html
и какая-то устаревшая библиотека
http://common-lisp.net/project/sb-simd/

Для CCL - копался в сорцах, вроде xmm регистры и некоторые мнемоники как-то определены, но сам интерфейс ассемблерных вставок пока непонятен.

LDX

Oct. 9th, 2009 04:27 am
love5an: (Default)
Вот, собственно.
Готовы биндинги к самому ядру d3d10. Это, то есть, DXGI и собственно сам D3D10. Грубо говоря, хидеры dxgi.h, d3d10.h, d3d10misc.h d3d10shader.h, d3d10effect.h и d3dcompiler.h
Вот сорцы, собственно:
http://ifolder.ru/14404695

Версия, конечно, еще пре-пре-альфа, но, по крайней мере, работает.
Там два простеньких примера, вот например второй:

эту радость генерирует такой вот код:
http://paste.lisp.org/display/88412

Для полного d3d10 не хватает D3DX10, и, возможно, sdk layers.
Потом буду писать к остальным частям direct x, навроде direct sound.

Архитектура внутренностей и даже некоторого фронтенда(работа с сырой памятью) очень сильно на макросах. Буквально, в "ldx/d3d10/d3d10.lisp" из всех 113 кб, макросов - 99% кода, если не больше.

Например, в примере есть макрос with-value. Он при компиляции, по поставляемой спецификации типа, вычисляет все оффсеты и раскрывается в примитивы cffi, навроде "(setf (mem-ref #:POINTER-123 :uint #:OFFSET-456) #:UINT-VALUE-789)", которые cffi тоже раскрывает при компиляции до примитивов соответствующего ffi соответствующей лисп-системы.
Из
  (with-value (buff (:array simple-vertex 3) supplied-value)
     (do-something))

например, получается вот такая простыня кода: http://paste.lisp.org/display/88413
Но, зато, очень быстро работает, например потому, что проставляются типы, а вычисленные при компиляции размеры позволяют лисп-рантайму запихнуть значение на сишный стек.

COM интерфейсы представлены врапперами, clos-классами, структурированными в иерархию. На наследников UNKNOWN(который в враппер над I-UNKNOWN) в конструкторе(initialize-instance) навешивается финалайзер, декрементирующий счетчик ссылок, поэтому можно, в теории, не беспокоиться о ручном add-ref и release.

А, ну, естественно, поддерживает юникод(LPWSTR) и не юникод(LPCSTR)(по *features* определяет при компиляции). И еще utf-8, в виде типа :string из cffi.

Да, я наркоман. Спрашивайте вопросы.

Profile

love5an: (Default)
Dmitry Ignatiev

December 2016

S M T W T F S
    123
45678910
11121314 151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 23rd, 2017 03:50 am
Powered by Dreamwidth Studios