[PATCH vkd3d v2 6/6] vkd3d-shader: Create descriptor array symbols for resources.
Henri Verbeet
hverbeet at gmail.com
Thu Jul 22 04:14:06 CDT 2021
On Mon, 19 Jul 2021 at 09:22, Conor McCarthy
<conor.mccarthy6 at bigpond.com> wrote:
> -static void vkd3d_dxbc_compiler_emit_descriptor_binding_for_reg(struct vkd3d_dxbc_compiler *compiler,
> - uint32_t variable_id, const struct vkd3d_shader_register *reg, const struct vkd3d_shader_register_range *range,
> - enum vkd3d_shader_resource_type resource_type, bool is_uav_counter)
> -{
> - struct vkd3d_shader_descriptor_binding binding;
> - unsigned int binding_base_idx; /* Value not used. */
> -
> - binding = vkd3d_dxbc_compiler_get_descriptor_binding(compiler, reg, range,
> - resource_type, is_uav_counter, &binding_base_idx);
> - vkd3d_dxbc_compiler_emit_descriptor_binding(compiler, variable_id, &binding);
> -}
> -
[...]
> @@ -5758,41 +5742,41 @@ static void vkd3d_dxbc_compiler_emit_resource_declaration(struct vkd3d_dxbc_comp
> {
> assert(structure_stride); /* counters are valid only for structured buffers */
>
> - counter_type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT, 1);
> if (vkd3d_dxbc_compiler_is_opengl_target(compiler))
> {
> + counter_type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT, 1);
> vkd3d_spirv_enable_capability(builder, SpvCapabilityAtomicStorage);
> storage_class = SpvStorageClassAtomicCounter;
> - ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, counter_type_id);
> }
> else if (compiler->ssbo_uavs)
> {
> - uint32_t length_id, array_type_id, struct_id;
> + uint32_t length_id, array_type_id;
>
> length_id = vkd3d_dxbc_compiler_get_constant_uint(compiler, 1);
> - array_type_id = vkd3d_spirv_build_op_type_array(builder, counter_type_id, length_id);
> + array_type_id = vkd3d_spirv_build_op_type_array(builder, vkd3d_spirv_get_type_id(builder,
> + VKD3D_SHADER_COMPONENT_UINT, 1), length_id);
> vkd3d_spirv_build_op_decorate1(builder, array_type_id, SpvDecorationArrayStride, 4);
>
> - struct_id = vkd3d_spirv_build_op_type_struct(builder, &array_type_id, 1);
> - vkd3d_spirv_build_op_decorate(builder, struct_id, SpvDecorationBufferBlock, NULL, 0);
> - vkd3d_spirv_build_op_member_decorate1(builder, struct_id, 0, SpvDecorationOffset, 0);
> + counter_type_id = vkd3d_spirv_build_op_type_struct(builder, &array_type_id, 1);
> + vkd3d_spirv_build_op_decorate(builder, counter_type_id, SpvDecorationBufferBlock, NULL, 0);
> + vkd3d_spirv_build_op_member_decorate1(builder, counter_type_id, 0, SpvDecorationOffset, 0);
>
> storage_class = SpvStorageClassUniform;
> - ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, struct_id);
> + }
> + else
> + {
> + counter_type_id = type_id;
> }
>
> - counter_var_id = vkd3d_spirv_build_op_variable(builder, &builder->global_stream,
> - ptr_type_id, storage_class, 0);
> -
> - vkd3d_dxbc_compiler_emit_descriptor_binding_for_reg(compiler,
> - counter_var_id, reg, &resource->range, resource_type, true);
> -
> - vkd3d_spirv_build_op_name(builder, counter_var_id, "u%u_counter", reg->idx[0].offset);
> + /* TODO: UAV counter descriptor arrays. */
> + counter_var_id = vkd3d_dxbc_compiler_build_descriptor_variable(compiler, storage_class,
> + counter_type_id, reg, &resource->range, resource_type, true, &counter_array_symbol);
> }
> }
Most of this seems like a separate change from the rest of the patch.
More information about the wine-devel
mailing list