Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/d3d10core/tests/device.c | 219 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 219 insertions(+)
diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c
index 103b6705e342..9b1b89a653bb 100644
--- a/dlls/d3d10core/tests/device.c
+++ b/dlls/d3d10core/tests/device.c
@@ -14636,6 +14636,224 @@ static void test_generate_mips(void)
release_test_context(&test_context);
}
+static void test_alpha_to_coverage(void)
+{
+ struct ps_cb
+ {
+ struct vec2 top;
+ struct vec2 bottom;
+ float alpha[2];
+ float padding[2];
+ };
+
+ struct d3d10core_test_context test_context;
+ ID3D10Texture2D *render_targets[3];
+ D3D10_TEXTURE2D_DESC texture_desc;
+ ID3D10Texture2D *readback_texture;
+ ID3D10RenderTargetView *rtvs[3];
+ ID3D10BlendState *blend_state;
+ D3D10_BLEND_DESC blend_desc;
+ struct resource_readback rb;
+ UINT quality_level_count;
+ ID3D10PixelShader *ps;
+ struct ps_cb cb_data;
+ ID3D10Device *device;
+ ID3D10Buffer *cb;
+ unsigned int i;
+ HRESULT hr;
+ RECT rect;
+
+ static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ static const DWORD ps_code[] =
+ {
+#if 0
+ float2 top;
+ float2 bottom;
+ float alpha1;
+ float alpha2;
+
+ void main(float4 position : SV_Position,
+ out float4 target0 : SV_Target0,
+ out float4 target1 : SV_Target1,
+ out float4 target2 : SV_Target2)
+ {
+ float alpha = all(top <= position.xy) && all(position.xy <= bottom) ? 1.0f : 0.0f;
+ target0 = float4(0.0f, 1.0f, 0.0f, alpha);
+ target1 = float4(0.0f, 0.0f, 1.0f, alpha1);
+ target2 = float4(0.0f, 1.0f, 0.0f, alpha2);
+ }
+#endif
+ 0x43425844, 0x771ff802, 0xca927279, 0x5bdd75ae, 0xf53cb31b, 0x00000001, 0x00000264, 0x00000003,
+ 0x0000002c, 0x00000060, 0x000000c4, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
+ 0x00000000, 0x00000001, 0x00000003, 0x00000000, 0x0000030f, 0x505f5653, 0x7469736f, 0x006e6f69,
+ 0x4e47534f, 0x0000005c, 0x00000003, 0x00000008, 0x00000050, 0x00000000, 0x00000000, 0x00000003,
+ 0x00000000, 0x0000000f, 0x00000050, 0x00000001, 0x00000000, 0x00000003, 0x00000001, 0x0000000f,
+ 0x00000050, 0x00000002, 0x00000000, 0x00000003, 0x00000002, 0x0000000f, 0x545f5653, 0x65677261,
+ 0xabab0074, 0x52444853, 0x00000198, 0x00000040, 0x00000066, 0x04000059, 0x00208e46, 0x00000000,
+ 0x00000002, 0x04002064, 0x00101032, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, 0x00000000,
+ 0x03000065, 0x001020f2, 0x00000001, 0x03000065, 0x001020f2, 0x00000002, 0x02000068, 0x00000001,
+ 0x0800001d, 0x00100032, 0x00000000, 0x00101046, 0x00000000, 0x00208046, 0x00000000, 0x00000000,
+ 0x07000001, 0x00100012, 0x00000000, 0x0010001a, 0x00000000, 0x0010000a, 0x00000000, 0x0800001d,
+ 0x00100062, 0x00000000, 0x00208ba6, 0x00000000, 0x00000000, 0x00101106, 0x00000000, 0x07000001,
+ 0x00100022, 0x00000000, 0x0010002a, 0x00000000, 0x0010001a, 0x00000000, 0x07000001, 0x00100012,
+ 0x00000000, 0x0010001a, 0x00000000, 0x0010000a, 0x00000000, 0x07000001, 0x00102082, 0x00000000,
+ 0x0010000a, 0x00000000, 0x00004001, 0x3f800000, 0x08000036, 0x00102072, 0x00000000, 0x00004002,
+ 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x08000036, 0x00102072, 0x00000001, 0x00004002,
+ 0x00000000, 0x00000000, 0x3f800000, 0x00000000, 0x06000036, 0x00102082, 0x00000001, 0x0020800a,
+ 0x00000000, 0x00000001, 0x08000036, 0x00102072, 0x00000002, 0x00004002, 0x00000000, 0x3f800000,
+ 0x00000000, 0x00000000, 0x06000036, 0x00102082, 0x00000002, 0x0020801a, 0x00000000, 0x00000001,
+ 0x0100003e,
+ };
+ static const DWORD colors[] = {0xff00ff00, 0xbfff0000, 0x8000ff00};
+
+ if (!init_test_context(&test_context))
+ return;
+ device = test_context.device;
+
+ hr = ID3D10Device_CreatePixelShader(device, ps_code, sizeof(ps_code), &ps);
+ ok(SUCCEEDED(hr), "Failed to create pixel shader, hr %#x.\n", hr);
+ ID3D10Device_PSSetShader(device, ps);
+
+ memset(&blend_desc, 0, sizeof(blend_desc));
+ blend_desc.AlphaToCoverageEnable = TRUE;
+ for (i = 0; i < ARRAY_SIZE(blend_desc.RenderTargetWriteMask); ++i)
+ blend_desc.RenderTargetWriteMask[i] = D3D10_COLOR_WRITE_ENABLE_ALL;
+ hr = ID3D10Device_CreateBlendState(device, &blend_desc, &blend_state);
+ ok(SUCCEEDED(hr), "Failed to create blend state, hr %#x.\n", hr);
+ ID3D10Device_OMSetBlendState(device, blend_state, NULL, D3D10_DEFAULT_SAMPLE_MASK);
+
+ render_targets[0] = test_context.backbuffer;
+ rtvs[0] = test_context.backbuffer_rtv;
+ for (i = 1; i < ARRAY_SIZE(render_targets); ++i)
+ {
+ ID3D10Texture2D_GetDesc(test_context.backbuffer, &texture_desc);
+ hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &render_targets[i]);
+ ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
+ hr = ID3D10Device_CreateRenderTargetView(device,
+ (ID3D10Resource *)render_targets[i], NULL, &rtvs[i]);
+ ok(SUCCEEDED(hr), "Failed to create render target view, hr %#x.\n", hr);
+ }
+ ID3D10Device_OMSetRenderTargets(device, ARRAY_SIZE(rtvs), rtvs, NULL);
+
+ cb_data.top.x = cb_data.top.y = 0.0f;
+ cb_data.bottom.x = cb_data.bottom.y = 200.0f;
+ cb_data.alpha[0] = 0.75;
+ cb_data.alpha[1] = 0.5f;
+ cb = create_buffer(device, D3D10_BIND_CONSTANT_BUFFER, sizeof(cb_data), &cb_data);
+ ID3D10Device_PSSetConstantBuffers(device, 0, 1, &cb);
+
+ for (i = 0; i < ARRAY_SIZE(rtvs); ++i)
+ ID3D10Device_ClearRenderTargetView(device, rtvs[i], white);
+ draw_quad(&test_context);
+ for (i = 0; i < ARRAY_SIZE(render_targets); ++i)
+ {
+ DWORD expected_color;
+
+ assert(i < ARRAY_SIZE(colors));
+ expected_color = colors[i];
+ get_texture_readback(render_targets[i], 0, &rb);
+ SetRect(&rect, 0, 0, 200, 200);
+ check_readback_data_color(&rb, &rect, expected_color, 1);
+ SetRect(&rect, 200, 0, 640, 200);
+ todo_wine
+ check_readback_data_color(&rb, &rect, 0xffffffff, 1);
+ SetRect(&rect, 0, 200, 640, 480);
+ todo_wine
+ check_readback_data_color(&rb, &rect, 0xffffffff, 1);
+ release_resource_readback(&rb);
+
+ if (i > 0)
+ ID3D10Texture2D_Release(render_targets[i]);
+ render_targets[i] = NULL;
+ }
+
+ ID3D10Texture2D_GetDesc(test_context.backbuffer, &texture_desc);
+ texture_desc.Format = DXGI_FORMAT_R16G16_UNORM;
+ hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &render_targets[0]);
+ ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
+ hr = ID3D10Device_CreateRenderTargetView(device,
+ (ID3D10Resource *)render_targets[0], NULL, &rtvs[0]);
+ ok(SUCCEEDED(hr), "Failed to create rendertarget view, hr %#x.\n", hr);
+ ID3D10Device_OMSetRenderTargets(device, ARRAY_SIZE(rtvs), rtvs, NULL);
+
+ ID3D10Device_ClearRenderTargetView(device, rtvs[0], white);
+ draw_quad(&test_context);
+ get_texture_readback(render_targets[0], 0, &rb);
+ SetRect(&rect, 0, 0, 200, 200);
+ check_readback_data_color(&rb, &rect, 0xffff0000, 1);
+ SetRect(&rect, 200, 0, 640, 200);
+ todo_wine
+ check_readback_data_color(&rb, &rect, 0xffffffff, 1);
+ SetRect(&rect, 0, 200, 640, 480);
+ todo_wine
+ check_readback_data_color(&rb, &rect, 0xffffffff, 1);
+ release_resource_readback(&rb);
+
+ ID3D10Texture2D_Release(render_targets[0]);
+ for (i = 0; i < ARRAY_SIZE(rtvs); ++i)
+ ID3D10RenderTargetView_Release(rtvs[i]);
+
+ ID3D10Texture2D_GetDesc(test_context.backbuffer, &texture_desc);
+ hr = ID3D10Device_CheckMultisampleQualityLevels(device,
+ texture_desc.Format, 4, &quality_level_count);
+ if (FAILED(hr))
+ {
+ skip("4xMSAA not supported.\n");
+ goto done;
+ }
+ texture_desc.SampleDesc.Count = 4;
+ texture_desc.SampleDesc.Quality = 0;
+
+ for (i = 0; i < ARRAY_SIZE(render_targets); ++i)
+ {
+ hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &render_targets[i]);
+ ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
+ hr = ID3D10Device_CreateRenderTargetView(device,
+ (ID3D10Resource *)render_targets[i], NULL, &rtvs[i]);
+ ok(SUCCEEDED(hr), "Failed to create rendertarget view, hr %#x.\n", hr);
+ }
+ ID3D10Device_OMSetRenderTargets(device, ARRAY_SIZE(rtvs), rtvs, NULL);
+
+ for (i = 0; i < ARRAY_SIZE(rtvs); ++i)
+ ID3D10Device_ClearRenderTargetView(device, rtvs[i], white);
+ draw_quad(&test_context);
+ texture_desc.SampleDesc.Count = 1;
+ hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &readback_texture);
+ ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
+ for (i = 0; i < ARRAY_SIZE(render_targets); ++i)
+ {
+ DWORD expected_color;
+
+ assert(i < ARRAY_SIZE(colors));
+ expected_color = colors[i];
+
+ ID3D10Device_ResolveSubresource(device, (ID3D10Resource *)readback_texture, 0,
+ (ID3D10Resource *)render_targets[i], 0, texture_desc.Format);
+
+ get_texture_readback(readback_texture, 0, &rb);
+ SetRect(&rect, 0, 0, 200, 200);
+ check_readback_data_color(&rb, &rect, expected_color, 1);
+ SetRect(&rect, 200, 0, 640, 200);
+ check_readback_data_color(&rb, &rect, 0xffffffff, 1);
+ SetRect(&rect, 0, 200, 640, 480);
+ check_readback_data_color(&rb, &rect, 0xffffffff, 1);
+ release_resource_readback(&rb);
+ }
+ ID3D10Texture2D_Release(readback_texture);
+
+ for (i = 0; i < ARRAY_SIZE(render_targets); ++i)
+ {
+ ID3D10Texture2D_Release(render_targets[i]);
+ ID3D10RenderTargetView_Release(rtvs[i]);
+ }
+
+done:
+ ID3D10Buffer_Release(cb);
+ ID3D10PixelShader_Release(ps);
+ ID3D10BlendState_Release(blend_state);
+ release_test_context(&test_context);
+}
+
START_TEST(device)
{
test_feature_level();
@@ -14716,4 +14934,5 @@ START_TEST(device)
test_clip_distance();
test_combined_clip_and_cull_distances();
test_generate_mips();
+ test_alpha_to_coverage();
}
--
2.13.6