mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 06:58:05 +02:00
Fix ARB_position_invariant handling
This commit is contained in:
parent
93d0935ef7
commit
1bcc323857
1 changed files with 116 additions and 6 deletions
|
|
@ -351,6 +351,24 @@ static unsigned long op_operands(enum prog_opcode opcode)
|
|||
SWIZZLE_ZERO, SWIZZLE_ZERO, \
|
||||
t_src_class(src[2].File), VSF_FLAG_NONE)
|
||||
|
||||
#define ONE_SRC_0 MAKE_VSF_SOURCE(t_src_index(vp, &src[0]), \
|
||||
SWIZZLE_ONE, SWIZZLE_ONE, \
|
||||
SWIZZLE_ONE, SWIZZLE_ONE, \
|
||||
t_src_class(src[0].File), VSF_FLAG_NONE)
|
||||
|
||||
#define ONE_SRC_1 MAKE_VSF_SOURCE(t_src_index(vp, &src[1]), \
|
||||
SWIZZLE_ONE, SWIZZLE_ONE, \
|
||||
SWIZZLE_ONE, SWIZZLE_ONE, \
|
||||
t_src_class(src[1].File), VSF_FLAG_NONE)
|
||||
|
||||
#define ONE_SRC_2 MAKE_VSF_SOURCE(t_src_index(vp, &src[2]), \
|
||||
SWIZZLE_ONE, SWIZZLE_ONE, \
|
||||
SWIZZLE_ONE, SWIZZLE_ONE, \
|
||||
t_src_class(src[2].File), VSF_FLAG_NONE)
|
||||
|
||||
/* DP4 version seems to trigger some hw peculiarity */
|
||||
//#define PREFER_DP4
|
||||
|
||||
void translate_vertex_shader(struct r300_vertex_program *vp)
|
||||
{
|
||||
struct vertex_program *mesa_vp=(void *)vp;
|
||||
|
|
@ -365,6 +383,92 @@ void translate_vertex_shader(struct r300_vertex_program *vp)
|
|||
Smart enough to realize that it doesnt need it? */
|
||||
int u_temp_i=VSF_MAX_FRAGMENT_TEMPS-1;
|
||||
struct prog_src_register src[3];
|
||||
|
||||
if (mesa_vp->IsPositionInvariant) {
|
||||
struct program_parameter_list *paramList;
|
||||
GLint tokens[6] = { STATE_MATRIX, STATE_MVP, 0, 0, 0, STATE_MATRIX };
|
||||
|
||||
#ifdef PREFER_DP4
|
||||
tokens[5] = STATE_MATRIX;
|
||||
#else
|
||||
tokens[5] = STATE_MATRIX_TRANSPOSE;
|
||||
#endif
|
||||
paramList = mesa_vp->Base.Parameters;
|
||||
|
||||
vpi = malloc((mesa_vp->Base.NumInstructions + 4) * sizeof(struct prog_instruction));
|
||||
memset(vpi, 0, 4 * sizeof(struct prog_instruction));
|
||||
|
||||
for (i=0; i < 4; i++) {
|
||||
GLint idx;
|
||||
tokens[3] = tokens[4] = i;
|
||||
idx = _mesa_add_state_reference(paramList, tokens);
|
||||
#ifdef PREFER_DP4
|
||||
vpi[i].Opcode = OPCODE_DP4;
|
||||
vpi[i].StringPos = 0;
|
||||
vpi[i].Data = 0;
|
||||
|
||||
vpi[i].DstReg.File = PROGRAM_OUTPUT;
|
||||
vpi[i].DstReg.Index = VERT_RESULT_HPOS;
|
||||
vpi[i].DstReg.WriteMask = 1 << i;
|
||||
vpi[i].DstReg.CondMask = COND_TR;
|
||||
|
||||
vpi[i].SrcReg[0].File = PROGRAM_STATE_VAR;
|
||||
vpi[i].SrcReg[0].Index = idx;
|
||||
vpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W);
|
||||
|
||||
vpi[i].SrcReg[1].File = PROGRAM_INPUT;
|
||||
vpi[i].SrcReg[1].Index = VERT_ATTRIB_POS;
|
||||
vpi[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W);
|
||||
#else
|
||||
if (i == 0)
|
||||
vpi[i].Opcode = OPCODE_MUL;
|
||||
else
|
||||
vpi[i].Opcode = OPCODE_MAD;
|
||||
|
||||
vpi[i].StringPos = 0;
|
||||
vpi[i].Data = 0;
|
||||
|
||||
if (i == 3)
|
||||
vpi[i].DstReg.File = PROGRAM_OUTPUT;
|
||||
else
|
||||
vpi[i].DstReg.File = PROGRAM_TEMPORARY;
|
||||
vpi[i].DstReg.Index = 0;
|
||||
vpi[i].DstReg.WriteMask = 0xf;
|
||||
vpi[i].DstReg.CondMask = COND_TR;
|
||||
|
||||
vpi[i].SrcReg[0].File = PROGRAM_STATE_VAR;
|
||||
vpi[i].SrcReg[0].Index = idx;
|
||||
vpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W);
|
||||
|
||||
vpi[i].SrcReg[1].File = PROGRAM_INPUT;
|
||||
vpi[i].SrcReg[1].Index = VERT_ATTRIB_POS;
|
||||
vpi[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(i, i, i, i);
|
||||
|
||||
if (i > 0) {
|
||||
vpi[i].SrcReg[2].File = PROGRAM_TEMPORARY;
|
||||
vpi[i].SrcReg[2].Index = 0;
|
||||
vpi[i].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
memcpy(&vpi[i], mesa_vp->Base.Instructions, mesa_vp->Base.NumInstructions * sizeof(struct prog_instruction));
|
||||
|
||||
free(mesa_vp->Base.Instructions);
|
||||
|
||||
mesa_vp->Base.Instructions = vpi;
|
||||
|
||||
mesa_vp->Base.NumInstructions += 4;
|
||||
vpi = &mesa_vp->Base.Instructions[mesa_vp->Base.NumInstructions-1];
|
||||
|
||||
assert(vpi->Opcode == OPCODE_END);
|
||||
|
||||
mesa_vp->Base.InputsRead |= (1 << VERT_ATTRIB_POS);
|
||||
mesa_vp->Base.OutputsWritten |= (1 << VERT_RESULT_HPOS);
|
||||
|
||||
//fprintf(stderr, "IsPositionInvariant is set!\n");
|
||||
//_mesa_print_program(&mesa_vp->Base);
|
||||
}
|
||||
|
||||
vp->pos_end=0; /* Not supported yet */
|
||||
vp->program.length=0;
|
||||
|
|
@ -376,7 +480,7 @@ void translate_vertex_shader(struct r300_vertex_program *vp)
|
|||
for(i=0; i < VERT_RESULT_MAX; i++)
|
||||
vp->outputs[i] = -1;
|
||||
|
||||
//assert(mesa_vp->Base.OutputsWritten & (1 << VERT_RESULT_HPOS));
|
||||
assert(mesa_vp->Base.OutputsWritten & (1 << VERT_RESULT_HPOS));
|
||||
|
||||
/* Assign outputs */
|
||||
if(mesa_vp->Base.OutputsWritten & (1 << VERT_RESULT_HPOS))
|
||||
|
|
@ -492,17 +596,23 @@ void translate_vertex_shader(struct r300_vertex_program *vp)
|
|||
goto next;
|
||||
|
||||
case OPCODE_ADD:
|
||||
#if 1
|
||||
hw_op=(src[0].File == PROGRAM_TEMPORARY &&
|
||||
src[1].File == PROGRAM_TEMPORARY) ? R300_VPI_OUT_OP_MAD_2 : R300_VPI_OUT_OP_MAD;
|
||||
|
||||
o_inst->op=MAKE_VSF_OP(hw_op, t_dst_index(vp, &vpi->DstReg),
|
||||
t_dst_mask(vpi->DstReg.WriteMask), t_dst_class(vpi->DstReg.File));
|
||||
o_inst->src1=t_src(vp, &src[0]);
|
||||
o_inst->src2=MAKE_VSF_SOURCE(t_src_index(vp, &src[0]),
|
||||
SWIZZLE_ONE, SWIZZLE_ONE,
|
||||
SWIZZLE_ONE, SWIZZLE_ONE,
|
||||
t_src_class(src[0].File), VSF_FLAG_NONE);
|
||||
o_inst->src1=ONE_SRC_0;
|
||||
o_inst->src2=t_src(vp, &src[0]);
|
||||
o_inst->src3=t_src(vp, &src[1]);
|
||||
#else
|
||||
o_inst->op=MAKE_VSF_OP(R300_VPI_OUT_OP_ADD, t_dst_index(vp, &vpi->DstReg),
|
||||
t_dst_mask(vpi->DstReg.WriteMask), t_dst_class(vpi->DstReg.File));
|
||||
o_inst->src1=t_src(vp, &src[0]);
|
||||
o_inst->src2=t_src(vp, &src[1]);
|
||||
o_inst->src3=ZERO_SRC_1;
|
||||
|
||||
#endif
|
||||
goto next;
|
||||
|
||||
case OPCODE_MAD:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue