mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader/spirv: Avoid decorating variables multiple times with Coherent.
This commit is contained in:
parent
a47c23fa1f
commit
94c74d2c00
Notes:
Henri Verbeet
2024-08-20 21:33:46 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1005
@ -2157,6 +2157,7 @@ struct vkd3d_symbol_descriptor_array
|
|||||||
unsigned int binding;
|
unsigned int binding;
|
||||||
unsigned int push_constant_index;
|
unsigned int push_constant_index;
|
||||||
bool write_only;
|
bool write_only;
|
||||||
|
bool coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vkd3d_symbol_register_data
|
struct vkd3d_symbol_register_data
|
||||||
@ -6113,8 +6114,8 @@ static uint32_t spirv_compiler_build_descriptor_variable(struct spirv_compiler *
|
|||||||
struct vkd3d_shader_descriptor_binding binding;
|
struct vkd3d_shader_descriptor_binding binding;
|
||||||
const struct vkd3d_shader_descriptor_info1 *d;
|
const struct vkd3d_shader_descriptor_info1 *d;
|
||||||
uint32_t array_type_id, ptr_type_id, var_id;
|
uint32_t array_type_id, ptr_type_id, var_id;
|
||||||
|
bool write_only = false, coherent = false;
|
||||||
struct vkd3d_symbol symbol;
|
struct vkd3d_symbol symbol;
|
||||||
bool write_only = false;
|
|
||||||
struct rb_entry *entry;
|
struct rb_entry *entry;
|
||||||
|
|
||||||
binding = spirv_compiler_get_descriptor_binding(compiler, reg, range,
|
binding = spirv_compiler_get_descriptor_binding(compiler, reg, range,
|
||||||
@ -6143,6 +6144,8 @@ static uint32_t spirv_compiler_build_descriptor_variable(struct spirv_compiler *
|
|||||||
{
|
{
|
||||||
d = spirv_compiler_get_descriptor_info(compiler, VKD3D_SHADER_DESCRIPTOR_TYPE_UAV, range);
|
d = spirv_compiler_get_descriptor_info(compiler, VKD3D_SHADER_DESCRIPTOR_TYPE_UAV, range);
|
||||||
write_only = !(d->flags & VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_READ);
|
write_only = !(d->flags & VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_READ);
|
||||||
|
/* ROVs are implicitly globally coherent. */
|
||||||
|
coherent = d->uav_flags & (VKD3DSUF_GLOBALLY_COHERENT | VKD3DSUF_RASTERISER_ORDERED_VIEW);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Declare one array variable per Vulkan binding, and use it for
|
/* Declare one array variable per Vulkan binding, and use it for
|
||||||
@ -6154,6 +6157,7 @@ static uint32_t spirv_compiler_build_descriptor_variable(struct spirv_compiler *
|
|||||||
symbol.key.descriptor_array.binding = binding.binding;
|
symbol.key.descriptor_array.binding = binding.binding;
|
||||||
symbol.key.descriptor_array.push_constant_index = binding_address.push_constant_index;
|
symbol.key.descriptor_array.push_constant_index = binding_address.push_constant_index;
|
||||||
symbol.key.descriptor_array.write_only = write_only;
|
symbol.key.descriptor_array.write_only = write_only;
|
||||||
|
symbol.key.descriptor_array.coherent = coherent;
|
||||||
if ((entry = rb_get(&compiler->symbol_table, &symbol)))
|
if ((entry = rb_get(&compiler->symbol_table, &symbol)))
|
||||||
{
|
{
|
||||||
var_info->array_symbol = RB_ENTRY_VALUE(entry, struct vkd3d_symbol, entry);
|
var_info->array_symbol = RB_ENTRY_VALUE(entry, struct vkd3d_symbol, entry);
|
||||||
@ -6167,6 +6171,8 @@ static uint32_t spirv_compiler_build_descriptor_variable(struct spirv_compiler *
|
|||||||
|
|
||||||
if (write_only)
|
if (write_only)
|
||||||
vkd3d_spirv_build_op_decorate(builder, var_id, SpvDecorationNonReadable, NULL, 0);
|
vkd3d_spirv_build_op_decorate(builder, var_id, SpvDecorationNonReadable, NULL, 0);
|
||||||
|
if (coherent)
|
||||||
|
vkd3d_spirv_build_op_decorate(builder, var_id, SpvDecorationCoherent, NULL, 0);
|
||||||
|
|
||||||
symbol.id = var_id;
|
symbol.id = var_id;
|
||||||
symbol.descriptor_array = NULL;
|
symbol.descriptor_array = NULL;
|
||||||
@ -6513,10 +6519,6 @@ static void spirv_compiler_emit_resource_declaration(struct spirv_compiler *comp
|
|||||||
|
|
||||||
d = spirv_compiler_get_descriptor_info(compiler, VKD3D_SHADER_DESCRIPTOR_TYPE_UAV, range);
|
d = spirv_compiler_get_descriptor_info(compiler, VKD3D_SHADER_DESCRIPTOR_TYPE_UAV, range);
|
||||||
|
|
||||||
/* ROVs are implicitly globally coherent. */
|
|
||||||
if (d->uav_flags & (VKD3DSUF_GLOBALLY_COHERENT | VKD3DSUF_RASTERISER_ORDERED_VIEW))
|
|
||||||
vkd3d_spirv_build_op_decorate(builder, var_id, SpvDecorationCoherent, NULL, 0);
|
|
||||||
|
|
||||||
if (d->uav_flags & VKD3DSUF_RASTERISER_ORDERED_VIEW)
|
if (d->uav_flags & VKD3DSUF_RASTERISER_ORDERED_VIEW)
|
||||||
{
|
{
|
||||||
if (compiler->shader_type != VKD3D_SHADER_TYPE_PIXEL)
|
if (compiler->shader_type != VKD3D_SHADER_TYPE_PIXEL)
|
||||||
|
Loading…
Reference in New Issue
Block a user