mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/tpf: Store a pointer to the vsir program in struct vkd3d_shader_sm4_parser.
This commit is contained in:
Notes:
Henri Verbeet
2025-08-21 16:35:47 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1685
@@ -1447,7 +1447,7 @@ static enum vkd3d_result shader_sm1_init(struct vkd3d_shader_sm1_parser *sm1, st
|
|||||||
code_size != ~(size_t)0 ? token_count / 4u + 4 : 16, VSIR_CF_STRUCTURED, normalisation_level))
|
code_size != ~(size_t)0 ? token_count / 4u + 4 : 16, VSIR_CF_STRUCTURED, normalisation_level))
|
||||||
return VKD3D_ERROR_OUT_OF_MEMORY;
|
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
vkd3d_shader_parser_init(&sm1->p, program, message_context, compile_info->source_name);
|
vkd3d_shader_parser_init(&sm1->p, message_context, compile_info->source_name);
|
||||||
sm1->program = program;
|
sm1->program = program;
|
||||||
sm1->ptr = sm1->start;
|
sm1->ptr = sm1->start;
|
||||||
|
|
||||||
|
@@ -10729,7 +10729,7 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, struct vsir_pro
|
|||||||
if (!vsir_program_init(program, compile_info, &version,
|
if (!vsir_program_init(program, compile_info, &version,
|
||||||
(count + (count >> 2)) / 2u + 10, VSIR_CF_BLOCKS, VSIR_NORMALISED_SM6))
|
(count + (count >> 2)) / 2u + 10, VSIR_CF_BLOCKS, VSIR_NORMALISED_SM6))
|
||||||
return VKD3D_ERROR_OUT_OF_MEMORY;
|
return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||||
vkd3d_shader_parser_init(&sm6->p, program, message_context, compile_info->source_name);
|
vkd3d_shader_parser_init(&sm6->p, message_context, compile_info->source_name);
|
||||||
sm6->ptr = &sm6->start[1];
|
sm6->ptr = &sm6->start[1];
|
||||||
sm6->bitpos = 2;
|
sm6->bitpos = 2;
|
||||||
sm6->program = program;
|
sm6->program = program;
|
||||||
|
@@ -665,6 +665,8 @@ struct vkd3d_shader_sm4_parser
|
|||||||
{
|
{
|
||||||
const uint32_t *start, *end, *ptr;
|
const uint32_t *start, *end, *ptr;
|
||||||
|
|
||||||
|
struct vsir_program *program;
|
||||||
|
|
||||||
enum vkd3d_shader_opcode phase;
|
enum vkd3d_shader_opcode phase;
|
||||||
bool has_control_point_phase;
|
bool has_control_point_phase;
|
||||||
unsigned int input_register_masks[MAX_REG_OUTPUT];
|
unsigned int input_register_masks[MAX_REG_OUTPUT];
|
||||||
@@ -764,7 +766,7 @@ static const enum vsir_data_type data_type_table[] =
|
|||||||
|
|
||||||
static bool shader_is_sm_5_1(const struct vkd3d_shader_sm4_parser *sm4)
|
static bool shader_is_sm_5_1(const struct vkd3d_shader_sm4_parser *sm4)
|
||||||
{
|
{
|
||||||
const struct vkd3d_shader_version *version = &sm4->p.program->shader_version;
|
const struct vkd3d_shader_version *version = &sm4->program->shader_version;
|
||||||
|
|
||||||
return version->major >= 5 && version->minor >= 1;
|
return version->major >= 5 && version->minor >= 1;
|
||||||
}
|
}
|
||||||
@@ -849,7 +851,7 @@ static void shader_sm4_read_shader_data(struct vkd3d_shader_instruction *ins, ui
|
|||||||
icb->element_count = icb_size / VKD3D_VEC4_SIZE;
|
icb->element_count = icb_size / VKD3D_VEC4_SIZE;
|
||||||
icb->is_null = false;
|
icb->is_null = false;
|
||||||
memcpy(icb->data, tokens, sizeof(*tokens) * icb_size);
|
memcpy(icb->data, tokens, sizeof(*tokens) * icb_size);
|
||||||
shader_instruction_array_add_icb(&priv->p.program->instructions, icb);
|
shader_instruction_array_add_icb(&priv->program->instructions, icb);
|
||||||
ins->declaration.icb = icb;
|
ins->declaration.icb = icb;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -971,7 +973,7 @@ static void shader_sm4_read_dcl_index_range(struct vkd3d_shader_instruction *ins
|
|||||||
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)
|
||||||
{
|
{
|
||||||
struct vkd3d_shader_index_range *index_range = &ins->declaration.index_range;
|
struct vkd3d_shader_index_range *index_range = &ins->declaration.index_range;
|
||||||
struct vsir_program *program = priv->p.program;
|
struct vsir_program *program = priv->program;
|
||||||
unsigned int i, register_idx, register_count;
|
unsigned int i, register_idx, register_count;
|
||||||
const struct shader_signature *signature;
|
const struct shader_signature *signature;
|
||||||
enum vkd3d_shader_register_type type;
|
enum vkd3d_shader_register_type type;
|
||||||
@@ -1094,14 +1096,14 @@ static void shader_sm4_read_dcl_output_topology(struct vkd3d_shader_instruction
|
|||||||
if (ins->declaration.primitive_type.type == VKD3D_PT_UNDEFINED)
|
if (ins->declaration.primitive_type.type == VKD3D_PT_UNDEFINED)
|
||||||
FIXME("Unhandled output primitive type %#x.\n", primitive_type);
|
FIXME("Unhandled output primitive type %#x.\n", primitive_type);
|
||||||
|
|
||||||
priv->p.program->output_topology = ins->declaration.primitive_type.type;
|
priv->program->output_topology = ins->declaration.primitive_type.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shader_sm4_read_dcl_input_primitive(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
static void shader_sm4_read_dcl_input_primitive(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
||||||
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
||||||
{
|
{
|
||||||
enum vkd3d_sm4_input_primitive_type primitive_type;
|
enum vkd3d_sm4_input_primitive_type primitive_type;
|
||||||
struct vsir_program *program = sm4->p.program;
|
struct vsir_program *program = sm4->program;
|
||||||
|
|
||||||
primitive_type = (opcode_token & VKD3D_SM4_PRIMITIVE_TYPE_MASK) >> VKD3D_SM4_PRIMITIVE_TYPE_SHIFT;
|
primitive_type = (opcode_token & VKD3D_SM4_PRIMITIVE_TYPE_MASK) >> VKD3D_SM4_PRIMITIVE_TYPE_SHIFT;
|
||||||
if (VKD3D_SM5_INPUT_PT_PATCH1 <= primitive_type && primitive_type <= VKD3D_SM5_INPUT_PT_PATCH32)
|
if (VKD3D_SM5_INPUT_PT_PATCH1 <= primitive_type && primitive_type <= VKD3D_SM5_INPUT_PT_PATCH32)
|
||||||
@@ -1129,7 +1131,7 @@ static void shader_sm4_read_dcl_input_primitive(struct vkd3d_shader_instruction
|
|||||||
static void shader_sm4_read_declaration_count(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
static void shader_sm4_read_declaration_count(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
||||||
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
||||||
{
|
{
|
||||||
struct vsir_program *program = sm4->p.program;
|
struct vsir_program *program = sm4->program;
|
||||||
|
|
||||||
ins->declaration.count = *tokens;
|
ins->declaration.count = *tokens;
|
||||||
if (opcode == VKD3D_SM4_OP_DCL_TEMPS)
|
if (opcode == VKD3D_SM4_OP_DCL_TEMPS)
|
||||||
@@ -1161,7 +1163,7 @@ static void shader_sm4_read_dcl_input_ps(struct vkd3d_shader_instruction *ins, u
|
|||||||
if (shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], VSIR_DATA_F32, dst))
|
if (shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], VSIR_DATA_F32, dst))
|
||||||
{
|
{
|
||||||
struct signature_element *e = vsir_signature_find_element_for_reg(
|
struct signature_element *e = vsir_signature_find_element_for_reg(
|
||||||
&priv->p.program->input_signature, dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
&priv->program->input_signature, dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
||||||
|
|
||||||
if (!e)
|
if (!e)
|
||||||
{
|
{
|
||||||
@@ -1187,7 +1189,7 @@ static void shader_sm4_read_dcl_input_ps_siv(struct vkd3d_shader_instruction *in
|
|||||||
if (shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], VSIR_DATA_F32, dst))
|
if (shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], VSIR_DATA_F32, dst))
|
||||||
{
|
{
|
||||||
struct signature_element *e = vsir_signature_find_element_for_reg(
|
struct signature_element *e = vsir_signature_find_element_for_reg(
|
||||||
&priv->p.program->input_signature, dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
&priv->program->input_signature, dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
||||||
|
|
||||||
if (!e)
|
if (!e)
|
||||||
{
|
{
|
||||||
@@ -1220,7 +1222,7 @@ static void shader_sm4_read_dcl_global_flags(struct vkd3d_shader_instruction *in
|
|||||||
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
||||||
{
|
{
|
||||||
ins->declaration.global_flags = (opcode_token & VKD3D_SM4_GLOBAL_FLAGS_MASK) >> VKD3D_SM4_GLOBAL_FLAGS_SHIFT;
|
ins->declaration.global_flags = (opcode_token & VKD3D_SM4_GLOBAL_FLAGS_MASK) >> VKD3D_SM4_GLOBAL_FLAGS_SHIFT;
|
||||||
sm4->p.program->global_flags = ins->declaration.global_flags;
|
sm4->program->global_flags = ins->declaration.global_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shader_sm5_read_fcall(struct vkd3d_shader_instruction *ins, uint32_t opcode, uint32_t opcode_token,
|
static void shader_sm5_read_fcall(struct vkd3d_shader_instruction *ins, uint32_t opcode, uint32_t opcode_token,
|
||||||
@@ -1256,7 +1258,7 @@ static void shader_sm5_read_dcl_interface(struct vkd3d_shader_instruction *ins,
|
|||||||
static void shader_sm5_read_control_point_count(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
static void shader_sm5_read_control_point_count(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
||||||
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
||||||
{
|
{
|
||||||
struct vsir_program *program = sm4->p.program;
|
struct vsir_program *program = sm4->program;
|
||||||
|
|
||||||
ins->declaration.count = (opcode_token & VKD3D_SM5_CONTROL_POINT_COUNT_MASK)
|
ins->declaration.count = (opcode_token & VKD3D_SM5_CONTROL_POINT_COUNT_MASK)
|
||||||
>> VKD3D_SM5_CONTROL_POINT_COUNT_SHIFT;
|
>> VKD3D_SM5_CONTROL_POINT_COUNT_SHIFT;
|
||||||
@@ -1272,7 +1274,7 @@ static void shader_sm5_read_dcl_tessellator_domain(struct vkd3d_shader_instructi
|
|||||||
{
|
{
|
||||||
ins->declaration.tessellator_domain = (opcode_token & VKD3D_SM5_TESSELLATOR_MASK)
|
ins->declaration.tessellator_domain = (opcode_token & VKD3D_SM5_TESSELLATOR_MASK)
|
||||||
>> VKD3D_SM5_TESSELLATOR_SHIFT;
|
>> VKD3D_SM5_TESSELLATOR_SHIFT;
|
||||||
priv->p.program->tess_domain = ins->declaration.tessellator_domain;
|
priv->program->tess_domain = ins->declaration.tessellator_domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shader_sm5_read_dcl_tessellator_partitioning(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
static void shader_sm5_read_dcl_tessellator_partitioning(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
||||||
@@ -1280,7 +1282,7 @@ static void shader_sm5_read_dcl_tessellator_partitioning(struct vkd3d_shader_ins
|
|||||||
{
|
{
|
||||||
ins->declaration.tessellator_partitioning = (opcode_token & VKD3D_SM5_TESSELLATOR_MASK)
|
ins->declaration.tessellator_partitioning = (opcode_token & VKD3D_SM5_TESSELLATOR_MASK)
|
||||||
>> VKD3D_SM5_TESSELLATOR_SHIFT;
|
>> VKD3D_SM5_TESSELLATOR_SHIFT;
|
||||||
priv->p.program->tess_partitioning = ins->declaration.tessellator_partitioning;
|
priv->program->tess_partitioning = ins->declaration.tessellator_partitioning;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shader_sm5_read_dcl_tessellator_output_primitive(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
static void shader_sm5_read_dcl_tessellator_output_primitive(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
||||||
@@ -1288,7 +1290,7 @@ static void shader_sm5_read_dcl_tessellator_output_primitive(struct vkd3d_shader
|
|||||||
{
|
{
|
||||||
ins->declaration.tessellator_output_primitive = (opcode_token & VKD3D_SM5_TESSELLATOR_MASK)
|
ins->declaration.tessellator_output_primitive = (opcode_token & VKD3D_SM5_TESSELLATOR_MASK)
|
||||||
>> VKD3D_SM5_TESSELLATOR_SHIFT;
|
>> VKD3D_SM5_TESSELLATOR_SHIFT;
|
||||||
priv->p.program->tess_output_primitive = ins->declaration.tessellator_output_primitive;
|
priv->program->tess_output_primitive = ins->declaration.tessellator_output_primitive;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shader_sm5_read_dcl_hs_max_tessfactor(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
static void shader_sm5_read_dcl_hs_max_tessfactor(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
||||||
@@ -1300,7 +1302,7 @@ static void shader_sm5_read_dcl_hs_max_tessfactor(struct vkd3d_shader_instructio
|
|||||||
static void shader_sm5_read_dcl_thread_group(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
static void shader_sm5_read_dcl_thread_group(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
||||||
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *sm4)
|
||||||
{
|
{
|
||||||
struct vsir_program *program = sm4->p.program;
|
struct vsir_program *program = sm4->program;
|
||||||
|
|
||||||
ins->declaration.thread_group_size.x = *tokens++;
|
ins->declaration.thread_group_size.x = *tokens++;
|
||||||
ins->declaration.thread_group_size.y = *tokens++;
|
ins->declaration.thread_group_size.y = *tokens++;
|
||||||
@@ -2009,7 +2011,7 @@ static bool shader_sm4_read_reg_idx(struct vkd3d_shader_sm4_parser *priv, const
|
|||||||
{
|
{
|
||||||
if (addressing & VKD3D_SM4_ADDRESSING_RELATIVE)
|
if (addressing & VKD3D_SM4_ADDRESSING_RELATIVE)
|
||||||
{
|
{
|
||||||
struct vkd3d_shader_src_param *rel_addr = vsir_program_get_src_params(priv->p.program, 1);
|
struct vkd3d_shader_src_param *rel_addr = vsir_program_get_src_params(priv->program, 1);
|
||||||
|
|
||||||
if (!(reg_idx->rel_addr = rel_addr))
|
if (!(reg_idx->rel_addr = rel_addr))
|
||||||
{
|
{
|
||||||
@@ -2284,7 +2286,7 @@ static bool register_is_control_point_input(const struct vkd3d_shader_register *
|
|||||||
{
|
{
|
||||||
return reg->type == VKD3DSPR_INCONTROLPOINT || reg->type == VKD3DSPR_OUTCONTROLPOINT
|
return reg->type == VKD3DSPR_INCONTROLPOINT || reg->type == VKD3DSPR_OUTCONTROLPOINT
|
||||||
|| (reg->type == VKD3DSPR_INPUT && (priv->phase == VSIR_OP_HS_CONTROL_POINT_PHASE
|
|| (reg->type == VKD3DSPR_INPUT && (priv->phase == VSIR_OP_HS_CONTROL_POINT_PHASE
|
||||||
|| priv->p.program->shader_version.type == VKD3D_SHADER_TYPE_GEOMETRY));
|
|| priv->program->shader_version.type == VKD3D_SHADER_TYPE_GEOMETRY));
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t mask_from_swizzle(uint32_t swizzle)
|
static uint32_t mask_from_swizzle(uint32_t swizzle)
|
||||||
@@ -2608,8 +2610,8 @@ static void shader_sm4_read_instruction_modifier(uint32_t modifier, struct vkd3d
|
|||||||
static void shader_sm4_read_instruction(struct vkd3d_shader_sm4_parser *sm4, struct vkd3d_shader_instruction *ins)
|
static void shader_sm4_read_instruction(struct vkd3d_shader_sm4_parser *sm4, struct vkd3d_shader_instruction *ins)
|
||||||
{
|
{
|
||||||
const struct vkd3d_sm4_opcode_info *opcode_info;
|
const struct vkd3d_sm4_opcode_info *opcode_info;
|
||||||
struct vsir_program *program = sm4->p.program;
|
|
||||||
uint32_t opcode_token, opcode, previous_token;
|
uint32_t opcode_token, opcode, previous_token;
|
||||||
|
struct vsir_program *program = sm4->program;
|
||||||
struct vkd3d_shader_dst_param *dst_params;
|
struct vkd3d_shader_dst_param *dst_params;
|
||||||
struct vkd3d_shader_src_param *src_params;
|
struct vkd3d_shader_src_param *src_params;
|
||||||
const uint32_t **ptr = &sm4->ptr;
|
const uint32_t **ptr = &sm4->ptr;
|
||||||
@@ -2814,8 +2816,9 @@ static bool shader_sm4_init(struct vkd3d_shader_sm4_parser *sm4, struct vsir_pro
|
|||||||
if (!vsir_program_init(program, compile_info,
|
if (!vsir_program_init(program, compile_info,
|
||||||
&version, token_count / 7u + 20, VSIR_CF_STRUCTURED, VSIR_NORMALISED_SM4))
|
&version, token_count / 7u + 20, VSIR_CF_STRUCTURED, VSIR_NORMALISED_SM4))
|
||||||
return false;
|
return false;
|
||||||
vkd3d_shader_parser_init(&sm4->p, program, message_context, compile_info->source_name);
|
vkd3d_shader_parser_init(&sm4->p, message_context, compile_info->source_name);
|
||||||
sm4->ptr = sm4->start;
|
sm4->ptr = sm4->start;
|
||||||
|
sm4->program = program;
|
||||||
|
|
||||||
init_sm4_lookup_tables(&sm4->lookup);
|
init_sm4_lookup_tables(&sm4->lookup);
|
||||||
|
|
||||||
|
@@ -724,14 +724,13 @@ uint64_t vkd3d_shader_init_config_flags(void)
|
|||||||
return config_flags;
|
return config_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser, struct vsir_program *program,
|
void vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser,
|
||||||
struct vkd3d_shader_message_context *message_context, const char *source_name)
|
struct vkd3d_shader_message_context *message_context, const char *source_name)
|
||||||
{
|
{
|
||||||
parser->message_context = message_context;
|
parser->message_context = message_context;
|
||||||
parser->location.source_name = source_name;
|
parser->location.source_name = source_name;
|
||||||
parser->location.line = 1;
|
parser->location.line = 1;
|
||||||
parser->location.column = 0;
|
parser->location.column = 0;
|
||||||
parser->program = program;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VKD3D_PRINTF_FUNC(3, 4) vkd3d_shader_parser_error(struct vkd3d_shader_parser *parser,
|
void VKD3D_PRINTF_FUNC(3, 4) vkd3d_shader_parser_error(struct vkd3d_shader_parser *parser,
|
||||||
|
@@ -1651,13 +1651,12 @@ struct vkd3d_shader_parser
|
|||||||
{
|
{
|
||||||
struct vkd3d_shader_message_context *message_context;
|
struct vkd3d_shader_message_context *message_context;
|
||||||
struct vkd3d_shader_location location;
|
struct vkd3d_shader_location location;
|
||||||
struct vsir_program *program;
|
|
||||||
bool failed;
|
bool failed;
|
||||||
};
|
};
|
||||||
|
|
||||||
void vkd3d_shader_parser_error(struct vkd3d_shader_parser *parser,
|
void vkd3d_shader_parser_error(struct vkd3d_shader_parser *parser,
|
||||||
enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(3, 4);
|
enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(3, 4);
|
||||||
void vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser, struct vsir_program *program,
|
void vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser,
|
||||||
struct vkd3d_shader_message_context *message_context, const char *source_name);
|
struct vkd3d_shader_message_context *message_context, const char *source_name);
|
||||||
void vkd3d_shader_parser_warning(struct vkd3d_shader_parser *parser,
|
void vkd3d_shader_parser_warning(struct vkd3d_shader_parser *parser,
|
||||||
enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(3, 4);
|
enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(3, 4);
|
||||||
|
Reference in New Issue
Block a user