[Mesa-dev] [PATCH 14/16] mesa: Change program parser instruction storage.
Eric Anholt
eric at anholt.net
Wed May 28 11:37:45 PDT 2014
This is in preparation for making prog_instruction be a list element --
I'm going to want to allocate the final instruction at this point, and
this gets a bunch of pointer type changes out of the way for that big
commit.
---
src/mesa/program/prog_parameter_layout.c | 16 ++++----
src/mesa/program/program_parse.y | 63 +++++++++++++++++++-------------
src/mesa/program/program_parser.h | 2 +-
3 files changed, 46 insertions(+), 35 deletions(-)
diff --git a/src/mesa/program/prog_parameter_layout.c b/src/mesa/program/prog_parameter_layout.c
index e834690..e6ec559 100644
--- a/src/mesa/program/prog_parameter_layout.c
+++ b/src/mesa/program/prog_parameter_layout.c
@@ -150,8 +150,8 @@ _mesa_layout_parameters(struct asm_parser_state *state)
* array. Now that the base of the parameter array is known, the
* index can be updated to its actual value.
*/
- inst->Base.SrcReg[i] = inst->SrcReg[i].Base;
- inst->Base.SrcReg[i].Index +=
+ inst->Base->SrcReg[i] = inst->SrcReg[i].Base;
+ inst->Base->SrcReg[i].Index +=
inst->SrcReg[i].Symbol->param_binding_begin;
}
}
@@ -178,7 +178,7 @@ _mesa_layout_parameters(struct asm_parser_state *state)
continue;
}
- inst->Base.SrcReg[i] = inst->SrcReg[i].Base;
+ inst->Base->SrcReg[i] = inst->SrcReg[i].Base;
p = & state->prog->Parameters->Parameters[idx];
switch (p->Type) {
@@ -186,16 +186,16 @@ _mesa_layout_parameters(struct asm_parser_state *state)
const gl_constant_value *const v =
state->prog->Parameters->ParameterValues[idx];
- inst->Base.SrcReg[i].Index =
+ inst->Base->SrcReg[i].Index =
_mesa_add_unnamed_constant(layout, v, p->Size, & swizzle);
- inst->Base.SrcReg[i].Swizzle =
- _mesa_combine_swizzles(swizzle, inst->Base.SrcReg[i].Swizzle);
+ inst->Base->SrcReg[i].Swizzle =
+ _mesa_combine_swizzles(swizzle, inst->Base->SrcReg[i].Swizzle);
break;
}
case PROGRAM_STATE_VAR:
- inst->Base.SrcReg[i].Index =
+ inst->Base->SrcReg[i].Index =
_mesa_add_state_reference(layout, p->StateIndexes);
break;
@@ -204,7 +204,7 @@ _mesa_layout_parameters(struct asm_parser_state *state)
}
inst->SrcReg[i].Base.File = p->Type;
- inst->Base.SrcReg[i].File = p->Type;
+ inst->Base->SrcReg[i].File = p->Type;
}
}
diff --git a/src/mesa/program/program_parse.y b/src/mesa/program/program_parse.y
index 1664740..f6ec7e5 100644
--- a/src/mesa/program/program_parse.y
+++ b/src/mesa/program/program_parse.y
@@ -429,18 +429,18 @@ SAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',
GLbitfield target_mask = 0;
- $$->Base.TexSrcUnit = $6;
+ $$->Base->TexSrcUnit = $6;
if ($8 < 0) {
shadow_tex = tex_mask;
- $$->Base.TexSrcTarget = -$8;
- $$->Base.TexShadow = 1;
+ $$->Base->TexSrcTarget = -$8;
+ $$->Base->TexShadow = 1;
} else {
- $$->Base.TexSrcTarget = $8;
+ $$->Base->TexSrcTarget = $8;
}
- target_mask = (1U << $$->Base.TexSrcTarget);
+ target_mask = (1U << $$->Base->TexSrcTarget);
/* If this texture unit was previously accessed and that access
* had a different texture target, generate an error.
@@ -472,8 +472,8 @@ KIL_instruction: KIL swizzleSrcReg
| KIL ccTest
{
$$ = asm_instruction_ctor(OPCODE_KIL_NV, NULL, NULL, NULL, NULL);
- $$->Base.DstReg.CondMask = $2.CondMask;
- $$->Base.DstReg.CondSwizzle = $2.CondSwizzle;
+ $$->Base->DstReg.CondMask = $2.CondMask;
+ $$->Base->DstReg.CondSwizzle = $2.CondSwizzle;
state->fragment.UsesKill = 1;
}
;
@@ -487,18 +487,18 @@ TXD_instruction: TXD_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg ',' swi
GLbitfield target_mask = 0;
- $$->Base.TexSrcUnit = $10;
+ $$->Base->TexSrcUnit = $10;
if ($12 < 0) {
shadow_tex = tex_mask;
- $$->Base.TexSrcTarget = -$12;
- $$->Base.TexShadow = 1;
+ $$->Base->TexSrcTarget = -$12;
+ $$->Base->TexShadow = 1;
} else {
- $$->Base.TexSrcTarget = $12;
+ $$->Base->TexSrcTarget = $12;
}
- target_mask = (1U << $$->Base.TexSrcTarget);
+ target_mask = (1U << $$->Base->TexSrcTarget);
/* If this texture unit was previously accessed and that access
* had a different texture target, generate an error.
@@ -2241,30 +2241,30 @@ asm_instruction_set_operands(struct asm_instruction *inst,
* destination register.
*/
if (dst == NULL) {
- init_dst_reg(& inst->Base.DstReg);
+ init_dst_reg(& inst->Base->DstReg);
} else {
- inst->Base.DstReg = *dst;
+ inst->Base->DstReg = *dst;
}
/* The only instruction that doesn't have any source registers is the
* condition-code based KIL instruction added by NV_fragment_program_option.
*/
if (src0 != NULL) {
- inst->Base.SrcReg[0] = src0->Base;
+ inst->Base->SrcReg[0] = src0->Base;
inst->SrcReg[0] = *src0;
} else {
init_src_reg(& inst->SrcReg[0]);
}
if (src1 != NULL) {
- inst->Base.SrcReg[1] = src1->Base;
+ inst->Base->SrcReg[1] = src1->Base;
inst->SrcReg[1] = *src1;
} else {
init_src_reg(& inst->SrcReg[1]);
}
if (src2 != NULL) {
- inst->Base.SrcReg[2] = src2->Base;
+ inst->Base->SrcReg[2] = src2->Base;
inst->SrcReg[2] = *src2;
} else {
init_src_reg(& inst->SrcReg[2]);
@@ -2282,8 +2282,13 @@ asm_instruction_ctor(gl_inst_opcode op,
struct asm_instruction *inst = CALLOC_STRUCT(asm_instruction);
if (inst) {
- _mesa_init_instructions(& inst->Base, 1);
- inst->Base.Opcode = op;
+ inst->Base = _mesa_alloc_instructions(1);
+ if (!inst->Base) {
+ free(inst);
+ return NULL;
+ }
+ _mesa_init_instructions(inst->Base, 1);
+ inst->Base->Opcode = op;
asm_instruction_set_operands(inst, dst, src0, src1, src2);
}
@@ -2302,12 +2307,17 @@ asm_instruction_copy_ctor(const struct prog_instruction *base,
struct asm_instruction *inst = CALLOC_STRUCT(asm_instruction);
if (inst) {
- _mesa_init_instructions(& inst->Base, 1);
- inst->Base.Opcode = base->Opcode;
- inst->Base.CondUpdate = base->CondUpdate;
- inst->Base.CondDst = base->CondDst;
- inst->Base.SaturateMode = base->SaturateMode;
- inst->Base.Precision = base->Precision;
+ inst->Base = _mesa_alloc_instructions(1);
+ if (!inst->Base) {
+ free(inst);
+ return NULL;
+ }
+ _mesa_init_instructions(inst->Base, 1);
+ inst->Base->Opcode = base->Opcode;
+ inst->Base->CondUpdate = base->CondUpdate;
+ inst->Base->CondDst = base->CondDst;
+ inst->Base->SaturateMode = base->SaturateMode;
+ inst->Base->Precision = base->Precision;
asm_instruction_set_operands(inst, dst, src0, src1, src2);
}
@@ -2758,7 +2768,7 @@ _mesa_parse_arb_program(struct gl_context *ctx, GLenum target, const GLubyte *st
for (i = 0; i < state->prog->NumInstructions; i++) {
struct asm_instruction *const temp = inst->next;
- state->prog->Instructions[i] = inst->Base;
+ state->prog->Instructions[i] = *inst->Base;
inst = temp;
}
@@ -2788,6 +2798,7 @@ _mesa_parse_arb_program(struct gl_context *ctx, GLenum target, const GLubyte *st
error:
for (inst = state->inst_head; inst != NULL; inst = temp) {
temp = inst->next;
+ _mesa_free_instructions(inst->Base, 1);
free(inst);
}
diff --git a/src/mesa/program/program_parser.h b/src/mesa/program/program_parser.h
index 04c64f4..53d3e7f 100644
--- a/src/mesa/program/program_parser.h
+++ b/src/mesa/program/program_parser.h
@@ -122,7 +122,7 @@ struct asm_src_register {
struct asm_instruction {
- struct prog_instruction Base;
+ struct prog_instruction *Base;
struct asm_instruction *next;
struct asm_src_register SrcReg[3];
};
--
2.0.0.rc2
More information about the mesa-dev
mailing list