Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/d3d11/tests/d3d11.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 41afdf951327..646d41fe1b0f 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -1409,6 +1409,16 @@ static BOOL check_compute_shaders_via_sm4_support(ID3D11Device *device) return options.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x; }
+static BOOL check_viewport_array_index_from_any_shader_support(ID3D11Device *device) +{ + D3D11_FEATURE_DATA_D3D11_OPTIONS3 options; + + if (FAILED(ID3D11Device_CheckFeatureSupport(device, + D3D11_FEATURE_D3D11_OPTIONS3, &options, sizeof(options)))) + return FALSE; + return options.VPAndRTArrayIndexFromAnyShaderFeedingRasterizer; +} + static BOOL is_buffer(ID3D11Resource *resource) { D3D11_RESOURCE_DIMENSION dimension; @@ -9305,12 +9315,38 @@ static void test_layered_rendering(void) ID3D11RenderTargetView *rtv; ID3D11Texture2D *texture; ID3D11GeometryShader *gs; + ID3D11VertexShader *vs; ID3D11PixelShader *ps; ID3D11Device *device; ID3D11Buffer *cb; HRESULT hr; BOOL warp;
+ static const DWORD vs_code[] = + { +#if 0 + uint layer_offset; + + void main(float4 position : POSITION, + out float4 out_position : SV_POSITION, + out uint layer : SV_RenderTargetArrayIndex) + { + out_position = position; + layer = layer_offset; + } +#endif + 0x43425844, 0x71f7b9cd, 0x2ab8c713, 0x53e77663, 0x54a9ba68, 0x00000001, 0x00000158, 0x00000004, + 0x00000030, 0x00000064, 0x000000cc, 0x00000148, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, + 0x00000020, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x49534f50, 0x4e4f4954, + 0xababab00, 0x4e47534f, 0x00000060, 0x00000002, 0x00000008, 0x00000038, 0x00000000, 0x00000001, + 0x00000003, 0x00000000, 0x0000000f, 0x00000044, 0x00000000, 0x00000004, 0x00000001, 0x00000001, + 0x00000e01, 0x505f5653, 0x5449534f, 0x004e4f49, 0x525f5653, 0x65646e65, 0x72615472, 0x41746567, + 0x79617272, 0x65646e49, 0xabab0078, 0x52444853, 0x00000074, 0x00010040, 0x0000001d, 0x04000059, + 0x00208e46, 0x00000000, 0x00000001, 0x0300005f, 0x001010f2, 0x00000000, 0x04000067, 0x001020f2, + 0x00000000, 0x00000001, 0x04000067, 0x00102012, 0x00000001, 0x00000004, 0x05000036, 0x001020f2, + 0x00000000, 0x00101e46, 0x00000000, 0x06000036, 0x00102012, 0x00000001, 0x0020800a, 0x00000000, + 0x00000000, 0x0100003e, 0x30494653, 0x00000008, 0x00002000, 0x00000000, + }; static const DWORD gs_5_code[] = { #if 0 @@ -9442,6 +9478,7 @@ static void test_layered_rendering(void) {4.0f, 1.0f}, {4.0f, 3.0f}, {3.0f, 7.0f}, {5.0f, 1.0f}, {5.0f, 3.0f}, {3.0f, 6.0f}, {6.0f, 1.0f}, {6.0f, 3.0f}, {3.0f, 5.0f}, {7.0f, 1.0f}, {7.0f, 3.0f}, {3.0f, 4.0f}, }; + static const struct vec4 vs_expected_value = {1.0f, 42.0f};
if (!init_test_context(&test_context, NULL)) return; @@ -9453,6 +9490,7 @@ static void test_layered_rendering(void)
memset(&constant, 0, sizeof(constant)); cb = create_buffer(device, D3D11_BIND_CONSTANT_BUFFER, sizeof(constant), &constant); + ID3D11DeviceContext_VSSetConstantBuffers(context, 0, 1, &cb); ID3D11DeviceContext_GSSetConstantBuffers(context, 0, 1, &cb); ID3D11DeviceContext_PSSetConstantBuffers(context, 0, 1, &cb);
@@ -9556,6 +9594,35 @@ static void test_layered_rendering(void) check_texture_sub_resource_vec4(texture, i, NULL, &expected_values[i], 1); }
+ /* layered rendering without GS */ + if (!check_viewport_array_index_from_any_shader_support(device)) + { + hr = ID3D11Device_CreateVertexShader(device, vs_code, sizeof(vs_code), NULL, &vs); + todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); + if (SUCCEEDED(hr)) + ID3D11VertexShader_Release(vs); + skip("Viewport array index not supported in vertex shaders.\n"); + goto done; + } + + ID3D11DeviceContext_GSSetShader(context, NULL, NULL, 0); + + constant.layer_offset = 1; + constant.draw_id = 42; + ID3D11DeviceContext_UpdateSubresource(context, (ID3D11Resource *)cb, 0, NULL, &constant, 0, 0); + rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; + U(rtv_desc).Texture2DArray.MipSlice = 0; + U(rtv_desc).Texture2DArray.FirstArraySlice = 0; + U(rtv_desc).Texture2DArray.ArraySize = ~0u; + hr = ID3D11Device_CreateRenderTargetView(device, (ID3D11Resource *)texture, &rtv_desc, &rtv); + ok(hr == S_OK, "Failed to create render target view, hr %#x.\n", hr); + ID3D11DeviceContext_OMSetRenderTargets(context, 1, &rtv, NULL); + draw_quad_vs(&test_context, vs_code, sizeof(vs_code)); + check_texture_sub_resource_vec4(texture, + constant.layer_offset * texture_desc.MipLevels, NULL, &vs_expected_value, 1); + ID3D11RenderTargetView_Release(rtv); + +done: ID3D11Texture2D_Release(texture);
ID3D11Buffer_Release(cb);
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=42743
Your paranoid android.
=== wvistau64 (32 bit Windows report) ===
d3d11: d3d11.c:5566: Test failed: Got unexpected IAVertices count: 0. d3d11.c:5567: Test failed: Got unexpected IAPrimitives count: 0. d3d11.c:5568: Test failed: Got unexpected VSInvocations count: 0. d3d11.c:5571: Test failed: Got unexpected CInvocations count: 0. d3d11.c:5572: Test failed: Got unexpected CPrimitives count: 0.
=== debian9 (32 bit Wine report) ===
d3d11: Unhandled exception: page fault on read access to 0x3f800000 in 32-bit code (0x7ed60c5d).
=== debian9 (build log) ===