d3d11/tests: Add test for face culling.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2016-07-27 23:33:45 +02:00 committed by Alexandre Julliard
parent 79dc5128c3
commit 0bcd9a5a4b
1 changed files with 186 additions and 45 deletions

View File

@ -1133,16 +1133,12 @@ static void draw_quad_(unsigned int line, struct d3d11_test_context *context)
0x0000000f, 0x0300005f, 0x001010f2, 0x00000000, 0x04000067, 0x001020f2, 0x00000000, 0x00000001, 0x0000000f, 0x0300005f, 0x001010f2, 0x00000000, 0x04000067, 0x001020f2, 0x00000000, 0x00000001,
0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000000, 0x0100003e, 0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000000, 0x0100003e,
}; };
static const struct static const struct vec2 quad[] =
{ {
struct vec2 position; {-1.0f, -1.0f},
} {-1.0f, 1.0f},
quad[] = { 1.0f, -1.0f},
{ { 1.0f, 1.0f},
{{-1.0f, -1.0f}},
{{-1.0f, 1.0f}},
{{ 1.0f, -1.0f}},
{{ 1.0f, 1.0f}},
}; };
ID3D11Device *device = context->device; ID3D11Device *device = context->device;
@ -6114,16 +6110,12 @@ static void test_multiple_render_targets(void)
0x3e4ccccd, 0x08000036, 0x001020f2, 0x00000003, 0x00004002, 0x00000000, 0x3e4ccccd, 0x3f000000, 0x3e4ccccd, 0x08000036, 0x001020f2, 0x00000003, 0x00004002, 0x00000000, 0x3e4ccccd, 0x3f000000,
0x3f800000, 0x0100003e, 0x3f800000, 0x0100003e,
}; };
static const struct static const struct vec2 quad[] =
{ {
struct vec2 position; {-1.0f, -1.0f},
} {-1.0f, 1.0f},
quad[] = { 1.0f, -1.0f},
{ { 1.0f, 1.0f},
{{-1.0f, -1.0f}},
{{-1.0f, 1.0f}},
{{ 1.0f, -1.0f}},
{{ 1.0f, 1.0f}},
}; };
static const float red[] = {1.0f, 0.0f, 0.0f, 1.0f}; static const float red[] = {1.0f, 0.0f, 0.0f, 1.0f};
@ -7572,16 +7564,12 @@ static void test_swapchain_flip(void)
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000 0x00000000, 0x00000000, 0x00000000
}; };
static const struct static const struct vec2 quad[] =
{ {
struct vec2 position; {-1.0f, -1.0f},
} {-1.0f, 1.0f},
quad[] = { 1.0f, -1.0f},
{ { 1.0f, 1.0f},
{{-1.0f, -1.0f}},
{{-1.0f, 1.0f}},
{{ 1.0f, -1.0f}},
{{ 1.0f, 1.0f}},
}; };
static const float red[] = {1.0f, 0.0f, 0.0f, 0.5f}; static const float red[] = {1.0f, 0.0f, 0.0f, 0.5f};
static const float green[] = {0.0f, 1.0f, 0.0f, 0.5f}; static const float green[] = {0.0f, 1.0f, 0.0f, 0.5f};
@ -8170,16 +8158,12 @@ float4 main(const ps_in v) : SV_TARGET
0x0000000f, 0x0100086a, 0x03001062, 0x001010f2, 0x00000001, 0x03000065, 0x001020f2, 0x00000000, 0x0000000f, 0x0100086a, 0x03001062, 0x001010f2, 0x00000001, 0x03000065, 0x001020f2, 0x00000000,
0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000001, 0x0100003e, 0x05000036, 0x001020f2, 0x00000000, 0x00101e46, 0x00000001, 0x0100003e,
}; };
static const struct static const struct vec2 quad[] =
{ {
struct vec2 position; {-1.0f, -1.0f},
} {-1.0f, 1.0f},
quad[] = { 1.0f, -1.0f},
{ { 1.0f, 1.0f},
{{-1.0f, -1.0f}},
{{-1.0f, 1.0f}},
{{ 1.0f, -1.0f}},
{{ 1.0f, 1.0f}},
}; };
static const struct static const struct
{ {
@ -8762,16 +8746,12 @@ static void test_input_assembler(void)
DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM,
DXGI_FORMAT_R10G10B10A2_UINT, DXGI_FORMAT_R10G10B10A2_UINT,
}; };
static const struct static const struct vec2 quad[] =
{ {
struct vec2 position; {-1.0f, -1.0f},
} {-1.0f, 1.0f},
quad[] = { 1.0f, -1.0f},
{ { 1.0f, 1.0f},
{{-1.0f, -1.0f}},
{{-1.0f, 1.0f}},
{{ 1.0f, -1.0f}},
{{ 1.0f, 1.0f}},
}; };
static const DWORD ps_code[] = static const DWORD ps_code[] =
{ {
@ -10025,6 +10005,166 @@ cleanup:
release_test_context(&test_context); release_test_context(&test_context);
} }
static void test_face_culling(void)
{
struct d3d11_test_context test_context;
D3D11_RASTERIZER_DESC rasterizer_desc;
ID3D11RasterizerState *state;
ID3D11DeviceContext *context;
ID3D11Buffer *cw_vb, *ccw_vb;
ID3D11Device *device;
BOOL broken_warp;
unsigned int i;
HRESULT hr;
static const struct vec4 red = {1.0f, 0.0f, 0.0f, 1.0f};
static const struct vec4 green = {0.0f, 1.0f, 0.0f, 1.0f};
static const DWORD ps_code[] =
{
#if 0
float4 main(uint front : SV_IsFrontFace) : SV_Target
{
return (front == ~0u) ? float4(0.0f, 1.0f, 0.0f, 1.0f) : float4(0.0f, 0.0f, 1.0f, 1.0f);
}
#endif
0x43425844, 0x92002fad, 0xc5c620b9, 0xe7a154fb, 0x78b54e63, 0x00000001, 0x00000128, 0x00000003,
0x0000002c, 0x00000064, 0x00000098, 0x4e475349, 0x00000030, 0x00000001, 0x00000008, 0x00000020,
0x00000000, 0x00000009, 0x00000001, 0x00000000, 0x00000101, 0x495f5653, 0x6f724673, 0x6146746e,
0xab006563, 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000,
0x00000003, 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x52444853, 0x00000088,
0x00000040, 0x00000022, 0x04000863, 0x00101012, 0x00000000, 0x00000009, 0x03000065, 0x001020f2,
0x00000000, 0x02000068, 0x00000001, 0x07000020, 0x00100012, 0x00000000, 0x0010100a, 0x00000000,
0x00004001, 0xffffffff, 0x0f000037, 0x001020f2, 0x00000000, 0x00100006, 0x00000000, 0x00004002,
0x00000000, 0x3f800000, 0x00000000, 0x3f800000, 0x00004002, 0x00000000, 0x00000000, 0x3f800000,
0x3f800000, 0x0100003e,
};
static const struct vec2 ccw_quad[] =
{
{-1.0f, 1.0f},
{-1.0f, -1.0f},
{ 1.0f, 1.0f},
{ 1.0f, -1.0f},
};
static const struct
{
D3D11_CULL_MODE cull_mode;
BOOL front_ccw;
BOOL expected_cw;
BOOL expected_ccw;
}
tests[] =
{
{D3D11_CULL_NONE, FALSE, TRUE, TRUE},
{D3D11_CULL_NONE, TRUE, TRUE, TRUE},
{D3D11_CULL_FRONT, FALSE, FALSE, TRUE},
{D3D11_CULL_FRONT, TRUE, TRUE, FALSE},
{D3D11_CULL_BACK, FALSE, TRUE, FALSE},
{D3D11_CULL_BACK, TRUE, FALSE, TRUE},
};
if (!init_test_context(&test_context, NULL))
return;
device = test_context.device;
context = test_context.immediate_context;
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, &red.x);
draw_color_quad(&test_context, &green);
check_texture_color(test_context.backbuffer, 0xff00ff00, 0);
cw_vb = test_context.vb;
ccw_vb = create_buffer(device, D3D11_BIND_VERTEX_BUFFER, sizeof(ccw_quad), ccw_quad);
test_context.vb = ccw_vb;
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, &red.x);
draw_color_quad(&test_context, &green);
check_texture_color(test_context.backbuffer, 0xff0000ff, 0);
rasterizer_desc.FillMode = D3D11_FILL_SOLID;
rasterizer_desc.CullMode = D3D11_CULL_BACK;
rasterizer_desc.FrontCounterClockwise = FALSE;
rasterizer_desc.DepthBias = 0;
rasterizer_desc.DepthBiasClamp = 0.0f;
rasterizer_desc.SlopeScaledDepthBias = 0.0f;
rasterizer_desc.DepthClipEnable = TRUE;
rasterizer_desc.ScissorEnable = FALSE;
rasterizer_desc.MultisampleEnable = FALSE;
rasterizer_desc.AntialiasedLineEnable = FALSE;
for (i = 0; i < sizeof(tests) / sizeof(*tests); ++i)
{
rasterizer_desc.CullMode = tests[i].cull_mode;
rasterizer_desc.FrontCounterClockwise = tests[i].front_ccw;
hr = ID3D11Device_CreateRasterizerState(device, &rasterizer_desc, &state);
ok(SUCCEEDED(hr), "Test %u: Failed to create rasterizer state, hr %#x.\n", i, hr);
ID3D11DeviceContext_RSSetState(context, state);
test_context.vb = cw_vb;
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, &red.x);
draw_color_quad(&test_context, &green);
check_texture_color(test_context.backbuffer, tests[i].expected_cw ? 0xff00ff00 : 0xff0000ff, 0);
test_context.vb = ccw_vb;
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, &red.x);
draw_color_quad(&test_context, &green);
check_texture_color(test_context.backbuffer, tests[i].expected_ccw ? 0xff00ff00 : 0xff0000ff, 0);
ID3D11RasterizerState_Release(state);
}
broken_warp = is_warp_device(device) && ID3D11Device_GetFeatureLevel(device) < D3D_FEATURE_LEVEL_10_1;
/* Test SV_IsFrontFace. */
ID3D11PixelShader_Release(test_context.ps);
hr = ID3D11Device_CreatePixelShader(device, ps_code, sizeof(ps_code), NULL, &test_context.ps);
ok(SUCCEEDED(hr), "Failed to create pixel shader, hr %#x.\n", hr);
rasterizer_desc.CullMode = D3D11_CULL_NONE;
rasterizer_desc.FrontCounterClockwise = FALSE;
hr = ID3D11Device_CreateRasterizerState(device, &rasterizer_desc, &state);
ok(SUCCEEDED(hr), "Failed to create rasterizer state, hr %#x.\n", hr);
ID3D11DeviceContext_RSSetState(context, state);
test_context.vb = cw_vb;
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, &red.x);
draw_color_quad(&test_context, &green);
check_texture_color(test_context.backbuffer, 0xff00ff00, 0);
test_context.vb = ccw_vb;
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, &red.x);
draw_color_quad(&test_context, &green);
if (!broken_warp)
check_texture_color(test_context.backbuffer, 0xffff0000, 0);
else
win_skip("Broken WARP.\n");
ID3D11RasterizerState_Release(state);
rasterizer_desc.CullMode = D3D11_CULL_NONE;
rasterizer_desc.FrontCounterClockwise = TRUE;
hr = ID3D11Device_CreateRasterizerState(device, &rasterizer_desc, &state);
ok(SUCCEEDED(hr), "Failed to create rasterizer state, hr %#x.\n", hr);
ID3D11DeviceContext_RSSetState(context, state);
test_context.vb = cw_vb;
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, &red.x);
draw_color_quad(&test_context, &green);
if (!broken_warp)
check_texture_color(test_context.backbuffer, 0xffff0000 , 0);
else
win_skip("Broken WARP.\n");
test_context.vb = ccw_vb;
ID3D11DeviceContext_ClearRenderTargetView(context, test_context.backbuffer_rtv, &red.x);
draw_color_quad(&test_context, &green);
check_texture_color(test_context.backbuffer, 0xff00ff00, 0);
ID3D11RasterizerState_Release(state);
test_context.vb = cw_vb;
ID3D11Buffer_Release(ccw_vb);
release_test_context(&test_context);
}
START_TEST(d3d11) START_TEST(d3d11)
{ {
test_create_device(); test_create_device();
@ -10079,4 +10219,5 @@ START_TEST(d3d11)
test_fp_specials(); test_fp_specials();
test_uint_shader_instructions(); test_uint_shader_instructions();
test_index_buffer_offset(); test_index_buffer_offset();
test_face_culling();
} }