вторник, 8 июня 2010 г.

D3D10: отличия в реализациях run-time

Вчера наткнулся на любопытный баг, связанный с некорректной реализацией ранних версий рантайма Direct3D 10.0. Я использовал код двухлетней давности, в котором создавал multisampled depth/stencil буфер с флагами D3D10_BIND_DEPTH_STENCIL | D3D10_BIND_SHADER_RESOURCE. Последний флаг был необязателен, т. к. ресурс служил только как render target. Тогда код работал замечательно, но теперь при попытке реюзать его под feature level 10.0 рантайм выдал в debug output такое сообщение:

D3D10: ERROR: ID3D10Device::CreateTexture2D: If the device interface is D3D10.0 or the driver/hardware are D3D10.0 (regardless of API version), a Texture2D with sample count > 1 cannot have both D3D10_BIND_DEPTH_STENCIL and D3D10_BIND_SHADER_RESOURCE. This call may appear to incorrectly return success on older/current D3D10 runtimes due to missing validation, despite this debug layer message. [ STATE_CREATION ERROR #99: CREATETEXTURE2D_INVALIDBINDFLAGS ]

Это значит, что старые Direct3D 10 программы могут накрыться с новым ран-таймом (Windows 7). Реально это, конечно, ошибка, т. к. multisampled D/S не может читаться в feature level 10.0 (только multisampled RT и non-multisampled D/S). С другой стороны, D3D10_BIND_SHADER_RESOURCE почти всегда используется совместно с D3D10_BIND_RENDER_TARGET, поэтому неудивительно, что он случайно остался в флагах после копи-паста.

И в Microsoft для D/S этот флаг прозевали.
И старый код теперь некорректный.

P.S. В feature level 10.1 можно читать из multisampled D/S.

Комментариев нет:

Отправить комментарий