Показаны сообщения с ярлыком Direct3D9. Показать все сообщения
Показаны сообщения с ярлыком Direct3D9. Показать все сообщения

среда, 12 мая 2010 г.

Профайлер для DX приложений

Наткнулся на профайлер для приложений под DX9-11. Возможно кому окажется полезен. Есть некоторые баги, но с ними можно жить :-).

http://busyray.com/dxprof/index.html

понедельник, 22 марта 2010 г.

Подсчет ссылок в D3D8 и D3D9

Казалось бы что может быть сложного, на AddRef() увеличиваем кол-во ссылок, в Release() уменьшаем. Но в Diretct3D 8 и 9, как обычно, не все так просто и чтобы создать полноценный Direct3D Wrapper необходимо это все учитывать, иначе некоторые игры начнут с ни падать.

Вот некоторые особенности:
  • Автоматически созданные IDirect3DDevice9 ресурсы (BackBuffer, автоматически созданный depth-stencil surface, основной SwapChain) нельзя удалить, т.е. Release() можно вызывать хоть до бесконечности он будет возвращать кол-во ссылок 0 и не удалит ресурс.
  • Само устройство не увеличивает кол-во ссылок на автоматически созданные ресурсы.
  • Пока ресурс забинджен в устройство (с помощью SetTexture, SetRenderTarget или SetDepthStencilSurface) его нельзя удалить, при попытке удалить его счетчик ссылок не будет опускать ниже 0. После того устройство освободит ресурс если кол-во ссылок ресурса равно нулю он будет удален.
  • У текстуры и её поверхностей общий счетчик ссылок.
Вот так то :-)

воскресенье, 22 ноября 2009 г.

Переход с Direct3D9 на Direct3D9Ex

Была необходимость воспользоваться Shared ресурсами в D3D9 под Vist'ой/Win 7, для этого решили переписать приложение чтобы оно вместо интерфейса IDirect3DDevice9 стало использовать IDirect3DDevice9Ex. Казалось бы что может быть проще, у IDirect3DDevice9Ex родительский интерфейс IDirect3DDevice9.

Но как всегда всплыли некоторые подводные камни:

Под D3D9Ex не поддерживаются Pool Managed для ресурсов, поэтому пришлось их все перевести в Pool Default. Так как ресурсы в Pool Default можно лочить только установить Usage Dynamic, пришлось его установить у соответствующих ресурсов.

  • Так как для Managed ресурсов LockRect всегда возвращал Pitch равный ширине поверхности в байтах, т.е. строки не выравниваются, а строки в динамических ресурсах в Pool Default наоборот всегда выравниваются до следующего значения кратно степени двойки. Поэтому пришлось переписать места где текстуры заливались одним memcpy без учета Pitch, так чтобы они корректно работали с выравненными строками.
  • Выяснилось ещё для Volume текстур в Pool Default в LockBox есть баг в Direct3D9 и Direct3D9Ex, он напрочь игнорирует параметры Front, Back и всегда лочит весь объем полностью. Для Volume текстур в Pool Managed все работает правильно в Direct3D9. Переписали код чтоб обновляли содержимое объема всегда полностью.


Может кому будет интересен или даже полезен этот опыт.

пятница, 20 ноября 2009 г.

пятница, 21 августа 2009 г.

Упрощение отладки в Visual Studio - autoexp.dat



Собрал/написал самые полезные для меня визуализаторы: Boost (для самых популярных классов) и TinyXML. А также там добавлены коды ошибок Direct3D.

Для установки, следует заменить файл в "%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\" файлом из архива.

Ссылки по теме:
 

Update: для Visual Studio 2012 теперь можно установить extension со всеми визуализаторами перечисленными выше и даже больше http://bit.ly/Mn73hE

воскресенье, 2 ноября 2008 г.

Перехват D3D9 или как устроены StateBlock'и

Когда мы решили полностью отказаться от вызова Get* методов D3D9 в нашей обертке над ним, а перехватывать для этого Set* методы и сохранять значение там мы с толкнулись с некоторыми непредвиденными трудностями.

