mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader: Record a global temporary count per sm4 shader.
Store it in the shader_desc, and declare temps from that when compiling SPIR-V, instead of parsing dcl_instructions. As part of this change, we declare a single, global temps array (with Private scope instead of Function) which is as large as the maximum of all dcl_temps instructions. It is not clear to me whether this will improve, hurt, or have no significant effect on the lower-level compiler. An alternative is to still redeclare a new temps array every time (although still with a smaller size).
This commit is contained in:
parent
dfb2a316e6
commit
e489098878
Notes:
Alexandre Julliard
2023-07-04 23:25:44 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/255
@ -3217,7 +3217,7 @@ static bool spirv_compiler_get_register_info(const struct spirv_compiler *compil
|
|||||||
{
|
{
|
||||||
assert(reg->idx[0].offset < compiler->temp_count);
|
assert(reg->idx[0].offset < compiler->temp_count);
|
||||||
register_info->id = compiler->temp_id + reg->idx[0].offset;
|
register_info->id = compiler->temp_id + reg->idx[0].offset;
|
||||||
register_info->storage_class = SpvStorageClassFunction;
|
register_info->storage_class = SpvStorageClassPrivate;
|
||||||
register_info->descriptor_array = NULL;
|
register_info->descriptor_array = NULL;
|
||||||
register_info->member_idx = 0;
|
register_info->member_idx = 0;
|
||||||
register_info->component_type = VKD3D_SHADER_COMPONENT_FLOAT;
|
register_info->component_type = VKD3D_SHADER_COMPONENT_FLOAT;
|
||||||
@ -5258,8 +5258,7 @@ static void spirv_compiler_emit_dcl_global_flags(struct spirv_compiler *compiler
|
|||||||
WARN("Unhandled global flags %#x.\n", flags);
|
WARN("Unhandled global flags %#x.\n", flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spirv_compiler_emit_dcl_temps(struct spirv_compiler *compiler,
|
static void spirv_compiler_emit_temps(struct spirv_compiler *compiler, uint32_t count)
|
||||||
const struct vkd3d_shader_instruction *instruction)
|
|
||||||
{
|
{
|
||||||
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
||||||
size_t function_location;
|
size_t function_location;
|
||||||
@ -5270,11 +5269,11 @@ static void spirv_compiler_emit_dcl_temps(struct spirv_compiler *compiler,
|
|||||||
vkd3d_spirv_begin_function_stream_insertion(builder, function_location);
|
vkd3d_spirv_begin_function_stream_insertion(builder, function_location);
|
||||||
|
|
||||||
assert(!compiler->temp_count);
|
assert(!compiler->temp_count);
|
||||||
compiler->temp_count = instruction->declaration.count;
|
compiler->temp_count = count;
|
||||||
for (i = 0; i < compiler->temp_count; ++i)
|
for (i = 0; i < compiler->temp_count; ++i)
|
||||||
{
|
{
|
||||||
id = spirv_compiler_emit_variable(compiler, &builder->function_stream,
|
id = spirv_compiler_emit_variable(compiler, &builder->global_stream,
|
||||||
SpvStorageClassFunction, VKD3D_SHADER_COMPONENT_FLOAT, VKD3D_VEC4_SIZE);
|
SpvStorageClassPrivate, VKD3D_SHADER_COMPONENT_FLOAT, VKD3D_VEC4_SIZE);
|
||||||
if (!i)
|
if (!i)
|
||||||
compiler->temp_id = id;
|
compiler->temp_id = id;
|
||||||
assert(id == compiler->temp_id + i);
|
assert(id == compiler->temp_id + i);
|
||||||
@ -6236,9 +6235,6 @@ static void spirv_compiler_leave_shader_phase(struct spirv_compiler *compiler)
|
|||||||
|
|
||||||
vkd3d_spirv_build_op_function_end(builder);
|
vkd3d_spirv_build_op_function_end(builder);
|
||||||
|
|
||||||
compiler->temp_id = 0;
|
|
||||||
compiler->temp_count = 0;
|
|
||||||
|
|
||||||
if (is_in_control_point_phase(compiler))
|
if (is_in_control_point_phase(compiler))
|
||||||
{
|
{
|
||||||
if (compiler->epilogue_function_id)
|
if (compiler->epilogue_function_id)
|
||||||
@ -9103,9 +9099,6 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler,
|
|||||||
case VKD3DSIH_DCL_GLOBAL_FLAGS:
|
case VKD3DSIH_DCL_GLOBAL_FLAGS:
|
||||||
spirv_compiler_emit_dcl_global_flags(compiler, instruction);
|
spirv_compiler_emit_dcl_global_flags(compiler, instruction);
|
||||||
break;
|
break;
|
||||||
case VKD3DSIH_DCL_TEMPS:
|
|
||||||
spirv_compiler_emit_dcl_temps(compiler, instruction);
|
|
||||||
break;
|
|
||||||
case VKD3DSIH_DCL_INDEXABLE_TEMP:
|
case VKD3DSIH_DCL_INDEXABLE_TEMP:
|
||||||
spirv_compiler_emit_dcl_indexable_temp(compiler, instruction);
|
spirv_compiler_emit_dcl_indexable_temp(compiler, instruction);
|
||||||
break;
|
break;
|
||||||
@ -9426,6 +9419,7 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler,
|
|||||||
spirv_compiler_emit_cut_stream(compiler, instruction);
|
spirv_compiler_emit_cut_stream(compiler, instruction);
|
||||||
break;
|
break;
|
||||||
case VKD3DSIH_DCL_HS_MAX_TESSFACTOR:
|
case VKD3DSIH_DCL_HS_MAX_TESSFACTOR:
|
||||||
|
case VKD3DSIH_DCL_TEMPS:
|
||||||
case VKD3DSIH_HS_DECLS:
|
case VKD3DSIH_HS_DECLS:
|
||||||
case VKD3DSIH_NOP:
|
case VKD3DSIH_NOP:
|
||||||
/* nothing to do */
|
/* nothing to do */
|
||||||
@ -9448,6 +9442,9 @@ static int spirv_compiler_generate_spirv(struct spirv_compiler *compiler,
|
|||||||
enum vkd3d_result result = VKD3D_OK;
|
enum vkd3d_result result = VKD3D_OK;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
if (parser->shader_desc.temp_count)
|
||||||
|
spirv_compiler_emit_temps(compiler, parser->shader_desc.temp_count);
|
||||||
|
|
||||||
compiler->location.column = 0;
|
compiler->location.column = 0;
|
||||||
compiler->location.line = 1;
|
compiler->location.line = 1;
|
||||||
|
|
||||||
|
@ -989,6 +989,8 @@ static void shader_sm4_read_declaration_count(struct vkd3d_shader_instruction *i
|
|||||||
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *priv)
|
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *priv)
|
||||||
{
|
{
|
||||||
ins->declaration.count = *tokens;
|
ins->declaration.count = *tokens;
|
||||||
|
if (opcode == VKD3D_SM4_OP_DCL_TEMPS)
|
||||||
|
priv->p.shader_desc.temp_count = max(priv->p.shader_desc.temp_count, *tokens);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shader_sm4_read_declaration_dst(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
static void shader_sm4_read_declaration_dst(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
||||||
|
@ -829,6 +829,8 @@ struct vkd3d_shader_desc
|
|||||||
struct shader_signature input_signature;
|
struct shader_signature input_signature;
|
||||||
struct shader_signature output_signature;
|
struct shader_signature output_signature;
|
||||||
struct shader_signature patch_constant_signature;
|
struct shader_signature patch_constant_signature;
|
||||||
|
|
||||||
|
uint32_t temp_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vkd3d_shader_register_semantic
|
struct vkd3d_shader_register_semantic
|
||||||
|
Loading…
x
Reference in New Issue
Block a user