tests/shader_runner: Restore the input layout after "draw quad" operations.

We don't want these to implicitly change the input layout.
This commit is contained in:
Francisco Casas
2025-12-10 13:56:13 -03:00
committed by Henri Verbeet
parent be3912f600
commit b2b678bdc2
Notes: Henri Verbeet 2025-12-11 19:10:21 +01:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1229
2 changed files with 28 additions and 17 deletions

View File

@@ -119,7 +119,7 @@ static void input_layout_clear(struct input_layout *l)
for (i = 0; i < l->element_count; ++i) for (i = 0; i < l->element_count; ++i)
{ {
free(l->elements[i].name); free((char *)l->elements[i].name);
} }
l->element_count = 0; l->element_count = 0;
} }
@@ -834,6 +834,7 @@ static void parse_input_layout_directive(struct shader_runner *runner, const cha
{ {
struct input_element *element; struct input_element *element;
const char *rest; const char *rest;
char *name;
vkd3d_array_reserve((void **)&runner->input.elements, &runner->input.element_capacity, vkd3d_array_reserve((void **)&runner->input.elements, &runner->input.element_capacity,
runner->input.element_count + 1, sizeof(*runner->input.elements)); runner->input.element_count + 1, sizeof(*runner->input.elements));
@@ -848,9 +849,10 @@ static void parse_input_layout_directive(struct shader_runner *runner, const cha
if (!(rest = strpbrk(line, " \n"))) if (!(rest = strpbrk(line, " \n")))
rest = line + strlen(line); rest = line + strlen(line);
element->name = malloc(rest - line + 1); name = malloc(rest - line + 1);
memcpy(element->name, line, rest - line); memcpy(name, line, rest - line);
element->name[rest - line] = 0; name[rest - line] = 0;
element->name = name;
line = rest; line = rest;
element->index = strtoul(line, (char **)&rest, 10); element->index = strtoul(line, (char **)&rest, 10);
@@ -1207,8 +1209,8 @@ static void parse_test_directive(struct shader_runner *runner, const char *line)
} }
else if (match_string(line, "draw quad", &line)) else if (match_string(line, "draw quad", &line))
{ {
struct input_layout input_layout;
struct resource_params params; struct resource_params params;
struct input_element *element;
unsigned int i; unsigned int i;
/* For simplicity, draw a large triangle instead. */ /* For simplicity, draw a large triangle instead. */
@@ -1219,6 +1221,22 @@ static void parse_test_directive(struct shader_runner *runner, const char *line)
{ 4.0f, -2.0f}, { 4.0f, -2.0f},
}; };
static const struct input_element position_element =
{
.name = "position",
.slot = 0,
.format = DXGI_FORMAT_R32G32_FLOAT,
.texel_size = sizeof(*quad),
.index = 0,
};
static const struct input_layout quad_layout =
{
.elements = (struct input_element *)&position_element,
.element_count = 1,
.element_capacity = 1,
};
static const char vs_source[] = static const char vs_source[] =
"float4 main(float4 pos : position) : sv_position\n" "float4 main(float4 pos : position) : sv_position\n"
"{\n" "{\n"
@@ -1230,17 +1248,8 @@ static void parse_test_directive(struct shader_runner *runner, const char *line)
set_default_target(runner); set_default_target(runner);
input_layout_clear(&runner->input); input_layout = runner->input;
runner->input = quad_layout;
vkd3d_array_reserve((void **)&runner->input.elements,
&runner->input.element_capacity, 1, sizeof(*runner->input.elements));
element = &runner->input.elements[0];
element->name = strdup("position");
element->slot = 0;
element->format = DXGI_FORMAT_R32G32_FLOAT;
element->texel_size = sizeof(*quad);
element->index = 0;
runner->input.element_count = 1;
memset(&params, 0, sizeof(params)); memset(&params, 0, sizeof(params));
params.desc.slot = 0; params.desc.slot = 0;
@@ -1267,6 +1276,8 @@ static void parse_test_directive(struct shader_runner *runner, const char *line)
runner->last_render_failed = !runner->ops->draw(runner, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, 3, 1); runner->last_render_failed = !runner->ops->draw(runner, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, 3, 1);
todo_if(runner->is_todo) bug_if(runner->is_bug) todo_if(runner->is_todo) bug_if(runner->is_bug)
ok(!runner->last_render_failed, "Draw failed.\n"); ok(!runner->last_render_failed, "Draw failed.\n");
runner->input = input_layout;
} }
else if (match_string(line, "draw", &line)) else if (match_string(line, "draw", &line))
{ {

View File

@@ -127,7 +127,7 @@ struct resource
struct input_element struct input_element
{ {
char *name; const char *name;
unsigned int slot; unsigned int slot;
DXGI_FORMAT format; DXGI_FORMAT format;
unsigned int texel_size; unsigned int texel_size;