From: Conor McCarthy cmccarthy@codeweavers.com
--- tests/hlsl/depth-out.shader_test | 69 ++++++++++++++++++++++++++++++++ tests/shader_runner.c | 9 +++++ tests/shader_runner.h | 2 + tests/shader_runner_d3d11.c | 2 + tests/shader_runner_d3d12.c | 3 ++ tests/shader_runner_gl.c | 12 +++++- tests/shader_runner_vulkan.c | 5 ++- 7 files changed, 99 insertions(+), 3 deletions(-)
diff --git a/tests/hlsl/depth-out.shader_test b/tests/hlsl/depth-out.shader_test index 7ed8fb5f6..7f3d0f20c 100644 --- a/tests/hlsl/depth-out.shader_test +++ b/tests/hlsl/depth-out.shader_test @@ -31,3 +31,72 @@ probe dsv all r (0.75) depth less todo(sm>=6 | glsl) draw quad probe dsv all r (0.5) + + +[require] +shader model >= 5.0 + +[rtv 0] +format r32g32b32a32 float +size (2d, 640, 480) + +[vertex shader] +float2 depth; + +void main(float4 in_position : POSITION, out float4 out_position : SV_Position) +{ + out_position = in_position; + out_position.z = depth.x; +} + +[pixel shader todo] +float2 depth; + +float4 main(out float out_depth : SV_DepthLessEqual) : SV_Target +{ + out_depth = depth.y; + return float4(0.0f, 1.0f, 0.0f, 1.0f); +} + +[test] +uniform 0 float4 0.75 0.75 0.0 0.0 +rtv clear 1.0 1.0 1.0 1.0 +dsv clear 0.5 +depth greater equal +todo draw quad +probe all rgba (0.0, 1.0, 0.0, 1.0) +probe dsv all r (0.75) + +uniform 0 float4 0.75 0.375 0.0 0.0 +todo draw quad +probe all rgba (1.0, 1.0, 1.0, 1.0) +probe dsv all r (0.5) + + +[pixel shader todo] +float2 depth; + +float4 main(out float out_depth : SV_DepthGreaterEqual) : SV_Target +{ + out_depth = depth.y; + return float4(0.0f, 1.0f, 0.0f, 1.0f); +} + +[test] +uniform 0 float4 0.75 0.75 0.0 0.0 +rtv clear 1.0 1.0 1.0 1.0 +dsv clear 0.5 +depth greater equal +todo draw quad +probe all rgba (0.0, 1.0, 0.0, 1.0) +probe dsv all r (0.75) + +uniform 0 float4 0.375 0.625 0.0 0.0 +todo draw quad +probe all rgba (0.0, 1.0, 0.0, 1.0) +probe dsv all r (0.625) + +uniform 0 float4 0.375 0.375 0.0 0.0 +todo draw quad +probe all rgba (1.0, 1.0, 1.0, 1.0) +probe dsv all r (0.5) diff --git a/tests/shader_runner.c b/tests/shader_runner.c index f84c4673d..416322389 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -807,6 +807,15 @@ static void parse_test_directive(struct shader_runner *runner, const char *line)
runner->last_render_failed = !runner->ops->dispatch(runner, x, y, z); } + else if (match_string(line, "rtv clear", &line)) + { + struct vec4 v; + + if (sscanf(line, "%f %f %f %f", &v.x, &v.y, &v.z, &v.w) < 4) + fatal_error("Malformed rtv clear arguments '%s'.\n", line); + memcpy(runner->rtv_clear_value, &v, sizeof(runner->rtv_clear_value)); + runner->clear_rtv = true; + } else if (match_string(line, "dsv clear", &line)) { float x; diff --git a/tests/shader_runner.h b/tests/shader_runner.h index 3a529340d..ecc59f75e 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -180,6 +180,8 @@ struct shader_runner
unsigned int compile_options;
+ bool clear_rtv; + float rtv_clear_value[4]; float dsv_clear_value; D3D12_COMPARISON_FUNC comparison; }; diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index f5c460d51..f847d795b 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -649,6 +649,8 @@ static bool d3d11_runner_draw(struct shader_runner *r, case RESOURCE_TYPE_RENDER_TARGET: rtvs[resource->r.slot] = resource->rtv; rtv_count = max(rtv_count, resource->r.slot + 1); + if (runner->r.clear_rtv) + ID3D11DeviceContext_ClearRenderTargetView(context, resource->rtv, runner->r.rtv_clear_value); break;
case RESOURCE_TYPE_DEPTH_STENCIL: diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 64d9a91b4..c95f7066e 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -554,6 +554,9 @@ static bool d3d12_runner_draw(struct shader_runner *r, case RESOURCE_TYPE_RENDER_TARGET: rtvs[resource->r.slot] = get_cpu_rtv_handle(test_context, runner->rtv_heap, resource->r.slot); rtv_count = max(rtv_count, resource->r.slot + 1); + if (runner->r.clear_rtv) + ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtvs[resource->r.slot], + runner->r.rtv_clear_value, 0, NULL); break;
case RESOURCE_TYPE_DEPTH_STENCIL: diff --git a/tests/shader_runner_gl.c b/tests/shader_runner_gl.c index 5bbbc0769..8533eef70 100644 --- a/tests/shader_runner_gl.c +++ b/tests/shader_runner_gl.c @@ -901,6 +901,7 @@ static bool gl_runner_draw(struct shader_runner *r, struct gl_runner *runner = gl_runner(r); struct vkd3d_shader_code vs_dxbc; uint8_t *attribute_offsets[32]; + GLbitfield clear_mask = 0; struct { GLuint id; @@ -999,6 +1000,12 @@ static bool gl_runner_draw(struct shader_runner *r, draw_buffers[resource->r.slot] = GL_COLOR_ATTACHMENT0 + resource->r.slot; if (resource->r.slot >= rt_count) rt_count = resource->r.slot + 1; + if (runner->r.clear_rtv) + { + float *colour = runner->r.rtv_clear_value; + glClearColor(colour[0], colour[1], colour[2], colour[3]); + clear_mask |= GL_COLOR_BUFFER_BIT; + } break;
case RESOURCE_TYPE_DEPTH_STENCIL: @@ -1007,7 +1014,7 @@ static bool gl_runner_draw(struct shader_runner *r, glDepthMask(GL_TRUE); glDepthFunc(get_compare_op_gl(runner->r.comparison)); glClearDepthf(runner->r.dsv_clear_value); - glClear(GL_DEPTH_BUFFER_BIT); + clear_mask |= GL_DEPTH_BUFFER_BIT; break;
case RESOURCE_TYPE_TEXTURE: @@ -1041,6 +1048,9 @@ static bool gl_runner_draw(struct shader_runner *r, } }
+ if (clear_mask) + glClear(clear_mask); + glViewport(0, 0, RENDER_TARGET_WIDTH, RENDER_TARGET_HEIGHT); glScissor(0, 0, RENDER_TARGET_WIDTH, RENDER_TARGET_HEIGHT); glDrawBuffers(rt_count, draw_buffers); diff --git a/tests/shader_runner_vulkan.c b/tests/shader_runner_vulkan.c index cb0f72c73..dedb7b61e 100644 --- a/tests/shader_runner_vulkan.c +++ b/tests/shader_runner_vulkan.c @@ -1092,7 +1092,7 @@ static void create_render_pass_and_framebuffer(struct vulkan_shader_runner *runn
attachment_desc->format = vkd3d_get_vk_format(resource->r.format); attachment_desc->samples = VK_SAMPLE_COUNT_1_BIT; - attachment_desc->loadOp = is_ds + attachment_desc->loadOp = (is_ds || runner->r.clear_rtv) ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD; attachment_desc->storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachment_desc->stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; @@ -1220,7 +1220,8 @@ static bool vulkan_runner_draw(struct shader_runner *r,
if (resource->type == RESOURCE_TYPE_RENDER_TARGET) { - /* Ignored. Clear is not enabled for the RT. */ + memcpy(clear_values[pass_begin_desc.clearValueCount].color.float32, runner->r.rtv_clear_value, + sizeof(clear_values[0].color.float32)); ++pass_begin_desc.clearValueCount; } else if (resource->type == RESOURCE_TYPE_DEPTH_STENCIL)