Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d3d11/device.c | 14 +++----- dlls/d3d11/tests/d3d11.c | 73 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 12 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index a8251aad27..c6a7218fb7 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -991,14 +991,11 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_RSSetScissorRects(ID3D11De
TRACE("iface %p, rect_count %u, rects %p.\n", iface, rect_count, rects);
- if (rect_count > 1) - FIXME("Multiple scissor rects not implemented.\n"); - - if (!rect_count) + if (rect_count > WINED3D_MAX_VIEWPORTS) return;
wined3d_mutex_lock(); - wined3d_device_set_scissor_rects(device->wined3d_device, 1, rects); + wined3d_device_set_scissor_rects(device->wined3d_device, rect_count, rects); wined3d_mutex_unlock(); }
@@ -4185,14 +4182,11 @@ static void STDMETHODCALLTYPE d3d10_device_RSSetScissorRects(ID3D10Device1 *ifac
TRACE("iface %p, rect_count %u, rects %p.\n", iface, rect_count, rects);
- if (rect_count > 1) - FIXME("Multiple scissor rects not implemented.\n"); - - if (!rect_count) + if (rect_count > WINED3D_MAX_VIEWPORTS) return;
wined3d_mutex_lock(); - wined3d_device_set_scissor_rects(device->wined3d_device, 1, rects); + wined3d_device_set_scissor_rects(device->wined3d_device, rect_count, rects); wined3d_mutex_unlock(); }
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 82790932b1..2f4ce25638 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -10566,7 +10566,6 @@ static void test_clear_state(void) ID3D11DeviceContext_RSGetScissorRects(context, &count, tmp_rect); for (i = 0; i < D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ++i) { - todo_wine_if(!i) ok(!tmp_rect[i].left && !tmp_rect[i].top && !tmp_rect[i].right && !tmp_rect[i].bottom, "Got unexpected scissor rect %s in slot %u.\n", wine_dbgstr_rect(&tmp_rect[i]), i); @@ -26188,10 +26187,14 @@ static void test_multiple_viewports(void) }; static const struct vec4 expected_values[] = { - {0.0f, 1.0f}, {1.0f, 1.0f}, {0.0f, 2.0f}, {0.5f, 0.5f}, {0.5f, 0.5f}, + {0.0f, 1.0f}, {1.0f, 1.0f}, {0.0f, 2.0f}, {0.5f, 0.5f}, {0.5f, 0.5f}, {0.0f, 4.0f}, {0.5f, 0.5f}, {0.5f, 0.5f}, + {0.5f, 0.5f}, {0.0f, 6.0f}, {0.5f, 0.5f}, {1.0f, 6.0f}, {0.5f, 0.5f}, }; static const float clear_color[] = {0.5f, 0.5f, 0.0f, 0.0f}; + ID3D11RasterizerState *rasterizer_state; + D3D11_RASTERIZER_DESC rasterizer_desc; unsigned int count, i; + D3D11_RECT rects[2]; RECT rect; int width;
@@ -26280,6 +26283,72 @@ static void test_multiple_viewports(void) draw_quad(&test_context); check_texture_sub_resource_vec4(texture, 0, NULL, &expected_values[4], 1);
+ /* Two viewports, only first scissor rectangle set. */ + memset(&rasterizer_desc, 0, sizeof(rasterizer_desc)); + rasterizer_desc.FillMode = D3D11_FILL_SOLID; + rasterizer_desc.CullMode = D3D11_CULL_BACK; + rasterizer_desc.DepthClipEnable = TRUE; + rasterizer_desc.ScissorEnable = TRUE; + hr = ID3D11Device_CreateRasterizerState(device, &rasterizer_desc, &rasterizer_state); + ok(SUCCEEDED(hr), "Failed to create rasterizer state, hr %#x.\n", hr); + + ID3D11DeviceContext_RSSetState(context, rasterizer_state); + ID3D11RasterizerState_Release(rasterizer_state); + + ID3D11DeviceContext_ClearRenderTargetView(context, rtv, clear_color); + ID3D11DeviceContext_RSSetViewports(context, 2, vp); + + rects[0].left = 0; + rects[0].top = 0; + rects[0].right = width; + rects[0].bottom = texture_desc.Height / 2; + memset(&rects[1], 0, sizeof(*rects)); + ID3D11DeviceContext_RSSetScissorRects(context, 1, rects); + constant.draw_id = 4; + ID3D11DeviceContext_UpdateSubresource(context, (ID3D11Resource *)cb, 0, NULL, &constant, 0, 0); + draw_quad(&test_context); + + SetRect(&rect, 0, 0, width - 1, texture_desc.Height / 2 - 1); + check_texture_sub_resource_vec4(texture, 0, &rect, &expected_values[5], 1); + SetRect(&rect, 0, texture_desc.Height / 2, width - 1, texture_desc.Height - 1); + check_texture_sub_resource_vec4(texture, 0, &rect, &expected_values[6], 1); + SetRect(&rect, width, 0, 2 * width - 1, texture_desc.Height - 1); + check_texture_sub_resource_vec4(texture, 0, &rect, &expected_values[7], 1); + + /* Set scissor count to zero. */ + ID3D11DeviceContext_ClearRenderTargetView(context, rtv, clear_color); + ID3D11DeviceContext_RSSetScissorRects(context, 0, rects); + constant.draw_id = 5; + ID3D11DeviceContext_UpdateSubresource(context, (ID3D11Resource *)cb, 0, NULL, &constant, 0, 0); + draw_quad(&test_context); + SetRect(&rect, 0, 0, texture_desc.Width - 1, texture_desc.Height - 1); + check_texture_sub_resource_vec4(texture, 0, &rect, &expected_values[8], 1); + + /* Set both rectangles. */ + rects[0].left = 0; + rects[0].top = 0; + rects[0].right = width; + rects[0].bottom = texture_desc.Height / 2; + rects[1].left = width; + rects[1].top = 0; + rects[1].right = width * 2; + rects[1].bottom = texture_desc.Height / 2; + ID3D11DeviceContext_ClearRenderTargetView(context, rtv, clear_color); + ID3D11DeviceContext_RSSetScissorRects(context, 2, rects); + constant.draw_id = 6; + ID3D11DeviceContext_UpdateSubresource(context, (ID3D11Resource *)cb, 0, NULL, &constant, 0, 0); + draw_quad(&test_context); + + SetRect(&rect, 0, 0, width - 1, texture_desc.Height / 2 - 1); + check_texture_sub_resource_vec4(texture, 0, &rect, &expected_values[9], 1); + SetRect(&rect, 0, texture_desc.Height / 2, width - 1, texture_desc.Height - 1); + check_texture_sub_resource_vec4(texture, 0, &rect, &expected_values[10], 1); + + SetRect(&rect, width, 0, 2 * width - 1, texture_desc.Height / 2 - 1); + check_texture_sub_resource_vec4(texture, 0, &rect, &expected_values[11], 1); + SetRect(&rect, width, texture_desc.Height / 2, 2 * width - 1, texture_desc.Height - 1); + check_texture_sub_resource_vec4(texture, 0, &rect, &expected_values[12], 1); + /* Viewport count exceeding maximum value. */ ID3D11DeviceContext_RSSetViewports(context, 1, vp);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d3d11/device.c | 4 ++-- dlls/d3d9/device.c | 2 +- dlls/wined3d/device.c | 13 +++++++++---- dlls/wined3d/wined3d.spec | 2 +- include/wine/wined3d.h | 3 ++- 5 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index c6a7218fb7..d49f08b57a 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -2140,7 +2140,7 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_RSGetScissorRects(ID3D11De return;
wined3d_mutex_lock(); - wined3d_device_get_scissor_rect(device->wined3d_device, rects); + wined3d_device_get_scissor_rects(device->wined3d_device, NULL, rects); wined3d_mutex_unlock(); if (*rect_count > 1) memset(&rects[1], 0, (*rect_count - 1) * sizeof(*rects)); @@ -4943,7 +4943,7 @@ static void STDMETHODCALLTYPE d3d10_device_RSGetScissorRects(ID3D10Device1 *ifac return;
wined3d_mutex_lock(); - wined3d_device_get_scissor_rect(device->wined3d_device, rects); + wined3d_device_get_scissor_rects(device->wined3d_device, NULL, rects); wined3d_mutex_unlock(); if (*rect_count > 1) memset(&rects[1], 0, (*rect_count - 1) * sizeof(*rects)); diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index b73d974860..2134257543 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -2577,7 +2577,7 @@ static HRESULT WINAPI d3d9_device_GetScissorRect(IDirect3DDevice9Ex *iface, RECT TRACE("iface %p, rect %p.\n", iface, rect);
wined3d_mutex_lock(); - wined3d_device_get_scissor_rect(device->wined3d_device, rect); + wined3d_device_get_scissor_rects(device->wined3d_device, NULL, rect); wined3d_mutex_unlock();
return D3D_OK; diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index f412cbe88d..c04bd820f7 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2157,12 +2157,17 @@ void CDECL wined3d_device_set_scissor_rects(struct wined3d_device *device, unsig wined3d_cs_emit_set_scissor_rects(device->cs, rect_count, rects); }
-void CDECL wined3d_device_get_scissor_rect(const struct wined3d_device *device, RECT *rect) +void CDECL wined3d_device_get_scissor_rects(const struct wined3d_device *device, unsigned int *rect_count, RECT *rects) { - TRACE("device %p, rect %p.\n", device, rect); + unsigned int count; + + TRACE("device %p, rect_count %p, rects %p.\n", device, rect_count, rects);
- *rect = device->state.scissor_rects[0]; - TRACE("Returning rect %s.\n", wine_dbgstr_rect(rect)); + count = rect_count ? min(*rect_count, device->state.scissor_rect_count) : 1; + if (count && rects) + memcpy(rects, device->state.scissor_rects, count * sizeof(*rects)); + if (rect_count) + *rect_count = device->state.scissor_rect_count; }
void CDECL wined3d_device_set_vertex_declaration(struct wined3d_device *device, diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 21b2414bbe..357b76ebac 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -101,7 +101,7 @@ @ cdecl wined3d_device_get_render_state(ptr long) @ cdecl wined3d_device_get_rendertarget_view(ptr long) @ cdecl wined3d_device_get_sampler_state(ptr long long) -@ cdecl wined3d_device_get_scissor_rect(ptr ptr) +@ cdecl wined3d_device_get_scissor_rects(ptr ptr ptr) @ cdecl wined3d_device_get_software_vertex_processing(ptr) @ cdecl wined3d_device_get_stream_output(ptr long ptr) @ cdecl wined3d_device_get_stream_source(ptr long ptr ptr ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 6223706f57..13e83da626 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2304,7 +2304,8 @@ struct wined3d_rendertarget_view * __cdecl wined3d_device_get_rendertarget_view( unsigned int view_idx); DWORD __cdecl wined3d_device_get_sampler_state(const struct wined3d_device *device, UINT sampler_idx, enum wined3d_sampler_state state); -void __cdecl wined3d_device_get_scissor_rect(const struct wined3d_device *device, RECT *rect); +void __cdecl wined3d_device_get_scissor_rects(const struct wined3d_device *device, unsigned int *rect_count, + RECT *rect); BOOL __cdecl wined3d_device_get_software_vertex_processing(const struct wined3d_device *device); struct wined3d_buffer * __cdecl wined3d_device_get_stream_output(struct wined3d_device *device, UINT idx, UINT *offset);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d3d10core/tests/device.c | 13 ++++++------ dlls/d3d11/device.c | 40 +++++++++++++++++++---------------- dlls/d3d11/tests/d3d11.c | 6 +++--- dlls/d3dx10_43/tests/d3dx10.c | 15 ++++++------- 4 files changed, 38 insertions(+), 36 deletions(-)
diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c index ba0a914e7e..b2aaa0dc22 100644 --- a/dlls/d3d10core/tests/device.c +++ b/dlls/d3d10core/tests/device.c @@ -4924,7 +4924,7 @@ float4 main(float4 color : COLOR) : SV_TARGET ok(!tmp_dsv, "Got unexpected depth stencil view %p.\n", tmp_dsv);
ID3D10Device_RSGetScissorRects(device, &count, NULL); - todo_wine ok(!count, "Got unexpected scissor rect count %u.\n", count); + ok(!count, "Got unexpected scissor rect count %u.\n", count); memset(tmp_rect, 0x55, sizeof(tmp_rect)); count = D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ID3D10Device_RSGetScissorRects(device, &count, tmp_rect); @@ -5316,7 +5316,7 @@ float4 main(float4 color : COLOR) : SV_TARGET ID3D10DepthStencilView_Release(tmp_dsv);
ID3D10Device_RSGetScissorRects(device, &count, NULL); - todo_wine ok(count == D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE, + ok(count == D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE, "Got unexpected scissor rect count %u.\n", count); memset(tmp_rect, 0x55, sizeof(tmp_rect)); ID3D10Device_RSGetScissorRects(device, &count, tmp_rect); @@ -5455,16 +5455,15 @@ float4 main(float4 color : COLOR) : SV_TARGET ok(!tmp_dsv, "Got unexpected depth stencil view %p.\n", tmp_dsv);
ID3D10Device_RSGetScissorRects(device, &count, NULL); - todo_wine ok(!count, "Got unexpected scissor rect count %u.\n", count); + ok(!count, "Got unexpected scissor rect count %u.\n", count); memset(tmp_rect, 0x55, sizeof(tmp_rect)); count = D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ID3D10Device_RSGetScissorRects(device, &count, tmp_rect); for (i = 0; i < D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ++i) { - todo_wine_if(!i) - ok(!tmp_rect[i].left && !tmp_rect[i].top && !tmp_rect[i].right && !tmp_rect[i].bottom, - "Got unexpected scissor rect %s in slot %u.\n", - wine_dbgstr_rect(&tmp_rect[i]), i); + ok(!tmp_rect[i].left && !tmp_rect[i].top && !tmp_rect[i].right && !tmp_rect[i].bottom, + "Got unexpected scissor rect %s in slot %u.\n", + wine_dbgstr_rect(&tmp_rect[i]), i); } ID3D10Device_RSGetViewports(device, &count, NULL); ok(!count, "Got unexpected viewport count %u.\n", count); diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index d49f08b57a..538f4af88c 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -2127,23 +2127,25 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_RSGetScissorRects(ID3D11De UINT *rect_count, D3D11_RECT *rects) { struct d3d_device *device = device_from_immediate_ID3D11DeviceContext(iface); + unsigned int actual_count;
TRACE("iface %p, rect_count %p, rects %p.\n", iface, rect_count, rects);
+ if (!rect_count) + return; + + wined3d_mutex_lock(); + wined3d_device_get_scissor_rects(device->wined3d_device, &actual_count, rects); + wined3d_mutex_unlock(); + if (!rects) { - *rect_count = 1; + *rect_count = actual_count; return; }
- if (!*rect_count) - return; - - wined3d_mutex_lock(); - wined3d_device_get_scissor_rects(device->wined3d_device, NULL, rects); - wined3d_mutex_unlock(); - if (*rect_count > 1) - memset(&rects[1], 0, (*rect_count - 1) * sizeof(*rects)); + if (*rect_count > actual_count) + memset(&rects[actual_count], 0, (*rect_count - actual_count) * sizeof(*rects)); }
static void STDMETHODCALLTYPE d3d11_immediate_context_HSGetShaderResources(ID3D11DeviceContext *iface, @@ -4930,23 +4932,25 @@ static void STDMETHODCALLTYPE d3d10_device_RSGetViewports(ID3D10Device1 *iface, static void STDMETHODCALLTYPE d3d10_device_RSGetScissorRects(ID3D10Device1 *iface, UINT *rect_count, D3D10_RECT *rects) { struct d3d_device *device = impl_from_ID3D10Device(iface); + unsigned int actual_count;
TRACE("iface %p, rect_count %p, rects %p.\n", iface, rect_count, rects);
+ if (!rect_count) + return; + + wined3d_mutex_lock(); + wined3d_device_get_scissor_rects(device->wined3d_device, &actual_count, rects); + wined3d_mutex_unlock(); + if (!rects) { - *rect_count = 1; + *rect_count = actual_count; return; }
- if (!*rect_count) - return; - - wined3d_mutex_lock(); - wined3d_device_get_scissor_rects(device->wined3d_device, NULL, rects); - wined3d_mutex_unlock(); - if (*rect_count > 1) - memset(&rects[1], 0, (*rect_count - 1) * sizeof(*rects)); + if (*rect_count > actual_count) + memset(&rects[actual_count], 0, (*rect_count - actual_count) * sizeof(*rects)); }
static HRESULT STDMETHODCALLTYPE d3d10_device_GetDeviceRemovedReason(ID3D10Device1 *iface) diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 2f4ce25638..ba40ae5984 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -9811,7 +9811,7 @@ static void test_clear_state(void) }
ID3D11DeviceContext_RSGetScissorRects(context, &count, NULL); - todo_wine ok(!count, "Got unexpected scissor rect count %u.\n", count); + ok(!count, "Got unexpected scissor rect count %u.\n", count); memset(tmp_rect, 0x55, sizeof(tmp_rect)); count = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ID3D11DeviceContext_RSGetScissorRects(context, &count, tmp_rect); @@ -10340,7 +10340,7 @@ static void test_clear_state(void) ID3D11UnorderedAccessView_Release(tmp_uav[i]);
ID3D11DeviceContext_RSGetScissorRects(context, &count, NULL); - todo_wine ok(count == D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE, + ok(count == D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE, "Got unexpected scissor rect count %u.\n", count); memset(tmp_rect, 0x55, sizeof(tmp_rect)); ID3D11DeviceContext_RSGetScissorRects(context, &count, tmp_rect); @@ -10560,7 +10560,7 @@ static void test_clear_state(void) }
ID3D11DeviceContext_RSGetScissorRects(context, &count, NULL); - todo_wine ok(!count, "Got unexpected scissor rect count %u.\n", count); + ok(!count, "Got unexpected scissor rect count %u.\n", count); memset(tmp_rect, 0x55, sizeof(tmp_rect)); count = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ID3D11DeviceContext_RSGetScissorRects(context, &count, tmp_rect); diff --git a/dlls/d3dx10_43/tests/d3dx10.c b/dlls/d3dx10_43/tests/d3dx10.c index 0baba6550c..9c84a76e79 100644 --- a/dlls/d3dx10_43/tests/d3dx10.c +++ b/dlls/d3dx10_43/tests/d3dx10.c @@ -510,20 +510,19 @@ float4 main(float4 color : COLOR) : SV_TARGET ok(!tmp_dsv, "Got unexpected depth stencil view %p.\n", tmp_dsv);
ID3D10Device_RSGetScissorRects(device, &count, NULL); - todo_wine ok(count == D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE, + ok(count == D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE, "Got unexpected scissor rect count %u.\n", count); memset(tmp_rect, 0x55, sizeof(tmp_rect)); count = D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ID3D10Device_RSGetScissorRects(device, &count, tmp_rect); for (i = 0; i < D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ++i) { - todo_wine_if(i) - ok(tmp_rect[i].left == i - && tmp_rect[i].top == i * 2 - && tmp_rect[i].right == i + 1 - && tmp_rect[i].bottom == (i + 1) * 2, - "Got unexpected scissor rect %s in slot %u.\n", - wine_dbgstr_rect(&tmp_rect[i]), i); + ok(tmp_rect[i].left == i + && tmp_rect[i].top == i * 2 + && tmp_rect[i].right == i + 1 + && tmp_rect[i].bottom == (i + 1) * 2, + "Got unexpected scissor rect %s in slot %u.\n", + wine_dbgstr_rect(&tmp_rect[i]), i); } ID3D10Device_RSGetViewports(device, &count, NULL); ok(count == D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE,
On 24 April 2018 at 08:26, Nikolay Sivov nsivov@codeweavers.com wrote:
- /* Set scissor count to zero. */
- ID3D11DeviceContext_ClearRenderTargetView(context, rtv, clear_color);
- ID3D11DeviceContext_RSSetScissorRects(context, 0, rects);
- constant.draw_id = 5;
- ID3D11DeviceContext_UpdateSubresource(context, (ID3D11Resource *)cb, 0, NULL, &constant, 0, 0);
- draw_quad(&test_context);
- SetRect(&rect, 0, 0, texture_desc.Width - 1, texture_desc.Height - 1);
- check_texture_sub_resource_vec4(texture, 0, &rect, &expected_values[8], 1);
This fails for me on Windows:
d3d11.c:1137: Adapter: L"AMD Radeon HD 6310 Graphics", 1002:9802. d3d11.c:1560: Feature level 0xb000. d3d11.c:8135: Tests skipped: Some AMD drivers have a bug affecting the test. d3d11.c:15444: Compute shader support via SM4 0x1. d3d11.c:16843: Optional format 0x59 - display supported, feature level 0xa100. d3d11.c:16843: Optional format 0x59 - display supported, feature level 0xa000. d3d11.c:20243: Tests skipped: Feature level 11_0 required for unaligned UAV test. d3d11.c:20243: Tests skipped: Feature level 11_0 required for unaligned UAV test. d3d11.c:26267: Test failed: Got {0.00000000e+000, 5.00000000e+000, 0.00000000e+000, 0.00000000e+000}, expected {5.00000000e-001, 5.00000000e-001, 0.00000000e+000, 0.00000000e+000} at (0, 0), sub-resource 0. 0770:d3d11: 9358825 tests executed (0 marked as todo, 1 failure), 3 skipped.