-- v2: 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 | 66 ++++++++++++++++++++++++++++ 2 files changed, 67 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..d30eecda --- /dev/null +++ b/tests/hlsl-is-front-face.shader_test @@ -0,0 +1,66 @@ +[require] +shader model >= 4.0 + +[input layout] +0 r32g32b32a32 float texcoord +0 r32g32 float sv_position + +[vertex buffer 0] +0.0 1.0 0.0 1.0 -2.0 -2.0 +0.0 1.0 0.0 1.0 2.0 -2.0 +0.0 1.0 0.0 1.0 -2.0 2.0 +0.0 1.0 0.0 1.0 2.0 2.0 + +[vertex shader] + +struct vertex +{ + struct + { + float4 texcoord : texcoord; + float4 pos : sv_position; + } m; +}; + +void main(inout struct vertex v) +{ +} + +[pixel shader] +struct input +{ + struct + { + float4 texcoord : texcoord; + } m; +}; + +struct output +{ + struct + { + float4 color : sv_target; + } m; +}; + +struct output main(struct input i, bool face : sv_isfrontface) +{ + struct output o; + o.m.color = i.m.texcoord; + if (face) o.m.color += float4(1.0, 1.0, 1.0, 1.0); + return o; +} + +[test] +draw triangle strip 4 +probe all rgba (0.0, 1.0, 0.0, 1.0) + +[vertex buffer 0] +0.0 1.0 0.0 1.0 -2.0 -2.0 +0.0 1.0 0.0 1.0 -2.0 2.0 +0.0 1.0 0.0 1.0 2.0 -2.0 +0.0 1.0 0.0 1.0 2.0 2.0 + +[test] +draw triangle strip 4 +probe all rgba (1.0, 2.0, 1.0, 2.0)
Pushed some changes to make tests work, please take a look.
This merge request was approved by Zebediah Figura.
Giovanni Mascellani (@giomasce) commented about tests/hlsl-is-front-face.shader_test:
- } m;
+};
+struct output +{
- struct
- {
float4 color : sv_target;
- } m;
+};
+struct output main(struct input i, bool face : sv_isfrontface) +{
- struct output o;
- o.m.color = i.m.texcoord;
- if (face) o.m.color += float4(1.0, 1.0, 1.0, 1.0);
IMHO let's avoid this style even in tests.
This merge request was approved by Giovanni Mascellani.
On Wed Apr 12 15:29:40 2023 +0000, Giovanni Mascellani wrote:
IMHO let's avoid this style even in tests.
Are you talking about placing expression on its own line?