Zebediah Figura : tests: Add a test for explicitly typed textures.
Alexandre Julliard
julliard at winehq.org
Tue Oct 5 15:50:42 CDT 2021
Module: vkd3d
Branch: master
Commit: 1e62adbee7238686c56270d5f026ba2bad1f67ed
URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=1e62adbee7238686c56270d5f026ba2bad1f67ed
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Sun Oct 3 19:19:09 2021 -0500
tests: Add a test for explicitly typed textures.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
Makefile.am | 2 +
tests/shader_runner_d3d12.c | 95 ++++++++++++++++++++++++++++++++----
tests/texture-load-typed.shader_test | 49 +++++++++++++++++++
3 files changed, 137 insertions(+), 9 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 921bb79..ee3d749 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -100,6 +100,7 @@ vkd3d_shader_tests = \
tests/swizzle-6.shader_test \
tests/swizzle-7.shader_test \
tests/texture-load.shader_test \
+ tests/texture-load-typed.shader_test \
tests/trigonometry.shader_test \
tests/writemask-assignop-0.shader_test \
tests/writemask-assignop-1.shader_test \
@@ -301,6 +302,7 @@ XFAIL_TESTS = \
tests/math.shader_test \
tests/max.shader_test \
tests/texture-load.shader_test \
+ tests/texture-load-typed.shader_test \
tests/trigonometry.shader_test \
tests/writemask-assignop-1.shader_test
endif
diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c
index 171a855..e470837 100644
--- a/tests/shader_runner_d3d12.c
+++ b/tests/shader_runner_d3d12.c
@@ -73,10 +73,20 @@ static bool vkd3d_array_reserve(void **elements, size_t *capacity, size_t elemen
return true;
}
+enum texture_data_type
+{
+ TEXTURE_DATA_FLOAT,
+ TEXTURE_DATA_SINT,
+ TEXTURE_DATA_UINT,
+};
+
struct texture
{
unsigned int slot;
+ DXGI_FORMAT format;
+ enum texture_data_type data_type;
+ unsigned int texel_size;
unsigned int width, height;
uint8_t *data;
size_t data_size, data_capacity;
@@ -150,12 +160,51 @@ static bool match_string(const char *line, const char *token, const char **const
return true;
}
+static void parse_texture_format(struct texture *texture, const char *line)
+{
+ static const struct
+ {
+ const char *string;
+ enum texture_data_type data_type;
+ unsigned int texel_size;
+ DXGI_FORMAT format;
+ }
+ formats[] =
+ {
+ {"r32g32b32a32 float", TEXTURE_DATA_FLOAT, 16, DXGI_FORMAT_R32G32B32A32_FLOAT},
+ {"r32g32 uint", TEXTURE_DATA_UINT, 8, DXGI_FORMAT_R32G32_UINT},
+ {"r32 float", TEXTURE_DATA_FLOAT, 4, DXGI_FORMAT_R32_FLOAT},
+ {"r32 sint", TEXTURE_DATA_SINT, 4, DXGI_FORMAT_R32_SINT},
+ };
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(formats); ++i)
+ {
+ if (match_string(line, formats[i].string, &line))
+ {
+ texture->format = formats[i].format;
+ texture->data_type = formats[i].data_type;
+ texture->texel_size = formats[i].texel_size;
+ return;
+ }
+ }
+
+ fprintf(stderr, "Unknown format '%s'.\n", line);
+ texture->format = DXGI_FORMAT_R32G32B32A32_FLOAT;
+ texture->data_type = TEXTURE_DATA_FLOAT;
+ texture->texel_size = 16;
+}
+
static void parse_texture_directive(struct texture *texture, const char *line)
{
const char *const orig_line = line;
int ret;
- if (match_string(line, "size", &line))
+ if (match_string(line, "format", &line))
+ {
+ parse_texture_format(texture, line);
+ }
+ else if (match_string(line, "size", &line))
{
ret = sscanf(line, "( %u , %u )", &texture->width, &texture->height);
if (ret < 2)
@@ -163,14 +212,39 @@ static void parse_texture_directive(struct texture *texture, const char *line)
}
else
{
+ union
+ {
+ float f;
+ int32_t i;
+ uint32_t u;
+ } u;
char *rest;
- float f;
- while ((f = strtof(line, &rest)) || rest != line)
+ u.u = 0;
+
+ for (;;)
{
- vkd3d_array_reserve((void **)&texture->data, &texture->data_capacity, texture->data_size + sizeof(f), 1);
- memcpy(texture->data + texture->data_size, &f, sizeof(f));
- texture->data_size += sizeof(f);
+ switch (texture->data_type)
+ {
+ case TEXTURE_DATA_FLOAT:
+ u.f = strtof(line, &rest);
+ break;
+
+ case TEXTURE_DATA_SINT:
+ u.i = strtol(line, &rest, 10);
+ break;
+
+ case TEXTURE_DATA_UINT:
+ u.u = strtoul(line, &rest, 10);
+ break;
+ }
+
+ if (rest == line)
+ break;
+
+ vkd3d_array_reserve((void **)&texture->data, &texture->data_capacity, texture->data_size + sizeof(u), 1);
+ memcpy(texture->data + texture->data_size, &u, sizeof(u));
+ texture->data_size += sizeof(u);
line = rest;
}
}
@@ -191,7 +265,7 @@ static void parse_test_directive(struct shader_context *context, const char *lin
= {ID3D10Blob_GetBufferPointer(context->ps_code), ID3D10Blob_GetBufferSize(context->ps_code)};
ID3D12GraphicsCommandList *command_list = context->c.list;
D3D12_ROOT_SIGNATURE_DESC root_signature_desc = {0};
- D3D12_ROOT_PARAMETER root_params[2], *root_param;
+ D3D12_ROOT_PARAMETER root_params[3], *root_param;
static const float clear_color[4];
unsigned int uniform_index;
ID3D12PipelineState *pso;
@@ -233,9 +307,9 @@ static void parse_test_directive(struct shader_context *context, const char *lin
texture->heap = create_gpu_descriptor_heap(context->c.device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 1);
texture->resource = create_default_texture(context->c.device, texture->width, texture->height,
- DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D12_RESOURCE_STATE_COPY_DEST);
+ texture->format, 0, D3D12_RESOURCE_STATE_COPY_DEST);
resource_data.pData = texture->data;
- resource_data.SlicePitch = resource_data.RowPitch = texture->width * sizeof(struct vec4);
+ resource_data.SlicePitch = resource_data.RowPitch = texture->width * texture->texel_size;
upload_texture_data(texture->resource, &resource_data, 1, context->c.queue, command_list);
reset_command_list(command_list, context->c.allocator);
transition_resource_state(command_list, texture->resource, D3D12_RESOURCE_STATE_COPY_DEST,
@@ -597,6 +671,9 @@ START_TEST(shader_runner_d3d12)
memset(current_texture, 0, sizeof(*current_texture));
}
current_texture->slot = index;
+ current_texture->format = DXGI_FORMAT_R32G32B32A32_FLOAT;
+ current_texture->data_type = TEXTURE_DATA_FLOAT;
+ current_texture->texel_size = 16;
}
else if (!strcmp(line, "[test]\n"))
{
diff --git a/tests/texture-load-typed.shader_test b/tests/texture-load-typed.shader_test
new file mode 100644
index 0000000..c0c3568
--- /dev/null
+++ b/tests/texture-load-typed.shader_test
@@ -0,0 +1,49 @@
+[pixel shader fail]
+texture<float> t;
+
+float4 main() : sv_target
+{
+ return float4(0, 0, 0, 0);
+}
+
+[pixel shader fail]
+typedef Texture2D mytex_t;
+mytex_t<float> t;
+
+float4 main() : sv_target
+{
+ return float4(0, 0, 0, 0);
+}
+
+[texture 0]
+format r32 float
+size (1, 1)
+
+0.8
+
+[texture 1]
+format r32 sint
+size (1, 1)
+
+-3
+
+[texture 2]
+format r32g32 uint
+size (1, 1)
+
+4294967295 123
+
+[pixel shader]
+typedef int myint_t;
+texture2D<float> f1;
+Texture2D<myint_t> i1;
+Texture2D<uint2> u2;
+float4 main() : sv_target
+{
+ const float3 pos = float3(0.5, 0.5, 0);
+ return float4(f1.Load(pos), i1.Load(pos), u2.Load(pos));
+}
+
+[test]
+draw quad
+probe all rgba (0.8, -3.0, 4294967295.0, 123.0)
More information about the wine-cvs
mailing list