libs/vkd3d-shader: Store structure stride in symbol table.

This commit is contained in:
Józef Kucia 2017-08-22 14:53:33 +02:00
parent 18a7e62b3f
commit 6c5d8da24d
2 changed files with 21 additions and 34 deletions

View File

@ -1552,11 +1552,18 @@ struct vkd3d_symbol_resource
unsigned int idx; unsigned int idx;
}; };
struct vkd3d_symbol_register_data
{
SpvStorageClass storage_class;
uint32_t member_idx;
};
struct vkd3d_symbol_resource_data struct vkd3d_symbol_resource_data
{ {
enum vkd3d_component_type sampled_type; enum vkd3d_component_type sampled_type;
uint32_t type_id; uint32_t type_id;
const struct vkd3d_spirv_resource_type *resource_type_info; const struct vkd3d_spirv_resource_type *resource_type_info;
unsigned int structure_stride;
}; };
struct vkd3d_symbol struct vkd3d_symbol
@ -1578,11 +1585,7 @@ struct vkd3d_symbol
uint32_t id; uint32_t id;
union union
{ {
struct struct vkd3d_symbol_register_data reg;
{
SpvStorageClass storage_class;
uint32_t member_idx;
} reg;
struct vkd3d_symbol_resource_data resource; struct vkd3d_symbol_resource_data resource;
} info; } info;
}; };
@ -1719,8 +1722,6 @@ struct vkd3d_dxbc_compiler
uint32_t private_output_variable[MAX_REG_OUTPUT + 1]; /* 1 entry for oDepth */ uint32_t private_output_variable[MAX_REG_OUTPUT + 1]; /* 1 entry for oDepth */
uint32_t output_setup_function_id; uint32_t output_setup_function_id;
uint32_t default_sampler_id; uint32_t default_sampler_id;
unsigned int uav_stride[MAX_UNORDERED_ACCESS_VIEWS];
unsigned int resource_stride[MAX_SHADER_RESOURCE_VIEWS];
const struct vkd3d_shader_scan_info *scan_info; const struct vkd3d_shader_scan_info *scan_info;
}; };
@ -3033,7 +3034,7 @@ static uint32_t vkd3d_dxbc_compiler_get_image_type_id(struct vkd3d_dxbc_compiler
static void vkd3d_dxbc_compiler_emit_resource_declaration(struct vkd3d_dxbc_compiler *compiler, static void vkd3d_dxbc_compiler_emit_resource_declaration(struct vkd3d_dxbc_compiler *compiler,
const struct vkd3d_shader_register *reg, enum vkd3d_shader_resource_type resource_type, const struct vkd3d_shader_register *reg, enum vkd3d_shader_resource_type resource_type,
enum vkd3d_data_type resource_data_type) enum vkd3d_data_type resource_data_type, unsigned int structure_stride)
{ {
const SpvStorageClass storage_class = SpvStorageClassUniformConstant; const SpvStorageClass storage_class = SpvStorageClassUniformConstant;
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder; struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
@ -3068,6 +3069,7 @@ static void vkd3d_dxbc_compiler_emit_resource_declaration(struct vkd3d_dxbc_comp
resource_symbol.info.resource.sampled_type = sampled_type; resource_symbol.info.resource.sampled_type = sampled_type;
resource_symbol.info.resource.type_id = type_id; resource_symbol.info.resource.type_id = type_id;
resource_symbol.info.resource.resource_type_info = resource_type_info; resource_symbol.info.resource.resource_type_info = resource_type_info;
resource_symbol.info.resource.structure_stride = structure_stride;
vkd3d_dxbc_compiler_put_symbol(compiler, &resource_symbol); vkd3d_dxbc_compiler_put_symbol(compiler, &resource_symbol);
} }
@ -3076,14 +3078,14 @@ static void vkd3d_dxbc_compiler_emit_dcl_resource(struct vkd3d_dxbc_compiler *co
{ {
const struct vkd3d_shader_semantic *semantic = &instruction->declaration.semantic; const struct vkd3d_shader_semantic *semantic = &instruction->declaration.semantic;
vkd3d_dxbc_compiler_emit_resource_declaration(compiler, &semantic->reg.reg, vkd3d_dxbc_compiler_emit_resource_declaration(compiler, &semantic->reg.reg,
semantic->resource_type, semantic->resource_data_type); semantic->resource_type, semantic->resource_data_type, 0);
} }
static void vkd3d_dxbc_compiler_emit_dcl_resource_raw(struct vkd3d_dxbc_compiler *compiler, static void vkd3d_dxbc_compiler_emit_dcl_resource_raw(struct vkd3d_dxbc_compiler *compiler,
const struct vkd3d_shader_instruction *instruction) const struct vkd3d_shader_instruction *instruction)
{ {
vkd3d_dxbc_compiler_emit_resource_declaration(compiler, &instruction->declaration.dst.reg, vkd3d_dxbc_compiler_emit_resource_declaration(compiler, &instruction->declaration.dst.reg,
VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_DATA_UINT); VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_DATA_UINT, 0);
} }
static void vkd3d_dxbc_compiler_emit_dcl_uav_raw(struct vkd3d_dxbc_compiler *compiler, static void vkd3d_dxbc_compiler_emit_dcl_uav_raw(struct vkd3d_dxbc_compiler *compiler,
@ -3093,7 +3095,7 @@ static void vkd3d_dxbc_compiler_emit_dcl_uav_raw(struct vkd3d_dxbc_compiler *com
FIXME("Unhandled UAV flags %#x.\n", instruction->flags); FIXME("Unhandled UAV flags %#x.\n", instruction->flags);
vkd3d_dxbc_compiler_emit_resource_declaration(compiler, &instruction->declaration.dst.reg, vkd3d_dxbc_compiler_emit_resource_declaration(compiler, &instruction->declaration.dst.reg,
VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_DATA_UINT); VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_DATA_UINT, 0);
} }
static void vkd3d_dxbc_compiler_emit_dcl_resource_structured(struct vkd3d_dxbc_compiler *compiler, static void vkd3d_dxbc_compiler_emit_dcl_resource_structured(struct vkd3d_dxbc_compiler *compiler,
@ -3101,15 +3103,9 @@ static void vkd3d_dxbc_compiler_emit_dcl_resource_structured(struct vkd3d_dxbc_c
{ {
const struct vkd3d_shader_register *reg = &instruction->declaration.structured_resource.reg.reg; const struct vkd3d_shader_register *reg = &instruction->declaration.structured_resource.reg.reg;
unsigned int stride = instruction->declaration.structured_resource.byte_stride; unsigned int stride = instruction->declaration.structured_resource.byte_stride;
unsigned int resource_index = reg->idx[0].offset;
if (resource_index < ARRAY_SIZE(compiler->resource_stride))
compiler->resource_stride[resource_index] = stride / 4;
else
FIXME("Unexpected resource register index %u.\n", resource_index);
vkd3d_dxbc_compiler_emit_resource_declaration(compiler, reg, vkd3d_dxbc_compiler_emit_resource_declaration(compiler, reg,
VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_DATA_UINT); VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_DATA_UINT, stride / 4);
} }
static void vkd3d_dxbc_compiler_emit_dcl_uav_structured(struct vkd3d_dxbc_compiler *compiler, static void vkd3d_dxbc_compiler_emit_dcl_uav_structured(struct vkd3d_dxbc_compiler *compiler,
@ -3117,18 +3113,12 @@ static void vkd3d_dxbc_compiler_emit_dcl_uav_structured(struct vkd3d_dxbc_compil
{ {
const struct vkd3d_shader_register *reg = &instruction->declaration.structured_resource.reg.reg; const struct vkd3d_shader_register *reg = &instruction->declaration.structured_resource.reg.reg;
unsigned int stride = instruction->declaration.structured_resource.byte_stride; unsigned int stride = instruction->declaration.structured_resource.byte_stride;
unsigned int uav_index = reg->idx[0].offset;
if (instruction->flags) if (instruction->flags)
FIXME("Unhandled UAV flags %#x.\n", instruction->flags); FIXME("Unhandled UAV flags %#x.\n", instruction->flags);
if (uav_index < ARRAY_SIZE(compiler->uav_stride))
compiler->uav_stride[uav_index] = stride / 4;
else
FIXME("Unexpected UAV register index %u.\n", uav_index);
vkd3d_dxbc_compiler_emit_resource_declaration(compiler, reg, vkd3d_dxbc_compiler_emit_resource_declaration(compiler, reg,
VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_DATA_UINT); VKD3D_SHADER_RESOURCE_BUFFER, VKD3D_DATA_UINT, stride / 4);
} }
static void vkd3d_dxbc_compiler_emit_dcl_uav_typed(struct vkd3d_dxbc_compiler *compiler, static void vkd3d_dxbc_compiler_emit_dcl_uav_typed(struct vkd3d_dxbc_compiler *compiler,
@ -3140,7 +3130,7 @@ static void vkd3d_dxbc_compiler_emit_dcl_uav_typed(struct vkd3d_dxbc_compiler *c
FIXME("Unhandled UAV flags %#x.\n", instruction->flags); FIXME("Unhandled UAV flags %#x.\n", instruction->flags);
vkd3d_dxbc_compiler_emit_resource_declaration(compiler, &semantic->reg.reg, vkd3d_dxbc_compiler_emit_resource_declaration(compiler, &semantic->reg.reg,
semantic->resource_type, semantic->resource_data_type); semantic->resource_type, semantic->resource_data_type, 0);
} }
static void vkd3d_dxbc_compiler_emit_dcl_input(struct vkd3d_dxbc_compiler *compiler, static void vkd3d_dxbc_compiler_emit_dcl_input(struct vkd3d_dxbc_compiler *compiler,
@ -4159,6 +4149,7 @@ struct vkd3d_shader_image
enum vkd3d_component_type sampled_type; enum vkd3d_component_type sampled_type;
uint32_t image_type_id; uint32_t image_type_id;
const struct vkd3d_spirv_resource_type *resource_type_info; const struct vkd3d_spirv_resource_type *resource_type_info;
unsigned int structure_stride;
}; };
#define VKD3D_IMAGE_FLAG_NONE 0x0 #define VKD3D_IMAGE_FLAG_NONE 0x0
@ -4186,6 +4177,7 @@ static void vkd3d_dxbc_compiler_prepare_image(struct vkd3d_dxbc_compiler *compil
image->sampled_type = resource_symbol->info.resource.sampled_type; image->sampled_type = resource_symbol->info.resource.sampled_type;
image->image_type_id = resource_symbol->info.resource.type_id; image->image_type_id = resource_symbol->info.resource.type_id;
image->resource_type_info = resource_symbol->info.resource.resource_type_info; image->resource_type_info = resource_symbol->info.resource.resource_type_info;
image->structure_stride = resource_symbol->info.resource.structure_stride;
image->id = resource_symbol->id; image->id = resource_symbol->id;
image->image_id = load ? vkd3d_spirv_build_op_load(builder, image->image_id = load ? vkd3d_spirv_build_op_load(builder,
@ -4360,11 +4352,9 @@ static void vkd3d_dxbc_compiler_emit_ld_structured_srv(struct vkd3d_dxbc_compile
uint32_t constituents[VKD3D_VEC4_SIZE]; uint32_t constituents[VKD3D_VEC4_SIZE];
struct vkd3d_shader_image image; struct vkd3d_shader_image image;
unsigned int i, component_count; unsigned int i, component_count;
unsigned int stride;
uint32_t zero = 0; uint32_t zero = 0;
resource = &src[instruction->src_count - 1]; resource = &src[instruction->src_count - 1];
stride = compiler->resource_stride[resource->reg.idx[0].offset];
/* OpImageFetch must be used with a sampled image. */ /* OpImageFetch must be used with a sampled image. */
vkd3d_dxbc_compiler_prepare_default_sampled_image(compiler, &image, &resource->reg); vkd3d_dxbc_compiler_prepare_default_sampled_image(compiler, &image, &resource->reg);
@ -4372,7 +4362,7 @@ static void vkd3d_dxbc_compiler_emit_ld_structured_srv(struct vkd3d_dxbc_compile
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_UINT, 1); type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_UINT, 1);
coordinate_id = vkd3d_dxbc_compiler_emit_buffer_addressing(compiler, coordinate_id = vkd3d_dxbc_compiler_emit_buffer_addressing(compiler,
type_id, stride, &src[0], &src[1]); type_id, image.structure_stride, &src[0], &src[1]);
texel_type_id = vkd3d_spirv_get_type_id(builder, image.sampled_type, VKD3D_VEC4_SIZE); texel_type_id = vkd3d_spirv_get_type_id(builder, image.sampled_type, VKD3D_VEC4_SIZE);
component_count = vkd3d_write_mask_component_count(dst->write_mask); component_count = vkd3d_write_mask_component_count(dst->write_mask);
@ -4434,7 +4424,6 @@ static void vkd3d_dxbc_compiler_emit_store_raw_structured(struct vkd3d_dxbc_comp
const struct vkd3d_shader_src_param *texel; const struct vkd3d_shader_src_param *texel;
struct vkd3d_shader_image image; struct vkd3d_shader_image image;
unsigned int i, component_count; unsigned int i, component_count;
unsigned int stride;
if (dst->reg.type == VKD3DSPR_GROUPSHAREDMEM) if (dst->reg.type == VKD3DSPR_GROUPSHAREDMEM)
{ {
@ -4443,17 +4432,16 @@ static void vkd3d_dxbc_compiler_emit_store_raw_structured(struct vkd3d_dxbc_comp
} }
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_UINT, 1); type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_UINT, 1);
stride = compiler->uav_stride[dst->reg.idx[0].offset];
vkd3d_dxbc_compiler_prepare_image(compiler, &image, &dst->reg, VKD3D_IMAGE_FLAG_NONE); vkd3d_dxbc_compiler_prepare_image(compiler, &image, &dst->reg, VKD3D_IMAGE_FLAG_NONE);
if (instruction->handler_idx == VKD3DSIH_STORE_STRUCTURED) if (instruction->handler_idx == VKD3DSIH_STORE_STRUCTURED)
{ {
coordinate_id = vkd3d_dxbc_compiler_emit_buffer_addressing(compiler, coordinate_id = vkd3d_dxbc_compiler_emit_buffer_addressing(compiler,
type_id, stride, &src[0], &src[1]); type_id, image.structure_stride, &src[0], &src[1]);
} }
else else
{ {
coordinate_id = vkd3d_dxbc_compiler_emit_buffer_addressing(compiler, coordinate_id = vkd3d_dxbc_compiler_emit_buffer_addressing(compiler,
type_id, stride, NULL, &src[0]); type_id, 0, NULL, &src[0]);
} }
/* Mesa Vulkan drivers require the texel parameter to be a 4-component /* Mesa Vulkan drivers require the texel parameter to be a 4-component

View File

@ -819,7 +819,6 @@ struct vkd3d_shader_signature_element *shader_find_signature_element(const struc
const char *semantic_name, unsigned int semantic_idx, unsigned int stream_idx) DECLSPEC_HIDDEN; const char *semantic_name, unsigned int semantic_idx, unsigned int stream_idx) DECLSPEC_HIDDEN;
void free_shader_desc(struct vkd3d_shader_desc *desc) DECLSPEC_HIDDEN; void free_shader_desc(struct vkd3d_shader_desc *desc) DECLSPEC_HIDDEN;
#define MAX_SHADER_RESOURCE_VIEWS 128
#define MAX_UNORDERED_ACCESS_VIEWS 8 #define MAX_UNORDERED_ACCESS_VIEWS 8
struct vkd3d_shader_scan_info struct vkd3d_shader_scan_info