-- v4: tests: Add a test for SV_IsFrontFace. tests: Disable culling in shader runners. vkd3d-shader/hlsl: Handle SV_IsFrontFace semantic.
From: Nikolay Sivov nsivov@codeweavers.com
--- libs/vkd3d-shader/hlsl_sm4.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index 5bd4f2d6..8be848c5 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -115,6 +115,7 @@ bool hlsl_sm4_usage_from_semantic(struct hlsl_ctx *ctx, const struct hlsl_semant
{"position", false, VKD3D_SHADER_TYPE_PIXEL, D3D_NAME_POSITION}, {"sv_position", false, VKD3D_SHADER_TYPE_PIXEL, D3D_NAME_POSITION}, + {"sv_isfrontface", false, VKD3D_SHADER_TYPE_PIXEL, D3D_NAME_IS_FRONT_FACE},
{"color", true, VKD3D_SHADER_TYPE_PIXEL, D3D_NAME_TARGET}, {"depth", true, VKD3D_SHADER_TYPE_PIXEL, D3D_NAME_DEPTH},
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- tests/shader_runner_d3d11.c | 18 ++++++++++++++++++ tests/shader_runner_d3d12.c | 2 +- tests/shader_runner_d3d9.c | 2 ++ tests/shader_runner_vulkan.c | 2 +- 4 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index 965b8b18..2954cab8 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -63,6 +63,7 @@ struct d3d11_shader_runner HWND window; IDXGISwapChain *swapchain; ID3D11DeviceContext *immediate_context; + ID3D11RasterizerState *rasterizer_state; };
static struct d3d11_shader_runner *d3d11_shader_runner(struct shader_runner *r) @@ -250,7 +251,9 @@ static IDXGISwapChain *create_swapchain(ID3D11Device *device, HWND window) static BOOL init_test_context(struct d3d11_shader_runner *runner) { unsigned int rt_width, rt_height; + D3D11_RASTERIZER_DESC rs_desc; D3D11_VIEWPORT vp; + HRESULT hr; RECT rect;
memset(runner, 0, sizeof(*runner)); @@ -279,6 +282,19 @@ static BOOL init_test_context(struct d3d11_shader_runner *runner) vp.MaxDepth = 1.0f; ID3D11DeviceContext_RSSetViewports(runner->immediate_context, 1, &vp);
+ rs_desc.FillMode = D3D11_FILL_SOLID; + rs_desc.CullMode = D3D11_CULL_NONE; + rs_desc.FrontCounterClockwise = FALSE; + rs_desc.DepthBias = 0; + rs_desc.DepthBiasClamp = 0.0f; + rs_desc.SlopeScaledDepthBias = 0.0f; + rs_desc.DepthClipEnable = TRUE; + rs_desc.ScissorEnable = FALSE; + rs_desc.MultisampleEnable = FALSE; + rs_desc.AntialiasedLineEnable = FALSE; + hr = ID3D11Device_CreateRasterizerState(runner->device, &rs_desc, &runner->rasterizer_state); + ok(hr == S_OK, "Failed to create rasterizer state.\n"); + return TRUE; }
@@ -286,6 +302,7 @@ static void destroy_test_context(struct d3d11_shader_runner *runner) { ULONG ref;
+ ID3D11RasterizerState_Release(runner->rasterizer_state); ID3D11DeviceContext_Release(runner->immediate_context); IDXGISwapChain_Release(runner->swapchain); DestroyWindow(runner->window); @@ -594,6 +611,7 @@ static bool d3d11_runner_draw(struct shader_runner *r, ID3D11DeviceContext_IASetPrimitiveTopology(context, primitive_topology); ID3D11DeviceContext_VSSetShader(context, vs, NULL, 0); ID3D11DeviceContext_PSSetShader(context, ps, NULL, 0); + ID3D11DeviceContext_RSSetState(context, runner->rasterizer_state);
ID3D11DeviceContext_Draw(context, vertex_count, 0);
diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 87e5d130..54d1c51a 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -380,7 +380,7 @@ static bool d3d12_runner_draw(struct shader_runner *r, pso_desc.PS.pShaderBytecode = ID3D10Blob_GetBufferPointer(ps_code); pso_desc.PS.BytecodeLength = ID3D10Blob_GetBufferSize(ps_code); pso_desc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID; - pso_desc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK; + pso_desc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE; pso_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; pso_desc.SampleDesc.Count = 1; pso_desc.SampleMask = ~(UINT)0; diff --git a/tests/shader_runner_d3d9.c b/tests/shader_runner_d3d9.c index 51cd6dc9..b983dc08 100644 --- a/tests/shader_runner_d3d9.c +++ b/tests/shader_runner_d3d9.c @@ -418,6 +418,8 @@ static bool d3d9_runner_draw(struct shader_runner *r, ok(hr == D3D_OK, "Failed to set vertex shader, hr %#lx.\n", hr); hr = IDirect3DDevice9_SetPixelShader(device, ps); ok(hr == D3D_OK, "Failed to set pixel shader, hr %#lx.\n", hr); + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_CULLMODE, D3DCULL_NONE); + ok(hr == D3D_OK, "Failed to set cull mode, hr %#lx.\n", hr);
hr = IDirect3DDevice9_BeginScene(device); ok(hr == D3D_OK, "Failed to draw, hr %#lx.\n", hr); diff --git a/tests/shader_runner_vulkan.c b/tests/shader_runner_vulkan.c index c7b1dee0..aca17a1a 100644 --- a/tests/shader_runner_vulkan.c +++ b/tests/shader_runner_vulkan.c @@ -619,7 +619,7 @@ static VkPipeline create_graphics_pipeline(const struct vulkan_shader_runner *ru vp_desc.scissorCount = 1; vp_desc.pScissors = &rt_rect;
- rs_desc.frontFace = VK_FRONT_FACE_CLOCKWISE; + rs_desc.cullMode = VK_CULL_MODE_NONE; rs_desc.lineWidth = 1.0f;
ms_desc.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- Makefile.am | 1 + tests/hlsl-is-front-face.shader_test | 36 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 tests/hlsl-is-front-face.shader_test
diff --git a/Makefile.am b/Makefile.am index 48991982..23e78d09 100644 --- a/Makefile.am +++ b/Makefile.am @@ -94,6 +94,7 @@ vkd3d_shader_tests = \ tests/hlsl-initializer-struct.shader_test \ tests/hlsl-intrinsic-override.shader_test \ tests/hlsl-invalid.shader_test \ + tests/hlsl-is-front-face.shader_test \ tests/hlsl-ldexp.shader_test \ tests/hlsl-length.shader_test \ tests/hlsl-lerp.shader_test \ diff --git a/tests/hlsl-is-front-face.shader_test b/tests/hlsl-is-front-face.shader_test new file mode 100644 index 00000000..11447d26 --- /dev/null +++ b/tests/hlsl-is-front-face.shader_test @@ -0,0 +1,36 @@ +[require] +shader model >= 4.0 + +[input layout] +0 r32g32 float sv_position + +[vertex buffer 0] +-2.0 -2.0 + 2.0 -2.0 +-2.0 2.0 + 2.0 2.0 + +[vertex shader] +void main(inout float4 pos : sv_position) +{ +} + +[pixel shader] +float4 main(bool face : sv_isfrontface) : sv_target +{ + return face ? float4(1.0f, 2.0f, 1.0f, 2.0f) : float4(0.0f, 1.0f, 0.0f, 1.0f); +} + +[test] +draw triangle strip 4 +probe all rgba (0.0, 1.0, 0.0, 1.0) + +[vertex buffer 0] +-2.0 -2.0 +-2.0 2.0 + 2.0 -2.0 + 2.0 2.0 + +[test] +draw triangle strip 4 +probe all rgba (1.0, 2.0, 1.0, 2.0)
On Thu Apr 13 10:46:37 2023 +0000, Henri Verbeet wrote:
That pixel shader looks a fair bit more complicated than it needs to be. The texcoord input in particular doesn't seem to add much, but ultimately I think we could just do the following?
[pixel shader] float4 main(bool front : sv_isfrontface) : sv_target { return front ? float4(1.0f, 2.0f, 1.0f, 2.0f) : float4(0.0f, 1.0f, 0.0f, 1.0f); }
It may also be less total code to add "draw quad cw" and "draw quad ccw" statements to the shader runner, instead of using an explicit input layout, vertex buffer, and vertex shader here.
Thanks, I removed unnecessary parts.
This merge request was approved by Henri Verbeet.