Войти
ПрограммированиеФорумГрафика

Constant buffer offsetting боль

#0
6:04, 18 янв. 2018

Имеется d3d контекст уровня 11.0. Требуется использовать функциональность, связанную с VS/PSSetConstantBuffers1: https://msdn.microsoft.com/en-us/library/windows/desktop/hh446795(v=vs.85).aspx

Через боль и страдания было установлено, что количество багов драйвера, связанных с этой штукой, просто умо не постижимо. Например, на intel hd 2000/3000, несмотря на то, что device->CheckFeatureSupport( D3D11_FEATURE_THREADING, ...) уверяет, якобы ConstantBufferOffsetting поддерживается, на самом деле он просто не работает. ну то есть вообще. но это бог с ним, самый отстой в том, что даже на нормальных видюхах он периодически просто отваливается. насколько периодически? — раз в несколько дней работы приложения. разумеется, сперва я винил наши руки с их радиусом кривизны, пока не нашёл в интернетах это:
https://bugzilla.mozilla.org/show_bug.cgi?id=1379413
багрепорт от девелопера фаерфокса, цитата1:

Unfortunately even Windows 8 and 10 are not perfect. Intel HD Graphics 2/3xxx report true for this feature, but are broken

цитата 2:
We've also seen NVIDIA bugs on our own infrastructure where leaving an offset-based slot bound too long causes the driver to stop drawing

я уж думал, что мы одни такие во вселенной, когда оказалось, что нет. оно на полном серьёзе отваливается, если "slot bound too long".

О том, насколько криво реализованы constant buffer offsets в драйверах, можно судить хотя бы по официальной документации от майкрософта же, в которой рассказывается, какими именно костылями следует обходить некоторые из его багов(другие): https://msdn.microsoft.com/en-us/library/windows/desktop/hh446795(v=vs.85).aspx (см. раздел Calling VSSetConstantBuffers1 with command list emulation)


Здорово, но, к сожалению, тут "ну вот, я же говорил, что баг-то в драйвере!" не поможет. Если баг в драйвере, то искать, как его обходить, нам. Потому что, очевидно, никто другой его фиксить не будет. Вопрос: кто-то в курсе, как это обходить?

#1
9:28, 18 янв. 2018

точно делаете как тут https://developer.nvidia.com/content/constant-buffers-without-constant-pain-0  ?

#2
16:11, 18 янв. 2018

Suslik
> можно судить хотя бы по официальной документации от майкрософта же, в которой
> рассказывается, какими именно костылями следует обходить некоторые из его
> багов(другие)
Господи, какая жесть.

#3
20:08, 18 янв. 2018

-Eugene-
> Господи, какая жесть.

я же говорю - прОклятое апи

#4
12:48, 24 янв. 2018

innuendo

одно апи убогое, а другое проклятое?
Прошло более 1 года
#5
17:27, 5 сен. 2019

Пардон за гробокопание, но не хочу плодить лишних тем из-за одного маленького вопросика:
Я не понял, XXSetConstantBuffers1 на Windows 7 не работает вообще?

#6
20:01, 5 сен. 2019

Suslik
> Вопрос: кто-то в курсе, как это обходить?
Ну что? Обошел? Рассказывай как?
p.s. Я это обхожу просто, не использую XXSetConstantBuffers1. А чтобы получить zero driver overhead для смены юниформов per draw call - использую вместо этого инстанс буфер и baseInstance в дравколле.

#7
21:43, 5 сен. 2019

prowkan
> Я не понял, XXSetConstantBuffers1 на Windows 7 не работает вообще?
как повезёт.

MrShoor
> Ну что? Обошел? Рассказывай как?
ахаха, да никак. сдался.

#8
21:49, 5 сен. 2019

Suslik
> ахаха, да никак. сдался.
Ну тогда могу посоветовать только instance буфер и baseInstance параметр. Эта штука работает действительно хорошо.

#9
22:04, 5 сен. 2019

Я просто не использую константный буфер по возможности. Через него устанавливаю только глобальные вещи для одного кадра.

#10
(Правка: 1:57) 1:54, 7 сен. 2019

Паяльник в руки и на квартиру к Хуангу. Баг быстро пофиксят :)
1486810898157220291 | Constant buffer offsetting боль

ПрограммированиеФорумГрафика