From: Conor McCarthy cmccarthy@codeweavers.com
--- include/vkd3d_shader.h | 3 +++ libs/vkd3d-shader/vkd3d_shader_main.c | 27 +++++++++++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index e98aad4f..6926c750 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -1339,6 +1339,9 @@ enum vkd3d_shader_descriptor_info_flag /** The descriptor is a UAV resource, on which the shader performs * atomic ops. \since 1.6 */ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_ATOMICS = 0x00000008, + /** The descriptor is a UAV resource, which is globally coherent. + * \since 1.9 */ + VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_GLOBALLY_COHERENT = 0x00000010,
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_DESCRIPTOR_INFO_FLAG), }; diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index 3a2432c1..5b8d9c38 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -814,20 +814,29 @@ static void vkd3d_shader_scan_sampler_declaration(struct vkd3d_shader_scan_conte }
static void vkd3d_shader_scan_resource_declaration(struct vkd3d_shader_scan_context *context, - const struct vkd3d_shader_resource *resource, enum vkd3d_shader_resource_type resource_type, - enum vkd3d_shader_resource_data_type resource_data_type) + const struct vkd3d_shader_instruction *instruction, const struct vkd3d_shader_resource *resource, + enum vkd3d_shader_resource_type resource_type, enum vkd3d_shader_resource_data_type resource_data_type) { enum vkd3d_shader_descriptor_type type; + unsigned int flags = 0;
if (!context->scan_descriptor_info) return;
if (resource->reg.reg.type == VKD3DSPR_UAV) + { + if (instruction->flags & VKD3DSUF_GLOBALLY_COHERENT) + flags = VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_GLOBALLY_COHERENT; type = VKD3D_SHADER_DESCRIPTOR_TYPE_UAV; + } else + { + if (instruction->flags) + FIXME("Unhandled flags %#x for SRV.\n", instruction->flags); type = VKD3D_SHADER_DESCRIPTOR_TYPE_SRV; + } vkd3d_shader_scan_add_descriptor(context, type, &resource->reg.reg, &resource->range, - resource_type, resource_data_type, 0); + resource_type, resource_data_type, flags); }
static void vkd3d_shader_scan_typed_resource_declaration(struct vkd3d_shader_scan_context *context, @@ -885,7 +894,7 @@ static void vkd3d_shader_scan_typed_resource_declaration(struct vkd3d_shader_sca resource_data_type = VKD3D_SHADER_RESOURCE_DATA_FLOAT; }
- vkd3d_shader_scan_resource_declaration(context, &semantic->resource, + vkd3d_shader_scan_resource_declaration(context, instruction, &semantic->resource, semantic->resource_type, resource_data_type); }
@@ -919,13 +928,15 @@ static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *conte break; case VKD3DSIH_DCL_RESOURCE_RAW: case VKD3DSIH_DCL_UAV_RAW: - vkd3d_shader_scan_resource_declaration(context, &instruction->declaration.raw_resource.resource, - VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT); + vkd3d_shader_scan_resource_declaration(context, instruction, + &instruction->declaration.raw_resource.resource, VKD3D_SHADER_RESOURCE_BUFFER, + VKD3D_SHADER_RESOURCE_DATA_UINT); break; case VKD3DSIH_DCL_RESOURCE_STRUCTURED: case VKD3DSIH_DCL_UAV_STRUCTURED: - vkd3d_shader_scan_resource_declaration(context, &instruction->declaration.structured_resource.resource, - VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_SHADER_RESOURCE_DATA_UINT); + vkd3d_shader_scan_resource_declaration(context, instruction, + &instruction->declaration.structured_resource.resource, VKD3D_SHADER_RESOURCE_BUFFER, + VKD3D_SHADER_RESOURCE_DATA_UINT); break; case VKD3DSIH_IF: cf_info = vkd3d_shader_scan_push_cf_info(context);