Fixed test failures in d3d12_sw mode due to bugs in WARP
assiduous
2 years ago
+4
-0
150 | 150 | uint RWStructBuffIdx = index % NUM_RWSTRUCT_BUFFERS; |
151 | 151 | uint RWFmtBuffIdx = index % NUM_RWFMT_BUFFERS; |
152 | 152 | |
153 | #ifdef USE_D3D12_WARP_BUG_WORKAROUND | |
154 | ConstBuffIdx = 0; | |
155 | #endif | |
156 | ||
153 | 157 | float4 AllCorrect = float4(1.0, 1.0, 1.0, 1.0); |
154 | 158 | AllCorrect *= CheckValue(g_Textures[TEXTURES_NONUNIFORM(TexIdx)].SampleLevel(g_Samplers[NonUniformResourceIndex(SamIdx)], coord, 0.0), TexRefValues[TexIdx]); |
155 | 159 | AllCorrect *= CheckValue(g_ConstantBuffers[CONST_BUFFERS_NONUNIFORM(ConstBuffIdx)].Data, ConstBuffRefValues[ConstBuffIdx]); |
2153 | 2153 | ShaderCreateInfo ShaderCI; |
2154 | 2154 | ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL; |
2155 | 2155 | ShaderCI.UseCombinedTextureSamplers = true; |
2156 | if (UseArray && pEnv->NeedWARPResourceArrayIndexingBugWorkaround()) | |
2157 | { | |
2158 | // As of Windows version 2004 (build 19041), there is a bug in D3D12 WARP rasterizer: | |
2159 | // Shader resource array indexing always references array element 0 when shaders are compiled | |
2160 | // with shader model 5.1. | |
2161 | // Use SM5.0 with old compiler as a workaround. | |
2162 | ShaderCI.ShaderCompiler = SHADER_COMPILER_DEFAULT; | |
2163 | ShaderCI.HLSLVersion = ShaderVersion{5, 0}; | |
2164 | } | |
2156 | ||
2157 | auto SelectShaderCompiler = [UseArray, pEnv](ShaderCreateInfo& ShaderCI) // | |
2158 | { | |
2159 | if (UseArray && pEnv->NeedWARPResourceArrayIndexingBugWorkaround()) | |
2160 | { | |
2161 | // As of Windows version 2004 (build 19041), there is a bug in D3D12 WARP rasterizer: | |
2162 | // Shader resource array indexing always references array element 0 when shaders are compiled | |
2163 | // with shader model 5.1. | |
2164 | // Use SM5.0 with old compiler as a workaround. | |
2165 | ShaderCI.ShaderCompiler = SHADER_COMPILER_DEFAULT; | |
2166 | ShaderCI.HLSLVersion = ShaderVersion{5, 0}; | |
2167 | } | |
2168 | else | |
2169 | { | |
2170 | ShaderCI.ShaderCompiler = pEnv->GetDefaultCompiler(ShaderCI.SourceLanguage); | |
2171 | } | |
2172 | }; | |
2165 | 2173 | |
2166 | 2174 | RefCntAutoPtr<IShader> pVS; |
2167 | 2175 | { |
2191 | 2199 | { |
2192 | 2200 | ShaderCI.Source = UseArray ? HLSL::DrawTest_VSFormattedBufferArray.c_str() : HLSL::DrawTest_VSFormattedBuffers.c_str(); |
2193 | 2201 | } |
2194 | ShaderCI.ShaderCompiler = pEnv->GetDefaultCompiler(ShaderCI.SourceLanguage); | |
2202 | SelectShaderCompiler(ShaderCI); | |
2195 | 2203 | pDevice->CreateShader(ShaderCI, &pVS); |
2196 | 2204 | ASSERT_NE(pVS, nullptr); |
2197 | 2205 | } |
2199 | 2207 | RefCntAutoPtr<IShader> pPS; |
2200 | 2208 | { |
2201 | 2209 | ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL; |
2202 | ShaderCI.ShaderCompiler = pEnv->GetDefaultCompiler(ShaderCI.SourceLanguage); | |
2203 | 2210 | ShaderCI.Desc.ShaderType = SHADER_TYPE_PIXEL; |
2204 | 2211 | ShaderCI.EntryPoint = "main"; |
2205 | 2212 | ShaderCI.Desc.Name = "Draw command test structured buffers - PS"; |
2206 | 2213 | ShaderCI.Source = HLSL::DrawTest_PS.c_str(); |
2214 | SelectShaderCompiler(ShaderCI); | |
2207 | 2215 | pDevice->CreateShader(ShaderCI, &pPS); |
2208 | 2216 | ASSERT_NE(pPS, nullptr); |
2209 | 2217 | } |
1710 | 1710 | Macros.AddShaderMacro("RWSTRUCT_BUFFERS_NONUNIFORM_INDEXING", UAVBufferNonUniformIndexing ? 1 : 0); |
1711 | 1711 | Macros.AddShaderMacro("RWFMT_BUFFERS_NONUNIFORM_INDEXING", UAVBufferNonUniformIndexing ? 1 : 0); |
1712 | 1712 | |
1713 | if (pEnv->NeedWARPResourceArrayIndexingBugWorkaround()) | |
1714 | { | |
1715 | // Constant buffer indexing does not work properly in D3D12 WARP - only the 0th element is accessed correctly | |
1716 | Macros.AddShaderMacro("USE_D3D12_WARP_BUG_WORKAROUND", 1); | |
1717 | } | |
1718 | ||
1713 | 1719 | if (IsGLSL) |
1714 | 1720 | Macros.AddShaderMacro("float4", "vec4"); |
1715 | 1721 | for (Uint32 i = 0; i < TexArraySize; ++i) |