Регистрировать диапазоны в HLSL? - PullRequest
0 голосов
/ 16 ноября 2018

В настоящее время я занимаюсь рефакторингом большого куска старого кода и, наконец, нырнул в раздел HLSL, где мои знания минимальны из-за отсутствия практики.Я встречал некоторую документацию онлайн, в которой указывается, какие регистры должны использоваться для каких целей:

  • t - для представлений ресурсов шейдеров (SRV)
  • s - для сэмплеров
  • u - для неупорядоченных представлений доступа (UAV)
  • b - для постоянных представлений буфера (CBV)

Thisчасть довольно очевидна.Если я хочу создать постоянный буфер, я могу просто объявить как:

cbuffer LightBuffer: register(b0) { };
cbuffer CameraBuffer: register(b1) { };
cbuffer MaterialBuffer: register(b2) { };
cbuffer ViewBuffer: register(b3) { };

Однако, происходя из мира MIPS Assembly, я не могу не задаться вопросом, существуют ли конечные и ограниченные диапазоны на этих,Например, временные регистры ограничены диапазоном t0 - t7 в MIPS Assembly.В случае HLSL я не смог найти никакой документации, связанной с этой темой, поскольку все, кажется, указывает на языки ассемблера и микропроцессоры (такие как 8051, если вы хотите, чтобы случайная тема читалась).


Есть ли заданный диапазон для четырех типов регистров в HLSL или я просто продолжаю столько, сколько необходимо, последовательно и позволяю базовой сборке обрабатывать грязные детали?


Примечание

Я частично ответил на этот вопрос, так как не могу найти диапазон для u в настоящее время;однако, если у кого-то есть лучший, более подробный ответ, чем тот, который я дал во время тестирования, не стесняйтесь опубликовать его, и я отмечу это как правильный ответ.Я оставлю этот вопрос открытым до 1 декабря 2018 , чтобы дать другим возможность дать лучший ответ для будущих читателей.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Количество слотов ресурса (для d3d11, действительно, регистр d3d12 расширяет это значение) указывается в Лимит ресурса страница msdn.

Вот те, которые вас интересуют:

  • D3D11_COMMONSHADER_INPUT_RESOURCE_REGISTER_COUNT (т. Е. T) = 128
  • D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT (т. Е.): 16

Случай u отличается, так как он зависит от уровня возможностей (а tbh - беспорядок версии поставщика / операционной системы):

  • D3D11_FEATURE_LEVEL_11_1 или больше, это 64 слота
  • D3D11_FEATURE_LEVEL_11: всегда будет 8 (но некоторые карты / драйверы в конечном итоге поддерживают 64, вам нужно по крайней мере Windows 8 для этого (это может бытьтакже доступны в Windows 7 с некоторыми обновлениями платформы тоже.) Я не помню способ проверить, поддерживается ли 64 (многиеnvidia в их диапазоне 700, например).
  • D3D11_FEATURE_LEVEL_10_1: либо 0, либо 1, есть способ проверить, поддерживается ли вычисление

Вам необходимо выполнить функцию проверьте :

D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS checkData;

d3dDevice->CheckFeatureSupport(D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS, &checkData);

BOOL computeSupport = checkData.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x 

Обратите внимание, что для некоторых версий ОС / драйверов этот флаг возвращал значение ИСТИНА, хотя он не поддерживается (Intel делал это в win7 / 8), поэтому в этом случае единственным действительнымРешение состояло в том, чтобы попытаться либо создать небольшой буфер необработанных / байтовых адресов, либо структурированный буфер и проверить HRESULT

. Поскольку функциональность уровня примечания 10 или ниже предназначена для довольно старых конфигураций в настоящее время, так что за исключением редкихСценарии, которые вы, вероятно, можете смело игнорировать (я просто оставляю это для информационных целей).

0 голосов
/ 16 ноября 2018

Поскольку вопросы такого типа обычно долго ожидаются, я проверил регистр b, пытаясь создать cbuffer в регистре b51.Это не удалось, как я ожидал, и, к счастью, SharpDX выплюнул исключение, которое заявило, что оно имеет максимум 14.Поэтому для будущих читателей я тестирую все четыре типа регистров и выкладываю диапазоны, которые я нахожу успешными.

  • b имеет диапазон b0 - b13.
  • s имеет диапазон s0 - s15.
  • t имеет диапазон t0 - t127.
  • u имеет диапазон .

В настоящий момент я не могу найти диапазон для регистра u, поскольку у меня нет примеров этого в моем коде, и я фактически никогда не использовал его.Если приходит кто-то, у кого есть пример использования, то не стесняйтесь его протестировать и обновить этот пост для будущих читателей.


Я обнаружил противоречие с моими выводами выше в документации, связанной с моим вопросом;у них есть пример использования регистра t выше отмеченного диапазона в этом ответе:

Texture2D                     a[10000] : register(t0);
Texture2D                     b[10000] : register(t10000);
ConstantBuffer<myConstants>   c[10000] : register(b0);

Примечание

Я хотел бы отметить, что я использую SharpDX версия HLSL компилятора, и поэтому я не уверен, варьируются ли эти диапазоны от компилятора к компилятору;Я сильно сомневаюсь, что они это делают, но вы никогда не будете слишком уверены, пока не попытаетесь превзойти их.GLSL может быть одинаковым из-за того, что он похож на HLSL, но также может сильно отличаться.

...