mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-31 22:50:08 +01:00
ARB prog parser: new set_src_reg(), set_dst_reg() helpers
These functions do sanity checks on the register file and index.
This commit is contained in:
parent
a71edc9455
commit
df5615de1f
1 changed files with 55 additions and 28 deletions
|
|
@ -66,8 +66,14 @@ static int validate_inputs(struct YYLTYPE *locp,
|
|||
|
||||
static void init_dst_reg(struct prog_dst_register *r);
|
||||
|
||||
static void set_dst_reg(struct prog_dst_register *r,
|
||||
gl_register_file file, GLint index);
|
||||
|
||||
static void init_src_reg(struct asm_src_register *r);
|
||||
|
||||
static void set_src_reg(struct asm_src_register *r,
|
||||
gl_register_file file, GLint index);
|
||||
|
||||
static void asm_instruction_set_operands(struct asm_instruction *inst,
|
||||
const struct prog_dst_register *dst, const struct asm_src_register *src0,
|
||||
const struct asm_src_register *src1, const struct asm_src_register *src2);
|
||||
|
|
@ -580,9 +586,7 @@ scalarUse: srcReg scalarSuffix
|
|||
temp_sym.param_binding_begin = ~0;
|
||||
initialize_symbol_from_const(state->prog, & temp_sym, & $1);
|
||||
|
||||
init_src_reg(& $$);
|
||||
$$.Base.File = PROGRAM_CONSTANT;
|
||||
$$.Base.Index = temp_sym.param_binding_begin;
|
||||
set_src_reg(& $$, PROGRAM_CONSTANT, temp_sym.param_binding_begin);
|
||||
}
|
||||
;
|
||||
|
||||
|
|
@ -644,9 +648,7 @@ maskedDstReg: dstReg optionalMask optionalCcMask
|
|||
|
||||
maskedAddrReg: addrReg addrWriteMask
|
||||
{
|
||||
init_dst_reg(& $$);
|
||||
$$.File = PROGRAM_ADDRESS;
|
||||
$$.Index = 0;
|
||||
set_dst_reg(& $$, PROGRAM_ADDRESS, 0);
|
||||
$$.WriteMask = $2.mask;
|
||||
}
|
||||
;
|
||||
|
|
@ -776,16 +778,13 @@ srcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */
|
|||
init_src_reg(& $$);
|
||||
switch (s->type) {
|
||||
case at_temp:
|
||||
$$.Base.File = PROGRAM_TEMPORARY;
|
||||
$$.Base.Index = s->temp_binding;
|
||||
set_src_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding);
|
||||
break;
|
||||
case at_param:
|
||||
$$.Base.File = s->param_binding_type;
|
||||
$$.Base.Index = s->param_binding_begin;
|
||||
set_src_reg(& $$, s->param_binding_type, s->param_binding_begin);
|
||||
break;
|
||||
case at_attrib:
|
||||
$$.Base.File = PROGRAM_INPUT;
|
||||
$$.Base.Index = s->attrib_binding;
|
||||
set_src_reg(& $$, PROGRAM_INPUT, s->attrib_binding);
|
||||
state->prog->InputsRead |= (1U << $$.Base.Index);
|
||||
|
||||
if (!validate_inputs(& @1, state)) {
|
||||
|
|
@ -800,9 +799,7 @@ srcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */
|
|||
}
|
||||
| attribBinding
|
||||
{
|
||||
init_src_reg(& $$);
|
||||
$$.Base.File = PROGRAM_INPUT;
|
||||
$$.Base.Index = $1;
|
||||
set_src_reg(& $$, PROGRAM_INPUT, $1);
|
||||
state->prog->InputsRead |= (1U << $$.Base.Index);
|
||||
|
||||
if (!validate_inputs(& @1, state)) {
|
||||
|
|
@ -832,19 +829,16 @@ srcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */
|
|||
}
|
||||
| paramSingleItemUse
|
||||
{
|
||||
init_src_reg(& $$);
|
||||
$$.Base.File = ($1.name != NULL)
|
||||
gl_register_file file = ($1.name != NULL)
|
||||
? $1.param_binding_type
|
||||
: PROGRAM_CONSTANT;
|
||||
$$.Base.Index = $1.param_binding_begin;
|
||||
set_src_reg(& $$, file, $1.param_binding_begin);
|
||||
}
|
||||
;
|
||||
|
||||
dstReg: resultBinding
|
||||
{
|
||||
init_dst_reg(& $$);
|
||||
$$.File = PROGRAM_OUTPUT;
|
||||
$$.Index = $1;
|
||||
set_dst_reg(& $$, PROGRAM_OUTPUT, $1);
|
||||
}
|
||||
| USED_IDENTIFIER /* temporaryReg | vertexResultReg */
|
||||
{
|
||||
|
|
@ -859,19 +853,15 @@ dstReg: resultBinding
|
|||
YYERROR;
|
||||
}
|
||||
|
||||
init_dst_reg(& $$);
|
||||
switch (s->type) {
|
||||
case at_temp:
|
||||
$$.File = PROGRAM_TEMPORARY;
|
||||
$$.Index = s->temp_binding;
|
||||
set_dst_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding);
|
||||
break;
|
||||
case at_output:
|
||||
$$.File = PROGRAM_OUTPUT;
|
||||
$$.Index = s->output_binding;
|
||||
set_dst_reg(& $$, PROGRAM_OUTPUT, s->output_binding);
|
||||
break;
|
||||
default:
|
||||
$$.File = s->param_binding_type;
|
||||
$$.Index = s->param_binding_begin;
|
||||
set_dst_reg(& $$, s->param_binding_type, s->param_binding_begin);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -2263,6 +2253,26 @@ init_dst_reg(struct prog_dst_register *r)
|
|||
}
|
||||
|
||||
|
||||
/** Like init_dst_reg() but set the File and Index fields. */
|
||||
void
|
||||
set_dst_reg(struct prog_dst_register *r, gl_register_file file, GLint index)
|
||||
{
|
||||
const GLint maxIndex = 1 << INST_INDEX_BITS;
|
||||
const GLint minIndex = 0;
|
||||
ASSERT(index >= minIndex);
|
||||
ASSERT(index <= maxIndex);
|
||||
ASSERT(file == PROGRAM_TEMPORARY ||
|
||||
file == PROGRAM_ADDRESS ||
|
||||
file == PROGRAM_OUTPUT);
|
||||
memset(r, 0, sizeof(*r));
|
||||
r->File = file;
|
||||
r->Index = index;
|
||||
r->WriteMask = WRITEMASK_XYZW;
|
||||
r->CondMask = COND_TR;
|
||||
r->CondSwizzle = SWIZZLE_NOOP;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
init_src_reg(struct asm_src_register *r)
|
||||
{
|
||||
|
|
@ -2273,6 +2283,23 @@ init_src_reg(struct asm_src_register *r)
|
|||
}
|
||||
|
||||
|
||||
/** Like init_src_reg() but set the File and Index fields. */
|
||||
void
|
||||
set_src_reg(struct asm_src_register *r, gl_register_file file, GLint index)
|
||||
{
|
||||
const GLint maxIndex = (1 << INST_INDEX_BITS) - 1;
|
||||
const GLint minIndex = -(1 << INST_INDEX_BITS);
|
||||
ASSERT(index >= minIndex);
|
||||
ASSERT(index <= maxIndex);
|
||||
ASSERT(file < PROGRAM_FILE_MAX);
|
||||
memset(r, 0, sizeof(*r));
|
||||
r->Base.File = file;
|
||||
r->Base.Index = index;
|
||||
r->Base.Swizzle = SWIZZLE_NOOP;
|
||||
r->Symbol = NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validate the set of inputs used by a program
|
||||
*
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue