From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/hlsl_codegen.c | 12 ++++++++++++ tests/object-references.shader_test | 12 ++++++++++++ 2 files changed, 24 insertions(+)
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 58d44c4d..6e4168fc 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -1024,6 +1024,18 @@ static bool validate_static_object_references(struct hlsl_ctx *ctx, struct hlsl_ note_non_static_deref_expressions(ctx, &load->sampler, "resource load sampler"); } } + else if (instr->type == HLSL_IR_RESOURCE_STORE) + { + struct hlsl_ir_resource_store *store = hlsl_ir_resource_store(instr); + + if (!hlsl_component_index_range_from_deref(ctx, &store->resource, &start, &count)) + { + hlsl_error(ctx, &instr->loc, VKD3D_SHADER_ERROR_HLSL_NON_STATIC_OBJECT_REF, + "Accessed resource from "%s" must be determinable at compile time.", + store->resource.var->name); + note_non_static_deref_expressions(ctx, &store->resource, "accessed resource"); + } + }
return false; } diff --git a/tests/object-references.shader_test b/tests/object-references.shader_test index a33bd14a..12f745e6 100644 --- a/tests/object-references.shader_test +++ b/tests/object-references.shader_test @@ -120,6 +120,18 @@ float4 main() : sv_target }
+[pixel shader fail] +// Note: Only valid in shader model 5.1 +RWTexture2D<float4> tex[3]; +uniform int n; + +float4 main() : sv_target +{ + tex[n][int2(0, 0)] = 0.6; + return 0; +} + + [pixel shader todo] Texture2D tex; uniform float f;