From: Henri Verbeet hverbeet@codeweavers.com
--- libs/vkd3d-shader/vkd3d_shader_main.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 48af5d976..85210a8be 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -645,6 +645,16 @@ struct vkd3d_shader_scan_context size_t combined_samplers_size; };
+static VKD3D_PRINTF_FUNC(3, 4) void vkd3d_shader_scan_error(struct vkd3d_shader_scan_context *context, + enum vkd3d_shader_error error, const char *format, ...) +{ + va_list args; + + va_start(args, format); + vkd3d_shader_verror(context->message_context, &context->location, error, format, args); + va_end(args); +} + static void vkd3d_shader_scan_context_init(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_version *version, const struct vkd3d_shader_compile_info *compile_info, @@ -1026,16 +1036,6 @@ static void vkd3d_shader_scan_typed_resource_declaration(struct vkd3d_shader_sca semantic->resource_type, resource_data_type, semantic->sample_count, 0, false); }
-static void vkd3d_shader_scan_error(struct vkd3d_shader_scan_context *context, - enum vkd3d_shader_error error, const char *format, ...) -{ - va_list args; - - va_start(args, format); - vkd3d_shader_verror(context->message_context, &context->location, error, format, args); - va_end(args); -} - static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_instruction *instruction) {
From: Henri Verbeet hverbeet@codeweavers.com
And output a warning instead. --- include/vkd3d_shader.h | 4 ++++ libs/vkd3d-shader/vkd3d_shader_main.c | 22 ++++++++++++++++++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++ 3 files changed, 28 insertions(+)
diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index d42b6110c..66a7de9b5 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -1507,6 +1507,10 @@ struct vkd3d_shader_combined_resource_sampler_info * particularly useful when targeting environments without separate binding * points for samplers and resources, like OpenGL. * + * No resource-sampler pairs are returned for dynamic accesses to + * resource/sampler descriptor arrays, as can occur in Direct3D shader model + * 5.1 shaders. + * * Members of this structure are allocated by vkd3d-shader and should be freed * with vkd3d_shader_free_scan_combined_resource_sampler_info() when no longer * needed. diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 85210a8be..1517f9708 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -655,6 +655,16 @@ static VKD3D_PRINTF_FUNC(3, 4) void vkd3d_shader_scan_error(struct vkd3d_shader_ va_end(args); }
+static void VKD3D_PRINTF_FUNC(3, 4) vkd3d_shader_scan_warning(struct vkd3d_shader_scan_context *context, + enum vkd3d_shader_error error, const char *format, ...) +{ + va_list args; + + va_start(args, format); + vkd3d_shader_vwarning(context->message_context, &context->location, error, format, args); + va_end(args); +} + static void vkd3d_shader_scan_context_init(struct vkd3d_shader_scan_context *context, const struct vkd3d_shader_version *version, const struct vkd3d_shader_compile_info *compile_info, @@ -907,6 +917,18 @@ static void vkd3d_shader_scan_combined_sampler_usage(struct vkd3d_shader_scan_co { const struct vkd3d_shader_scan_descriptor_info1 *info = context->scan_descriptor_info; const struct vkd3d_shader_descriptor_info1 *d; + bool dynamic_resource, dynamic_sampler; + + if ((dynamic_resource = resource->idx[1].rel_addr)) + vkd3d_shader_scan_warning(context, VKD3D_SHADER_WARNING_VSIR_DYNAMIC_DESCRIPTOR_ARRAY, + "Resource descriptor array %u is being dynamically indexed, " + "not recording a combined resource-sampler pair.", resource->idx[0].offset); + if ((dynamic_sampler = sampler && sampler->idx[1].rel_addr)) + vkd3d_shader_scan_warning(context, VKD3D_SHADER_WARNING_VSIR_DYNAMIC_DESCRIPTOR_ARRAY, + "Sampler descriptor array %u is being dynamically indexed, " + "not recording a combined resource-sampler pair.", sampler->idx[0].offset); + if (dynamic_resource || dynamic_sampler) + return;
for (i = 0; i < info->descriptor_count; ++i) { diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index bff494539..41fcf5775 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -213,6 +213,8 @@ enum vkd3d_shader_error VKD3D_SHADER_ERROR_VSIR_INVALID_DCL_TEMPS = 9014, VKD3D_SHADER_ERROR_VSIR_INVALID_INDEX = 9015, VKD3D_SHADER_ERROR_VSIR_INVALID_INSTRUCTION_NESTING = 9016, + + VKD3D_SHADER_WARNING_VSIR_DYNAMIC_DESCRIPTOR_ARRAY = 9300, };
enum vkd3d_shader_opcode
From: Henri Verbeet hverbeet@codeweavers.com
--- libs/vkd3d-shader/vkd3d_shader_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 1517f9708..770e385a3 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -1065,6 +1065,8 @@ static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *conte struct vkd3d_shader_cf_info *cf_info; unsigned int i;
+ context->location = instruction->location; + switch (instruction->handler_idx) { case VKD3DSIH_DCL_CONSTANT_BUFFER: @@ -1292,7 +1294,6 @@ static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *conte } }
- ++context->location.line; return VKD3D_OK; }
This merge request was approved by Henri Verbeet.