пятница, 18 декабря 2009 г.

Direct3D 11 Inspection

Нашёл несколько интересных мест в Direct3D 11.

Первое - D3D11_DEPTH_STENCIL_VIEW_DESC. У этой структуры появилось дополнительное поле UINT Flags (в 10 версии его не было). Я обнаружил это, когда прямой копипаст DX10-кода в DX11 не заработал (в дополнительном поле был мусор и рантайм возвращал ошибку). В SDK по этому поводу написано следующее:
A value that describes whether the texture is read only. Pass 0 to specify that it is not read only; otherwise, pass one of the members of the D3D11_DSV_FLAG enumerated type:

D3D11_DSV_READ_ONLY_DEPTH
Indicates that depth values are read only.
D3D11_DSV_READ_ONLY_STENCIL
Indicates that stencil values are read only.
В пояснении написано:
Limiting a depth-stencil buffer to read-only access allows more than one depth-stencil view to be bound to the pipeline simultaneously, since it is not possible to have a read/write conflicts between separate views.
Я так понимаю, это сделано для того, чтобы можно было одну и ту же depth/stencil текстуру одновременно прицепить как render target на запись и как shader resource view на чтение в шейдере, при этом разбросав чтение и запись по depth/stencil. Иначе непонятна формулировка "allows more than one depth-stencil view to be bound to the pipeline simultaneously", т. к. методы ID3D11DeviceContext::OMSetRenderTargets() и ID3D11..Context::OMSetRenderTargetsAndUnorderedAccessViews() принимают только ОДИН depth/stencil view. (кстати, о последнем методе: в SDK опять напортачили секретарши майкрософта, типы параметров отличаются от таковых в D3D11.h). К тому же неясно, зачем вообще подключать одновременно два depth/stencil view (буфера) к пайплайну. Получается, речь идёт именно о OM/PS конфликте. Но и в этом свете приведённая формулировка туманна, т. к. PS принимает именно resource view, а не depth-stencil view.

В общем, как-то всё туманно и неясно, как конкретно использовать новое преимущество. Пишем в depth, а в шейдере читаем только stencil из того же самого буфера? Пишем в stencil, в шейдере читаем только depth?

Ещё один интересный найдёныш из Direct3D 11, на этот раз в HLSL attributes. Помимо прочих, появился новый атрибут earlydepthstencil. Назначение - ФОРСИРОВАТЬ выполнение early z/stencil тестов до пиксельного шейдера. Как известно, железо может это делать только при соблюдении определённых условий (например, из шейдера не пишется глубина), а если они нарушаются, то early тесты отключаются.

Кстати, вот мои мысли, высказанные два года назад по этому поводу:


Так что мои мысли оказались в каком-то роде пророческими. Интересно, насколько новый атрибут устойчив к различного рода пакостям? Например, если попытаться писать в глубину, кто кого сломает? :)

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

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