Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- tests/shader_runner.c | 17 +++++++---------- tests/shader_runner.h | 3 +-- tests/shader_runner_d3d12.c | 13 +++++++++---- 3 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/tests/shader_runner.c b/tests/shader_runner.c index 052415947..f6fd028f8 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -71,7 +71,7 @@ struct shader_context const struct shader_runner_ops *ops; void *private;
- ID3D10Blob *ps_code; + char *ps_source;
uint32_t *uniforms; size_t uniform_count; @@ -269,7 +269,7 @@ static void parse_test_directive(struct shader_context *context, const char *lin { const struct draw_params params = { - .ps_code = context->ps_code, + .ps_source = context->ps_source,
.uniforms = context->uniforms, .uniform_count = context->uniform_count, @@ -490,9 +490,11 @@ void run_shader_tests(int argc, char **argv, const struct shader_runner_ops *ops break;
case STATE_SHADER_PIXEL: - if (!(context.ps_code = context.ops->compile_shader(context.private, shader_source))) - return; + free(context.ps_source); + context.ps_source = shader_source; + shader_source = NULL; shader_source_len = 0; + shader_source_size = 0; break;
case STATE_SHADER_INVALID_PIXEL: @@ -580,10 +582,6 @@ void run_shader_tests(int argc, char **argv, const struct shader_runner_ops *ops if (!strcmp(line, "[pixel shader]\n")) { state = STATE_SHADER_PIXEL; - - if (context.ps_code) - ID3D10Blob_Release(context.ps_code); - context.ps_code = NULL; } else if (!strcmp(line, "[pixel shader fail]\n")) { @@ -681,8 +679,7 @@ void run_shader_tests(int argc, char **argv, const struct shader_runner_ops *ops } }
- if (context.ps_code) - ID3D10Blob_Release(context.ps_code); + free(context.ps_source); for (i = 0; i < context.texture_count; ++i) free_texture(&context.textures[i]);
diff --git a/tests/shader_runner.h b/tests/shader_runner.h index ec152978e..cb3486b35 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -55,7 +55,7 @@ struct texture
struct draw_params { - ID3D10Blob *ps_code; + const char *ps_source;
const uint32_t *uniforms; size_t uniform_count; @@ -69,7 +69,6 @@ struct draw_params
struct shader_runner_ops { - ID3D10Blob *(*compile_shader)(void *private, const char *source); void (*draw_quad)(void *private, const struct draw_params *params); void (*probe_vec4)(void *private, const RECT *rect, const struct vec4 *v, unsigned int ulps); }; diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 5c9db69c0..2bb1a9bac 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -31,7 +31,7 @@ struct d3d12_texture unsigned int root_index; };
-static ID3D10Blob *d3d12_runner_compile_shader(void *private, const char *source) +static ID3D10Blob *compile_shader(const char *source) { ID3D10Blob *blob = NULL, *errors = NULL; HRESULT hr; @@ -51,8 +51,6 @@ static void d3d12_runner_draw_quad(void *private, const struct draw_params *para { struct test_context *context = private;
- D3D12_SHADER_BYTECODE ps - = {ID3D10Blob_GetBufferPointer(params->ps_code), ID3D10Blob_GetBufferSize(params->ps_code)}; ID3D12GraphicsCommandList *command_list = context->list; D3D12_ROOT_SIGNATURE_DESC root_signature_desc = {0}; D3D12_ROOT_PARAMETER root_params[3], *root_param; @@ -60,10 +58,15 @@ static void d3d12_runner_draw_quad(void *private, const struct draw_params *para ID3D12Device *device = context->device; static const float clear_color[4]; unsigned int uniform_index; + D3D12_SHADER_BYTECODE ps; ID3D12PipelineState *pso; + ID3D10Blob *ps_code; HRESULT hr; size_t i;
+ if (!(ps_code = compile_shader(params->ps_source))) + return; + root_signature_desc.NumParameters = 0; root_signature_desc.pParameters = root_params; root_signature_desc.NumStaticSamplers = 0; @@ -142,8 +145,11 @@ static void d3d12_runner_draw_quad(void *private, const struct draw_params *para hr = create_root_signature(device, &root_signature_desc, &context->root_signature); ok(hr == S_OK, "Failed to create root signature, hr %#x.\n", hr);
+ ps.pShaderBytecode = ID3D10Blob_GetBufferPointer(ps_code); + ps.BytecodeLength = ID3D10Blob_GetBufferSize(ps_code); pso = create_pipeline_state(device, context->root_signature, context->render_target_desc.Format, NULL, &ps, NULL); + ID3D10Blob_Release(ps_code); if (!pso) return; vkd3d_array_reserve((void **)&context->pso, &context->pso_capacity, context->pso_count + 1, sizeof(*context->pso)); @@ -201,7 +207,6 @@ static void d3d12_runner_probe_vec4(void *private, const RECT *rect, const struc
static const struct shader_runner_ops d3d12_runner_ops = { - .compile_shader = d3d12_runner_compile_shader, .draw_quad = d3d12_runner_draw_quad, .probe_vec4 = d3d12_runner_probe_vec4, };