mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
libs/vkd3d-shader: Make SPIR-V builder responsible for emitting OpTypeSampler once.
This commit is contained in:
parent
da6c724c3b
commit
acb683690b
@ -135,6 +135,7 @@ struct vkd3d_spirv_builder
|
|||||||
uint32_t current_id;
|
uint32_t current_id;
|
||||||
uint32_t main_function_id;
|
uint32_t main_function_id;
|
||||||
uint32_t type_id[VKD3D_TYPE_COUNT][VKD3D_VEC4_SIZE];
|
uint32_t type_id[VKD3D_TYPE_COUNT][VKD3D_VEC4_SIZE];
|
||||||
|
uint32_t type_sampler_id;
|
||||||
|
|
||||||
struct vkd3d_spirv_stream debug_stream; /* debug instructions */
|
struct vkd3d_spirv_stream debug_stream; /* debug instructions */
|
||||||
struct vkd3d_spirv_stream annotation_stream; /* decoration instructions */
|
struct vkd3d_spirv_stream annotation_stream; /* decoration instructions */
|
||||||
@ -254,6 +255,16 @@ static void vkd3d_spirv_build_string(struct vkd3d_spirv_stream *stream,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef uint32_t (*spirv_build_pfn)(struct vkd3d_spirv_builder *builder);
|
||||||
|
|
||||||
|
static uint32_t vkd3d_spirv_build_once(struct vkd3d_spirv_builder *builder,
|
||||||
|
uint32_t *id, spirv_build_pfn build_pfn)
|
||||||
|
{
|
||||||
|
if (!(*id))
|
||||||
|
*id = build_pfn(builder);
|
||||||
|
return *id;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* vkd3d_spirv_build_op[1-3][v]()
|
* vkd3d_spirv_build_op[1-3][v]()
|
||||||
* vkd3d_spirv_build_op_[t][r][1-3][v]()
|
* vkd3d_spirv_build_op_[t][r][1-3][v]()
|
||||||
@ -558,6 +569,11 @@ static uint32_t vkd3d_spirv_build_op_type_sampler(struct vkd3d_spirv_builder *bu
|
|||||||
return vkd3d_spirv_build_op_r(builder, &builder->global_stream, SpvOpTypeSampler);
|
return vkd3d_spirv_build_op_r(builder, &builder->global_stream, SpvOpTypeSampler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t vkd3d_spirv_get_op_type_sampler(struct vkd3d_spirv_builder *builder)
|
||||||
|
{
|
||||||
|
return vkd3d_spirv_build_once(builder, &builder->type_sampler_id, vkd3d_spirv_build_op_type_sampler);
|
||||||
|
}
|
||||||
|
|
||||||
/* Access qualifiers are not supported. */
|
/* Access qualifiers are not supported. */
|
||||||
static uint32_t vkd3d_spirv_build_op_type_image(struct vkd3d_spirv_builder *builder,
|
static uint32_t vkd3d_spirv_build_op_type_image(struct vkd3d_spirv_builder *builder,
|
||||||
uint32_t sampled_type_id, SpvDim dim, uint32_t depth, uint32_t arrayed,
|
uint32_t sampled_type_id, SpvDim dim, uint32_t depth, uint32_t arrayed,
|
||||||
@ -1111,7 +1127,6 @@ struct vkd3d_dxbc_compiler
|
|||||||
uint32_t options;
|
uint32_t options;
|
||||||
|
|
||||||
struct rb_tree symbol_table;
|
struct rb_tree symbol_table;
|
||||||
uint32_t sampler_type_id;
|
|
||||||
uint32_t temp_id;
|
uint32_t temp_id;
|
||||||
unsigned int temp_count;
|
unsigned int temp_count;
|
||||||
|
|
||||||
@ -1195,13 +1210,6 @@ static void vkd3d_dxbc_compiler_put_symbol(struct vkd3d_dxbc_compiler *compiler,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t vkd3d_dxbc_compiler_get_sampler_type_id(struct vkd3d_dxbc_compiler *compiler)
|
|
||||||
{
|
|
||||||
if (!compiler->sampler_type_id)
|
|
||||||
compiler->sampler_type_id = vkd3d_spirv_build_op_type_sampler(&compiler->spirv_builder);
|
|
||||||
return compiler->sampler_type_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t vkd3d_dxbc_compiler_get_pointer_type(struct vkd3d_dxbc_compiler *compiler,
|
static uint32_t vkd3d_dxbc_compiler_get_pointer_type(struct vkd3d_dxbc_compiler *compiler,
|
||||||
uint32_t type_id, SpvStorageClass storage_class)
|
uint32_t type_id, SpvStorageClass storage_class)
|
||||||
{
|
{
|
||||||
@ -2127,7 +2135,7 @@ static void vkd3d_dxbc_compiler_emit_dcl_sampler(struct vkd3d_dxbc_compiler *com
|
|||||||
|
|
||||||
sampler_idx = reg->idx[0].offset;
|
sampler_idx = reg->idx[0].offset;
|
||||||
|
|
||||||
type_id = vkd3d_dxbc_compiler_get_sampler_type_id(compiler);
|
type_id = vkd3d_spirv_get_op_type_sampler(builder);
|
||||||
ptr_type_id = vkd3d_dxbc_compiler_get_pointer_type(compiler, type_id, storage_class);
|
ptr_type_id = vkd3d_dxbc_compiler_get_pointer_type(compiler, type_id, storage_class);
|
||||||
var_id = vkd3d_spirv_build_op_variable(builder, &builder->global_stream,
|
var_id = vkd3d_spirv_build_op_variable(builder, &builder->global_stream,
|
||||||
ptr_type_id, storage_class, 0);
|
ptr_type_id, storage_class, 0);
|
||||||
@ -2836,7 +2844,7 @@ static uint32_t vkd3d_dxbc_compiler_prepare_sampled_image(struct vkd3d_dxbc_comp
|
|||||||
resource_symbol->info.resource.type_id, resource_symbol->id, SpvMemoryAccessMaskNone);
|
resource_symbol->info.resource.type_id, resource_symbol->id, SpvMemoryAccessMaskNone);
|
||||||
sampler_var_id = vkd3d_dxbc_compiler_get_register_id(compiler, sampler_reg);
|
sampler_var_id = vkd3d_dxbc_compiler_get_register_id(compiler, sampler_reg);
|
||||||
sampler_id = vkd3d_spirv_build_op_load(builder,
|
sampler_id = vkd3d_spirv_build_op_load(builder,
|
||||||
vkd3d_dxbc_compiler_get_sampler_type_id(compiler), sampler_var_id, SpvMemoryAccessMaskNone);
|
vkd3d_spirv_get_op_type_sampler(builder), sampler_var_id, SpvMemoryAccessMaskNone);
|
||||||
|
|
||||||
/* FIXME: Avoid duplicated sampled image types. */
|
/* FIXME: Avoid duplicated sampled image types. */
|
||||||
sampled_image_type_id = vkd3d_spirv_build_op_type_sampled_image(builder,
|
sampled_image_type_id = vkd3d_spirv_build_op_type_sampled_image(builder,
|
||||||
|
Loading…
Reference in New Issue
Block a user