mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/hlsl: Correctly calculate offsets for array elements.
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Giovanni Mascellani <gmascellani@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
committed by
Alexandre Julliard
parent
2b0fd2a055
commit
ee764359d0
@ -96,6 +96,7 @@ vkd3d_shader_tests = \
|
|||||||
tests/hlsl-state-block-syntax.shader_test \
|
tests/hlsl-state-block-syntax.shader_test \
|
||||||
tests/hlsl-static-initializer.shader_test \
|
tests/hlsl-static-initializer.shader_test \
|
||||||
tests/hlsl-storage-qualifiers.shader_test \
|
tests/hlsl-storage-qualifiers.shader_test \
|
||||||
|
tests/hlsl-struct-array.shader_test \
|
||||||
tests/hlsl-struct-assignment.shader_test \
|
tests/hlsl-struct-assignment.shader_test \
|
||||||
tests/hlsl-struct-semantics.shader_test \
|
tests/hlsl-struct-semantics.shader_test \
|
||||||
tests/hlsl-vector-indexing.shader_test \
|
tests/hlsl-vector-indexing.shader_test \
|
||||||
@ -339,7 +340,6 @@ XFAIL_TESTS = \
|
|||||||
tests/hlsl-majority-pragma.shader_test \
|
tests/hlsl-majority-pragma.shader_test \
|
||||||
tests/hlsl-majority-typedef.shader_test \
|
tests/hlsl-majority-typedef.shader_test \
|
||||||
tests/hlsl-mul.shader_test \
|
tests/hlsl-mul.shader_test \
|
||||||
tests/hlsl-nested-arrays.shader_test \
|
|
||||||
tests/hlsl-numeric-constructor-truncation.shader_test \
|
tests/hlsl-numeric-constructor-truncation.shader_test \
|
||||||
tests/hlsl-numeric-types.shader_test \
|
tests/hlsl-numeric-types.shader_test \
|
||||||
tests/hlsl-return-implicit-conversion.shader_test \
|
tests/hlsl-return-implicit-conversion.shader_test \
|
||||||
|
@ -202,6 +202,13 @@ static void hlsl_type_calculate_reg_size(struct hlsl_ctx *ctx, struct hlsl_type
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns the size of a type, considered as part of an array of that type.
|
||||||
|
* As such it includes padding after the type. */
|
||||||
|
unsigned int hlsl_type_get_array_element_reg_size(const struct hlsl_type *type)
|
||||||
|
{
|
||||||
|
return align(type->reg_size, 4);
|
||||||
|
}
|
||||||
|
|
||||||
static struct hlsl_type *hlsl_new_type(struct hlsl_ctx *ctx, const char *name, enum hlsl_type_class type_class,
|
static struct hlsl_type *hlsl_new_type(struct hlsl_ctx *ctx, const char *name, enum hlsl_type_class type_class,
|
||||||
enum hlsl_base_type base_type, unsigned dimx, unsigned dimy)
|
enum hlsl_base_type base_type, unsigned dimx, unsigned dimy)
|
||||||
{
|
{
|
||||||
|
@ -783,6 +783,7 @@ bool hlsl_scope_add_type(struct hlsl_scope *scope, struct hlsl_type *type);
|
|||||||
struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old,
|
struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old,
|
||||||
unsigned int default_majority, unsigned int modifiers);
|
unsigned int default_majority, unsigned int modifiers);
|
||||||
unsigned int hlsl_type_component_count(struct hlsl_type *type);
|
unsigned int hlsl_type_component_count(struct hlsl_type *type);
|
||||||
|
unsigned int hlsl_type_get_array_element_reg_size(const struct hlsl_type *type);
|
||||||
unsigned int hlsl_type_get_sm4_offset(const struct hlsl_type *type, unsigned int offset);
|
unsigned int hlsl_type_get_sm4_offset(const struct hlsl_type *type, unsigned int offset);
|
||||||
bool hlsl_types_are_equal(const struct hlsl_type *t1, const struct hlsl_type *t2);
|
bool hlsl_types_are_equal(const struct hlsl_type *t1, const struct hlsl_type *t2);
|
||||||
|
|
||||||
|
@ -607,7 +607,7 @@ static struct hlsl_ir_load *add_array_load(struct hlsl_ctx *ctx, struct list *in
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(c = hlsl_new_uint_constant(ctx, data_type->reg_size, loc)))
|
if (!(c = hlsl_new_uint_constant(ctx, hlsl_type_get_array_element_reg_size(data_type), loc)))
|
||||||
return NULL;
|
return NULL;
|
||||||
list_add_tail(instrs, &c->node.entry);
|
list_add_tail(instrs, &c->node.entry);
|
||||||
if (!(mul = hlsl_new_binary_expr(ctx, HLSL_OP2_MUL, index, &c->node)))
|
if (!(mul = hlsl_new_binary_expr(ctx, HLSL_OP2_MUL, index, &c->node)))
|
||||||
|
@ -621,7 +621,7 @@ static bool split_array_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
|
|||||||
if (type->type != HLSL_CLASS_ARRAY)
|
if (type->type != HLSL_CLASS_ARRAY)
|
||||||
return false;
|
return false;
|
||||||
element_type = type->e.array.type;
|
element_type = type->e.array.type;
|
||||||
element_size = element_type->reg_size;
|
element_size = hlsl_type_get_array_element_reg_size(element_type);
|
||||||
|
|
||||||
for (i = 0; i < type->e.array.elements_count; ++i)
|
for (i = 0; i < type->e.array.elements_count; ++i)
|
||||||
{
|
{
|
||||||
|
19
tests/hlsl-struct-array.shader_test
Normal file
19
tests/hlsl-struct-array.shader_test
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
% In SM4, array elements are always aligned to the next vec4, although structs are not.
|
||||||
|
|
||||||
|
[pixel shader]
|
||||||
|
uniform struct
|
||||||
|
{
|
||||||
|
float p, q;
|
||||||
|
} colours[3];
|
||||||
|
|
||||||
|
float4 main() : sv_target
|
||||||
|
{
|
||||||
|
return float4(colours[0].q, colours[1].p, colours[2].q, colours[2].p);
|
||||||
|
}
|
||||||
|
|
||||||
|
[test]
|
||||||
|
uniform 0 float4 0.1 0.2 0.0 0.0
|
||||||
|
uniform 4 float4 0.3 0.4 0.0 0.0
|
||||||
|
uniform 8 float4 0.5 0.6 0.0 0.0
|
||||||
|
draw quad
|
||||||
|
probe all rgba (0.2, 0.3, 0.6, 0.5)
|
Reference in New Issue
Block a user