Перехватив все нужные методы мы столкнулись с одной интересной особеностью реализации StateBlock'ов в D3D9, при вызова BeginStateBlock() D3D9 меняет указатели в таблицы виртуальных функция устройства у следующих методов: SetMaterial, SetRenderState, SetTexture, SetTextureStageState, SetSamplerState, SetFVF, SetVertexShader, SetVertexShaderConstantF, SetVertexShaderConstantI, SetVertexShaderConstantB, SetStreamSource, SetStreamSourceFreq, SetIndices, SetPixelShader, SetPixelShaderConstantF, SetPixelShaderConstantI, SetPixelShaderConstantB, а остальные Set* функции просто не применяю новые значения состояний к устройству и только сохраняют их в StateBlock'е. Насколько я знаю в COM нет легального способа поменять указать в VTBL, т.е. это по сути хак. С этим возникли проблемы когда мы хотели вызвать оригинальные методы внутри BeginStateBlock\EndStateBlock.

пятница, 7 марта 2008 г.

Глюки и недокументированные вещи Direct3D, драйверов NVidia и ATI

Входе работы над нашим стерео драйвером были обнаружены множество глюков, которые в силу специфики в других приложениях видимо небыли замечены.
  1. Как то возникла необходимость выполнять операции прерывая рендеринг игры, пришлось использовать StateBlock'и для того чтобы никакие State игры не испортить. Оказывалось что если создать StateBlock при запуске программы CreateStateBlock(D3DSBT_ALL, ...), а потом его использовать Capture, а затем Apply то все OffsetStream'ов сбросятся в 0. Поэтому пришлось сохранять все смещения потоков (GetStreamSource) и потом их восстанавливать (SetStreamSource). А если же StateBlock создавать каждый раз и применять, то почему-то ещё портятся некоторые вертексные константы с индексами свыше 128, по крайней мере такие вещи были замечены на некоторых играх, причем между Create, Apply вообще не одна константа в коде не менялась.
  2. Частое переключение RenderTarget'ов, DepthStencil поверхностей сильно тормозит на NVidia, а на ATI только при включение AntiAlising'а.
  3. На NVidia не работает 255'ая константа для VertexShader'ов.
  4. ID3DXFont портит какие-то State'ы из за чего появлялись глюки в некоторых играх, при рисование FPS с помощью него. Поэтому вместо него стали пользоваться AngelCode Bitmap Font
  5. На NVidia не работает MRT если поставить в качестве RenderTarget'ов BackBuffer'а от двух SwapChain'ов если создать из со включенным антиалайзингом.
  6. Не где не сказано, но видимо подозревается как само собой разумеющееся. При установке 0'го RenderTarget'а Viewport и ScissorRect устанавливаются по размерам этой поверхности.
Вот вроде все что удалось вспомнить, надеюсь это кому-то будет полезно.

четверг, 26 апреля 2007 г.

Новая версия стереодрайвера

Вот новый релиз моего стеродрайвера RealStereo 0.3b реализующий стерео в режиме оптимизированный анаглиф. Драйвер поддерживает только Direct3D 9 программы.

Вкратце, кому интересно, стереодрайвер работает так:
  • Перехватывает вызовы Direct3D9
  • Вместо BackBuffer'а, DepthStencil и RenderTarget текстур/поверхностей создаются стерео текстуры/поверхности. Они отличаются тем что должны хранят не один а два ракурса (для левого и правого глаза).
  • Каждый Draw вызов дублируется для обоих ракурсов. При этом если используется вертексный шейдер то он модифицируется для смещения камеры, иначе модифицируется матрица проецирования. А также если используются RT текстуры, то выбирается необходимый ракурс.
  • Во время вызова Present драйвер объединяет оба ракурса BackBuffer'а в один с помощью пиксельного шейдера.
Самая нетривиальная тут задача конечно модификации кода вертексных шейдеров, хотя было и много других подводных камней.

Тестировал в играх HL2, HMM5, Flatout 2. Есть небольшие глюки, по этому и beta.

К сожалению не представляю как реализовать PageFlip из за того что драйвера видеокарты не предоставляют доступа к 3-PIN VGA, а также незнаю как прервать отрисовку текущего кадра и в этот момент нарисовать другой ракурс в BackBuffer. Наверное, поэтому разработку прийдеться прекратить. Так как стерео в ангалиф режиме всетаки сильно ущербное по цветопередачи.