|
@@ -316,16 +316,14 @@ void DxilModule::CollectShaderFlagsForModule(ShaderFlags &Flags) {
|
|
|
|
|
|
const ShaderModel *SM = GetShaderModel();
|
|
|
|
|
|
- unsigned NumUAVs = m_UAVs.size();
|
|
|
+ unsigned NumUAVs = 0;
|
|
|
const unsigned kSmallUAVCount = 8;
|
|
|
- if (NumUAVs > kSmallUAVCount)
|
|
|
- Flags.Set64UAVs(true);
|
|
|
- if (NumUAVs && !(SM->IsCS() || SM->IsPS()))
|
|
|
- Flags.SetUAVsAtEveryStage(true);
|
|
|
|
|
|
bool hasRawAndStructuredBuffer = false;
|
|
|
|
|
|
for (auto &UAV : m_UAVs) {
|
|
|
+ unsigned uavSize = UAV->GetRangeSize();
|
|
|
+ NumUAVs += uavSize > 8U? 9U: uavSize; // avoid overflow
|
|
|
if (UAV->IsROV())
|
|
|
Flags.SetROVs(true);
|
|
|
switch (UAV->GetKind()) {
|
|
@@ -338,6 +336,16 @@ void DxilModule::CollectShaderFlagsForModule(ShaderFlags &Flags) {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ // Maintain earlier erroneous counting of UAVs for compatibility
|
|
|
+ if (DXIL::CompareVersions(m_ValMajor, m_ValMinor, 1, 6) < 0)
|
|
|
+ Flags.Set64UAVs(m_UAVs.size() > kSmallUAVCount);
|
|
|
+ else
|
|
|
+ Flags.Set64UAVs(NumUAVs > kSmallUAVCount);
|
|
|
+
|
|
|
+ if (NumUAVs && !(SM->IsCS() || SM->IsPS()))
|
|
|
+ Flags.SetUAVsAtEveryStage(true);
|
|
|
+
|
|
|
+
|
|
|
for (auto &SRV : m_SRVs) {
|
|
|
switch (SRV->GetKind()) {
|
|
|
case DXIL::ResourceKind::RawBuffer:
|