Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- I don't know if this is the best way to test dynamic map patterns, but it ended up being useful enough when touching mapping code.
dlls/d3d11/tests/d3d11.c | 95 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 67551ac3ca0..d30918a0ad1 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -33896,6 +33896,100 @@ static void test_constant_buffer_offset(void) release_test_context(&test_context); }
+static void fill_dynamic_vb_quad(const D3D11_MAPPED_SUBRESOURCE *map_desc, unsigned int x, unsigned int y) +{ + struct vec3 *quad = (struct vec3 *)map_desc->pData + 4 * x; + + memset(quad, 0, 4 * sizeof(*quad)); + + quad[0].x = quad[1].x = -1.0f + 0.01f * x; + quad[2].x = quad[3].x = -1.0f + 0.01f * (x + 1); + + quad[0].y = quad[2].y = -1.0f + 0.01f * y; + quad[1].y = quad[3].y = -1.0f + 0.01f * (y + 1); +} + +/* Stress-test dynamic maps, to ensure that we are applying the correct + * synchronization guarantees. */ +static void test_dynamic_map_synchronization(void) +{ + static const struct vec4 green = {0.0f, 1.0f, 0.0f, 1.0f}; + static const struct vec4 red = {1.0f, 0.0f, 0.0f, 1.0f}; + ID3D11DeviceContext *immediate, *deferred; + struct d3d11_test_context test_context; + D3D11_BUFFER_DESC buffer_desc = {0}; + D3D11_MAPPED_SUBRESOURCE map_desc; + ID3D11CommandList *list; + ID3D11Device *device; + unsigned int x, y; + HRESULT hr; + + if (!init_test_context(&test_context, NULL)) + return; + device = test_context.device; + immediate = test_context.immediate_context; + + hr = ID3D11Device_CreateDeferredContext(device, 0, &deferred); + ok(hr == S_OK, "Failed to create deferred context, hr %#x.\n", hr); + + buffer_desc.ByteWidth = 200 * 4 * sizeof(struct vec3); + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + hr = ID3D11Device_CreateBuffer(device, &buffer_desc, NULL, &test_context.vb); + ok(hr == S_OK, "Failed to create vertex buffer, hr %#x.\n", hr); + + ID3D11DeviceContext_ClearRenderTargetView(immediate, test_context.backbuffer_rtv, &red.x); + + for (y = 0; y < 200; ++y) + { + if (y % 2) + { + hr = ID3D11DeviceContext_Map(immediate, (ID3D11Resource *)test_context.vb, + 0, D3D11_MAP_WRITE_DISCARD, 0, &map_desc); + ok(hr == S_OK, "Failed to map buffer, hr %#x.\n", hr); + + fill_dynamic_vb_quad(&map_desc, 0, y); + + ID3D11DeviceContext_Unmap(immediate, (ID3D11Resource *)test_context.vb, 0); + draw_color_quad(&test_context, &green); + } + else + { + hr = ID3D11DeviceContext_Map(deferred, (ID3D11Resource *)test_context.vb, + 0, D3D11_MAP_WRITE_DISCARD, 0, &map_desc); + ok(hr == S_OK, "Failed to map buffer, hr %#x.\n", hr); + + fill_dynamic_vb_quad(&map_desc, 0, y); + + ID3D11DeviceContext_Unmap(deferred, (ID3D11Resource *)test_context.vb, 0); + + hr = ID3D11DeviceContext_FinishCommandList(deferred, FALSE, &list); + ok(hr == S_OK, "Failed to record command list, hr %#x.\n", hr); + ID3D11DeviceContext_ExecuteCommandList(immediate, list, TRUE); + ID3D11CommandList_Release(list); + draw_color_quad(&test_context, &green); + } + + for (x = 1; x < 200; ++x) + { + hr = ID3D11DeviceContext_Map(immediate, (ID3D11Resource *)test_context.vb, + 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &map_desc); + ok(hr == S_OK, "Failed to map buffer, hr %#x.\n", hr); + + fill_dynamic_vb_quad(&map_desc, x, y); + + ID3D11DeviceContext_Unmap(immediate, (ID3D11Resource *)test_context.vb, 0); + ID3D11DeviceContext_Draw(immediate, 4, x * 4); + } + } + + check_texture_color(test_context.backbuffer, 0xff00ff00, 0); + + ID3D11DeviceContext_Release(deferred); + release_test_context(&test_context); +} + START_TEST(d3d11) { unsigned int argc, i; @@ -34072,6 +34166,7 @@ START_TEST(d3d11) queue_test(test_unbound_streams); queue_test(test_texture_compressed_3d); queue_test(test_constant_buffer_offset); + queue_test(test_dynamic_map_synchronization);
run_queued_tests(); }
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/d3d10core/tests/d3d10core.c | 67 ++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+)
diff --git a/dlls/d3d10core/tests/d3d10core.c b/dlls/d3d10core/tests/d3d10core.c index c4717b2b39a..dd1288befb8 100644 --- a/dlls/d3d10core/tests/d3d10core.c +++ b/dlls/d3d10core/tests/d3d10core.c @@ -19200,6 +19200,72 @@ static void test_texture_compressed_3d(void) release_test_context(&test_context); }
+static void fill_dynamic_vb_quad(void *data, unsigned int x, unsigned int y) +{ + struct vec3 *quad = (struct vec3 *)data + 4 * x; + + memset(quad, 0, 4 * sizeof(*quad)); + + quad[0].x = quad[1].x = -1.0f + 0.01f * x; + quad[2].x = quad[3].x = -1.0f + 0.01f * (x + 1); + + quad[0].y = quad[2].y = -1.0f + 0.01f * y; + quad[1].y = quad[3].y = -1.0f + 0.01f * (y + 1); +} + +/* Stress-test dynamic maps, to ensure that we are applying the correct + * synchronization guarantees. */ +static void test_dynamic_map_synchronization(void) +{ + static const struct vec4 green = {0.0f, 1.0f, 0.0f, 1.0f}; + static const struct vec4 red = {1.0f, 0.0f, 0.0f, 1.0f}; + struct d3d10core_test_context test_context; + D3D10_BUFFER_DESC buffer_desc = {0}; + ID3D10Device *device; + unsigned int x, y; + HRESULT hr; + void *data; + + if (!init_test_context(&test_context)) + return; + device = test_context.device; + + buffer_desc.ByteWidth = 200 * 4 * sizeof(struct vec3); + buffer_desc.Usage = D3D10_USAGE_DYNAMIC; + buffer_desc.BindFlags = D3D10_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; + hr = ID3D10Device_CreateBuffer(device, &buffer_desc, NULL, &test_context.vb); + ok(hr == S_OK, "Failed to create vertex buffer, hr %#x.\n", hr); + + ID3D10Device_ClearRenderTargetView(device, test_context.backbuffer_rtv, &red.x); + + for (y = 0; y < 200; ++y) + { + hr = ID3D10Buffer_Map(test_context.vb, D3D10_MAP_WRITE_DISCARD, 0, &data); + ok(hr == S_OK, "Failed to map buffer, hr %#x.\n", hr); + + fill_dynamic_vb_quad(data, 0, y); + + ID3D10Buffer_Unmap(test_context.vb); + draw_color_quad(&test_context, &green); + + for (x = 1; x < 200; ++x) + { + hr = ID3D10Buffer_Map(test_context.vb, D3D10_MAP_WRITE_NO_OVERWRITE, 0, &data); + ok(hr == S_OK, "Failed to map buffer, hr %#x.\n", hr); + + fill_dynamic_vb_quad(data, x, y); + + ID3D10Buffer_Unmap(test_context.vb); + ID3D10Device_Draw(device, 4, x * 4); + } + } + + check_texture_color(test_context.backbuffer, 0xff00ff00, 0); + + release_test_context(&test_context); +} + START_TEST(d3d10core) { unsigned int argc, i; @@ -19328,6 +19394,7 @@ START_TEST(d3d10core) queue_test(test_dual_source_blend); queue_test(test_unbound_streams); queue_test(test_texture_compressed_3d); + queue_test(test_dynamic_map_synchronization);
run_queued_tests();
Hi,
While running your changed tests, 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=98797
Your paranoid android.
=== w10pro64 (64 bit report) ===
d3d10core: d3d10core.c:4768: Test failed: Got unexpected IAVertices count: 0. d3d10core.c:4769: Test failed: Got unexpected IAPrimitives count: 0. d3d10core.c:4770: Test failed: Got unexpected VSInvocations count: 0. d3d10core.c:4773: Test failed: Got unexpected CInvocations count: 0. d3d10core.c:4774: Test failed: Got unexpected CPrimitives count: 0.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/d3d9/tests/visual.c | 108 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index 06aef461b81..727eccaf0b1 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -26918,6 +26918,113 @@ static void test_sample_mask(void) DestroyWindow(window); }
+struct dynamic_vb_vertex +{ + struct vec3 position; + DWORD diffuse; +}; + +static void fill_dynamic_vb_quad(struct dynamic_vb_vertex *quad, unsigned int x, unsigned int y) +{ + unsigned int i; + + memset(quad, 0, 4 * sizeof(*quad)); + + quad[0].position.x = quad[1].position.x = -1.0f + 0.01f * x; + quad[2].position.x = quad[3].position.x = -1.0f + 0.01f * (x + 1); + + quad[0].position.y = quad[2].position.y = -1.0f + 0.01f * y; + quad[1].position.y = quad[3].position.y = -1.0f + 0.01f * (y + 1); + + for (i = 0; i < 4; ++i) + quad[i].diffuse = 0xff00ff00; +} + +static void test_dynamic_map_synchronization(void) +{ + IDirect3DVertexBuffer9 *buffer; + IDirect3DDevice9 *device; + IDirect3DSurface9 *rt; + unsigned int x, y; + IDirect3D9 *d3d; + ULONG refcount; + HWND window; + HRESULT hr; + void *data; + + window = create_window(); + d3d = Direct3DCreate9(D3D_SDK_VERSION); + ok(!!d3d, "Failed to create a D3D object.\n"); + if (!(device = create_device(d3d, window, window, TRUE))) + { + skip("Failed to create a D3D device, skipping tests.\n"); + IDirect3D9_Release(d3d); + DestroyWindow(window); + return; + } + + hr = IDirect3DDevice9_CreateVertexBuffer(device, 200 * 4 * sizeof(struct dynamic_vb_vertex), + D3DUSAGE_DYNAMIC, D3DFVF_XYZ, D3DPOOL_DEFAULT, &buffer, NULL); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff0000, 0.0f, 0); + ok(hr == D3D_OK, "Failed to clear, hr %#x.\n", hr); + + hr = IDirect3DDevice9_BeginScene(device); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice9_SetStreamSource(device, 0, buffer, 0, sizeof(struct dynamic_vb_vertex)); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_LIGHTING, FALSE); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ZENABLE, FALSE); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + for (y = 0; y < 200; ++y) + { + hr = IDirect3DVertexBuffer9_Lock(buffer, 0, 0, &data, D3DLOCK_DISCARD); + ok(hr == D3D_OK, "Failed to map buffer, hr %#x.\n", hr); + + fill_dynamic_vb_quad(data, 0, y); + + hr = IDirect3DVertexBuffer9_Unlock(buffer); + ok(hr == D3D_OK, "Failed to map buffer, hr %#x.\n", hr); + + hr = IDirect3DDevice9_DrawPrimitive(device, D3DPT_TRIANGLESTRIP, 0, 2); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + for (x = 1; x < 200; ++x) + { + hr = IDirect3DVertexBuffer9_Lock(buffer, 4 * sizeof(struct dynamic_vb_vertex) * x, + 4 * sizeof(struct dynamic_vb_vertex), &data, D3DLOCK_NOOVERWRITE); + ok(hr == D3D_OK, "Failed to map buffer, hr %#x.\n", hr); + + fill_dynamic_vb_quad(data, x, y); + + hr = IDirect3DVertexBuffer9_Unlock(buffer); + ok(hr == D3D_OK, "Failed to map buffer, hr %#x.\n", hr); + + hr = IDirect3DDevice9_DrawPrimitive(device, D3DPT_TRIANGLESTRIP, 4 * x, 2); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + } + } + + hr = IDirect3DDevice9_GetRenderTarget(device, 0, &rt); + ok(hr == S_OK, "Failed to get render target, hr %#x.\n", hr); + check_rt_color(rt, 0x0000ff00); + IDirect3DSurface9_Release(rt); + + hr = IDirect3DDevice9_EndScene(device); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + IDirect3DVertexBuffer9_Release(buffer); + refcount = IDirect3DDevice9_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + IDirect3D9_Release(d3d); + DestroyWindow(window); +} + START_TEST(visual) { D3DADAPTER_IDENTIFIER9 identifier; @@ -27066,4 +27173,5 @@ START_TEST(visual) test_sample_attached_rendertarget(); test_alpha_to_coverage(); test_sample_mask(); + test_dynamic_map_synchronization(); }
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/d3d8/tests/visual.c | 136 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+)
diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c index eeee0eb629f..1856415d944 100644 --- a/dlls/d3d8/tests/visual.c +++ b/dlls/d3d8/tests/visual.c @@ -263,6 +263,34 @@ static void check_rect(struct surface_readback *rb, RECT r, const char *message) } }
+#define check_rt_color(a, b) check_rt_color_(__LINE__, a, b) +static void check_rt_color_(unsigned int line, IDirect3DSurface8 *rt, D3DCOLOR expected_color) +{ + D3DCOLOR color = 0xdeadbeef; + struct surface_readback rb; + D3DSURFACE_DESC desc; + unsigned int x, y; + HRESULT hr; + + hr = IDirect3DSurface8_GetDesc(rt, &desc); + ok_(__FILE__, line)(hr == S_OK, "Failed to get surface desc, hr %#x.\n", hr); + + get_rt_readback(rt, &rb); + for (y = 0; y < desc.Height; ++y) + { + for (x = 0; x < desc.Width; ++x) + { + color = get_readback_color(&rb, x, y) & 0x00ffffff; + if (color != expected_color) + break; + } + if (color != expected_color) + break; + } + release_surface_readback(&rb); + ok_(__FILE__, line)(color == expected_color, "Got unexpected color 0x%08x.\n", color); +} + static IDirect3DDevice8 *create_device(IDirect3D8 *d3d, HWND device_window, HWND focus_window, BOOL windowed) { D3DPRESENT_PARAMETERS present_parameters = {0}; @@ -11157,6 +11185,113 @@ static void test_sample_mask(void) DestroyWindow(window); }
+struct dynamic_vb_vertex +{ + struct vec3 position; + DWORD diffuse; +}; + +static void fill_dynamic_vb_quad(struct dynamic_vb_vertex *quad, unsigned int x, unsigned int y) +{ + unsigned int i; + + memset(quad, 0, 4 * sizeof(*quad)); + + quad[0].position.x = quad[1].position.x = -1.0f + 0.01f * x; + quad[2].position.x = quad[3].position.x = -1.0f + 0.01f * (x + 1); + + quad[0].position.y = quad[2].position.y = -1.0f + 0.01f * y; + quad[1].position.y = quad[3].position.y = -1.0f + 0.01f * (y + 1); + + for (i = 0; i < 4; ++i) + quad[i].diffuse = 0xff00ff00; +} + +static void test_dynamic_map_synchronization(void) +{ + IDirect3DVertexBuffer8 *buffer; + IDirect3DDevice8 *device; + IDirect3DSurface8 *rt; + unsigned int x, y; + IDirect3D8 *d3d; + ULONG refcount; + HWND window; + HRESULT hr; + BYTE *data; + + window = create_window(); + d3d = Direct3DCreate8(D3D_SDK_VERSION); + ok(!!d3d, "Failed to create a D3D object.\n"); + if (!(device = create_device(d3d, window, window, TRUE))) + { + skip("Failed to create a D3D device, skipping tests.\n"); + IDirect3D8_Release(d3d); + DestroyWindow(window); + return; + } + + hr = IDirect3DDevice8_CreateVertexBuffer(device, 200 * 4 * sizeof(struct dynamic_vb_vertex), + D3DUSAGE_DYNAMIC, D3DFVF_XYZ, D3DPOOL_DEFAULT, &buffer); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff0000, 0.0f, 0); + ok(hr == D3D_OK, "Failed to clear, hr %#x.\n", hr); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice8_SetStreamSource(device, 0, buffer, sizeof(struct dynamic_vb_vertex)); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_LIGHTING, FALSE); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_ZENABLE, FALSE); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice8_SetVertexShader(device, D3DFVF_XYZ | D3DFVF_DIFFUSE); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + for (y = 0; y < 200; ++y) + { + hr = IDirect3DVertexBuffer8_Lock(buffer, 0, 0, &data, D3DLOCK_DISCARD); + ok(hr == D3D_OK, "Failed to map buffer, hr %#x.\n", hr); + + fill_dynamic_vb_quad((struct dynamic_vb_vertex *)data, 0, y); + + hr = IDirect3DVertexBuffer8_Unlock(buffer); + ok(hr == D3D_OK, "Failed to map buffer, hr %#x.\n", hr); + + hr = IDirect3DDevice8_DrawPrimitive(device, D3DPT_TRIANGLESTRIP, 0, 2); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + for (x = 1; x < 200; ++x) + { + hr = IDirect3DVertexBuffer8_Lock(buffer, 4 * sizeof(struct dynamic_vb_vertex) * x, + 4 * sizeof(struct dynamic_vb_vertex), &data, D3DLOCK_NOOVERWRITE); + ok(hr == D3D_OK, "Failed to map buffer, hr %#x.\n", hr); + + fill_dynamic_vb_quad((struct dynamic_vb_vertex *)data, x, y); + + hr = IDirect3DVertexBuffer8_Unlock(buffer); + ok(hr == D3D_OK, "Failed to map buffer, hr %#x.\n", hr); + + hr = IDirect3DDevice8_DrawPrimitive(device, D3DPT_TRIANGLESTRIP, 4 * x, 2); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + } + } + + hr = IDirect3DDevice8_GetRenderTarget(device, &rt); + ok(hr == S_OK, "Failed to get render target, hr %#x.\n", hr); + check_rt_color(rt, 0x0000ff00); + IDirect3DSurface8_Release(rt); + + hr = IDirect3DDevice8_EndScene(device); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + + IDirect3DVertexBuffer8_Release(buffer); + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + IDirect3D8_Release(d3d); + DestroyWindow(window); +} + START_TEST(visual) { D3DADAPTER_IDENTIFIER8 identifier; @@ -11235,4 +11370,5 @@ START_TEST(visual) test_alphatest(); test_desktop_window(); if (0) test_sample_mask(); + test_dynamic_map_synchronization(); }
Hi,
While running your changed tests, 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=98799
Your paranoid android.
=== build (build log) ===
error: patch failed: dlls/d3d8/tests/visual.c:11235 Task: Patch failed to apply
=== debiant2 (build log) ===
error: patch failed: dlls/d3d8/tests/visual.c:11235 Task: Patch failed to apply
=== debiant2 (build log) ===
error: patch failed: dlls/d3d8/tests/visual.c:11235 Task: Patch failed to apply
On Mon, 27 Sept 2021 at 07:49, Zebediah Figura zfigura@codeweavers.com wrote:
@@ -11235,4 +11370,5 @@ START_TEST(visual) test_alphatest(); test_desktop_window(); if (0) test_sample_mask();
- test_dynamic_map_synchronization();
}
That doesn't quite match upstream.
Hi,
While running your changed tests, 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=98796
Your paranoid android.
=== w1064v1809 (32 bit report) ===
d3d11: d3d11.c:5920: Test failed: Got unexpected IAVertices count: 0. d3d11.c:5921: Test failed: Got unexpected IAPrimitives count: 0. d3d11.c:5922: Test failed: Got unexpected VSInvocations count: 0. d3d11.c:5925: Test failed: Got unexpected CInvocations count: 0. d3d11.c:5926: Test failed: Got unexpected CPrimitives count: 0.
=== w10pro64 (32 bit report) ===
d3d11: d3d11.c:5765: Test failed: Got unexpected query result 0x0000000000000000.
=== debiant2 (32 bit Arabic:Morocco report) ===
d3d11: d3d11.c:9770: Test failed: d3d11.c:15153: Test marked todo: Got hr 0 for WRITE_DISCARD.
=== debiant2 (32 bit Hebrew:Israel report) ===
d3d11: d3d11.c:9770: Test failed: Got hr 0 for WRITE.
=== debiant2 (32 bit Hindi:India report) ===
d3d11: d3d11.c:9770: Test failed: d3d11.c:15153: Test marked todo: Got hr 0 for WRITE_DISCARD. d3d11.c:9770: Test failed: d3d11.c:15222: Test marked todo: Test 60: Got unexpected color 0xffff00ff at (1, 1). d3d11.c:9770: Test failed: Got hr 0 for WRITE_DISCARD.
=== debiant2 (64 bit WoW report) ===
d3d11: d3d11.c:5926: Test failed: d3d11.c:6253: Test marked todo: Got unexpected PrimitivesStorageNeeded: 2.