mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/spirv: Add non-uniform decorations.
Based in part on vkd3d-proton patches by Philip Rebohle and Hans-Kristian Arntzen. Signed-off-by: Conor McCarthy <cmccarthy@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
cd2df526e1
commit
821bb0c5cf
@@ -1838,7 +1838,8 @@ static bool vkd3d_spirv_compile_module(struct vkd3d_spirv_builder *builder,
|
|||||||
|| vkd3d_spirv_capability_is_enabled(builder, SpvCapabilitySampledImageArrayDynamicIndexing)
|
|| vkd3d_spirv_capability_is_enabled(builder, SpvCapabilitySampledImageArrayDynamicIndexing)
|
||||||
|| vkd3d_spirv_capability_is_enabled(builder, SpvCapabilityStorageBufferArrayDynamicIndexing)
|
|| vkd3d_spirv_capability_is_enabled(builder, SpvCapabilityStorageBufferArrayDynamicIndexing)
|
||||||
|| vkd3d_spirv_capability_is_enabled(builder, SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT)
|
|| vkd3d_spirv_capability_is_enabled(builder, SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT)
|
||||||
|| vkd3d_spirv_capability_is_enabled(builder, SpvCapabilityStorageImageArrayDynamicIndexing))
|
|| vkd3d_spirv_capability_is_enabled(builder, SpvCapabilityStorageImageArrayDynamicIndexing)
|
||||||
|
|| vkd3d_spirv_capability_is_enabled(builder, SpvCapabilityShaderNonUniformEXT))
|
||||||
vkd3d_spirv_build_op_extension(&stream, "SPV_EXT_descriptor_indexing");
|
vkd3d_spirv_build_op_extension(&stream, "SPV_EXT_descriptor_indexing");
|
||||||
|
|
||||||
if (builder->ext_instr_set_glsl_450)
|
if (builder->ext_instr_set_glsl_450)
|
||||||
@@ -2670,6 +2671,15 @@ static void vkd3d_dxbc_compiler_emit_descriptor_binding_for_reg(struct vkd3d_dxb
|
|||||||
vkd3d_dxbc_compiler_emit_descriptor_binding(compiler, variable_id, &binding);
|
vkd3d_dxbc_compiler_emit_descriptor_binding(compiler, variable_id, &binding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void vkd3d_dxbc_compiler_decorate_nonuniform(struct vkd3d_dxbc_compiler *compiler,
|
||||||
|
uint32_t expression_id)
|
||||||
|
{
|
||||||
|
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
||||||
|
|
||||||
|
vkd3d_spirv_enable_capability(builder, SpvCapabilityShaderNonUniformEXT);
|
||||||
|
vkd3d_spirv_build_op_decorate(builder, expression_id, SpvDecorationNonUniformEXT, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct vkd3d_symbol *vkd3d_dxbc_compiler_put_symbol(struct vkd3d_dxbc_compiler *compiler,
|
static const struct vkd3d_symbol *vkd3d_dxbc_compiler_put_symbol(struct vkd3d_dxbc_compiler *compiler,
|
||||||
const struct vkd3d_symbol *symbol)
|
const struct vkd3d_symbol *symbol)
|
||||||
{
|
{
|
||||||
@@ -3314,6 +3324,8 @@ static void vkd3d_dxbc_compiler_emit_dereference_register(struct vkd3d_dxbc_comp
|
|||||||
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, register_info->storage_class, type_id);
|
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, register_info->storage_class, type_id);
|
||||||
register_info->id = vkd3d_spirv_build_op_access_chain(builder, ptr_type_id,
|
register_info->id = vkd3d_spirv_build_op_access_chain(builder, ptr_type_id,
|
||||||
register_info->id, indexes, index_count);
|
register_info->id, indexes, index_count);
|
||||||
|
if (reg->non_uniform)
|
||||||
|
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, register_info->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7993,8 +8005,16 @@ static void vkd3d_dxbc_compiler_prepare_image(struct vkd3d_dxbc_compiler *compil
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
image->image_id = load ? vkd3d_spirv_build_op_load(builder,
|
if (load)
|
||||||
image->image_type_id, image->id, SpvMemoryAccessMaskNone) : 0;
|
{
|
||||||
|
image->image_id = vkd3d_spirv_build_op_load(builder, image->image_type_id, image->id, SpvMemoryAccessMaskNone);
|
||||||
|
if (resource_reg->non_uniform)
|
||||||
|
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, image->image_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
image->image_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
image->image_type_id = vkd3d_dxbc_compiler_get_image_type_id(compiler, resource_reg,
|
image->image_type_id = vkd3d_dxbc_compiler_get_image_type_id(compiler, resource_reg,
|
||||||
&symbol->info.resource.range, image->resource_type_info,
|
&symbol->info.resource.range, image->resource_type_info,
|
||||||
@@ -8023,9 +8043,14 @@ static void vkd3d_dxbc_compiler_prepare_image(struct vkd3d_dxbc_compiler *compil
|
|||||||
|
|
||||||
sampler_id = vkd3d_spirv_build_op_load(builder,
|
sampler_id = vkd3d_spirv_build_op_load(builder,
|
||||||
vkd3d_spirv_get_op_type_sampler(builder), sampler_var_id, SpvMemoryAccessMaskNone);
|
vkd3d_spirv_get_op_type_sampler(builder), sampler_var_id, SpvMemoryAccessMaskNone);
|
||||||
|
if (sampler_reg->non_uniform)
|
||||||
|
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, sampler_id);
|
||||||
|
|
||||||
sampled_image_type_id = vkd3d_spirv_get_op_type_sampled_image(builder, image->image_type_id);
|
sampled_image_type_id = vkd3d_spirv_get_op_type_sampled_image(builder, image->image_type_id);
|
||||||
image->sampled_image_id = vkd3d_spirv_build_op_sampled_image(builder,
|
image->sampled_image_id = vkd3d_spirv_build_op_sampled_image(builder,
|
||||||
sampled_image_type_id, image->image_id, sampler_id);
|
sampled_image_type_id, image->image_id, sampler_id);
|
||||||
|
if (resource_reg->non_uniform)
|
||||||
|
vkd3d_dxbc_compiler_decorate_nonuniform(compiler, image->sampled_image_id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -34999,7 +34999,7 @@ static void test_unbounded_resource_arrays(void)
|
|||||||
D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
|
D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE);
|
||||||
get_buffer_readback_with_command_list(output_buffers[i], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
|
get_buffer_readback_with_command_list(output_buffers[i], DXGI_FORMAT_R32_UINT, &rb, queue, command_list);
|
||||||
/* Buffers at index >= 64 are aliased. */
|
/* Buffers at index >= 64 are aliased. */
|
||||||
todo_if(i != 10 && i != 74)
|
todo_if(i != 74)
|
||||||
check_readback_data_uint(&rb, NULL, (i < 64 ? 63 - i : 127 - i) ^ 0x35, 0);
|
check_readback_data_uint(&rb, NULL, (i < 64 ? 63 - i : 127 - i) ^ 0x35, 0);
|
||||||
release_resource_readback(&rb);
|
release_resource_readback(&rb);
|
||||||
reset_command_list(command_list, context.allocator);
|
reset_command_list(command_list, context.allocator);
|
||||||
@@ -35146,7 +35146,6 @@ static void test_unbounded_samplers(void)
|
|||||||
{
|
{
|
||||||
unsigned int value = get_readback_uint(&rb, i, 0, 0);
|
unsigned int value = get_readback_uint(&rb, i, 0, 0);
|
||||||
unsigned int expected = (i & 1) ? 100 : 10;
|
unsigned int expected = (i & 1) ? 100 : 10;
|
||||||
todo_if(i & 1)
|
|
||||||
ok(value == expected, "Got %u, expected %u at %u.\n", value, expected, i);
|
ok(value == expected, "Got %u, expected %u at %u.\n", value, expected, i);
|
||||||
}
|
}
|
||||||
release_resource_readback(&rb);
|
release_resource_readback(&rb);
|
||||||
|
Reference in New Issue
Block a user