[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