r300: Cleaned up vertprog construction.

Construct the vertprog instruction in the 4 DWORD parts...

DWORD 0: Opcode and Output.
DWORD 1: First Argument.
DWORD 2: Second Argument.
DWORD 3: Third Argument.

Allow the opcode translation functions to generate more than one instruction;
useful for when an instruction must be emulated. FLR, XPD, etc.
This commit is contained in:
Oliver McFadden
2007-07-18 02:49:26 +00:00
parent fb4e071bed
commit 86ece0a920
4 changed files with 379 additions and 365 deletions
+1 -1
View File
@@ -568,7 +568,7 @@ struct r300_vertex_shader_fragment {
union {
GLuint d[VSF_MAX_FRAGMENT_LENGTH];
float f[VSF_MAX_FRAGMENT_LENGTH];
struct r300_vertprog_instruction i[VSF_MAX_FRAGMENT_LENGTH / 4];
GLuint i[VSF_MAX_FRAGMENT_LENGTH];
} body;
};
+15 -14
View File
@@ -1566,30 +1566,31 @@ static void r300SetupDefaultVertexProgram(r300ContextPtr rmesa)
for (i = VERT_ATTRIB_POS; i < VERT_ATTRIB_MAX; i++) {
if (rmesa->state.sw_tcl_inputs[i] != -1) {
prog->program.body.i[program_end].opcode = EASY_VSF_OP(MUL, o_reg++, ALL, RESULT);
prog->program.body.i[program_end].src[0] = VSF_REG(rmesa->state.sw_tcl_inputs[i]);
prog->program.body.i[program_end].src[1] = VSF_ATTR_UNITY(rmesa->state.sw_tcl_inputs[i]);
prog->program.body.i[program_end].src[2] = VSF_UNITY(rmesa->state.sw_tcl_inputs[i]);
program_end++;
prog->program.body.i[program_end + 0] = EASY_VSF_OP(MUL, o_reg++, ALL, RESULT);
prog->program.body.i[program_end + 1] = VSF_REG(rmesa->state.sw_tcl_inputs[i]);
prog->program.body.i[program_end + 2] = VSF_ATTR_UNITY(rmesa->state.sw_tcl_inputs[i]);
prog->program.body.i[program_end + 3] = VSF_UNITY(rmesa->state.sw_tcl_inputs[i]);
program_end += 4;
}
}
prog->program.length = program_end * 4;
prog->program.length = program_end;
r300SetupVertexProgramFragment(rmesa, R300_PVS_UPLOAD_PROGRAM, &(prog->program));
r300SetupVertexProgramFragment(rmesa, R300_PVS_UPLOAD_PROGRAM,
&(prog->program));
inst_count = (prog->program.length / 4) - 1;
R300_STATECHANGE(rmesa, pvs);
rmesa->hw.pvs.cmd[R300_PVS_CNTL_1] =
(0 << R300_PVS_CNTL_1_PROGRAM_START_SHIFT) |
(inst_count << R300_PVS_CNTL_1_POS_END_SHIFT) |
(inst_count << R300_PVS_CNTL_1_PROGRAM_END_SHIFT);
(0 << R300_PVS_CNTL_1_PROGRAM_START_SHIFT) |
(inst_count << R300_PVS_CNTL_1_POS_END_SHIFT) |
(inst_count << R300_PVS_CNTL_1_PROGRAM_END_SHIFT);
rmesa->hw.pvs.cmd[R300_PVS_CNTL_2] =
(0 << R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT) |
(param_count << R300_PVS_CNTL_2_PARAM_COUNT_SHIFT);
(0 << R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT) |
(param_count << R300_PVS_CNTL_2_PARAM_COUNT_SHIFT);
rmesa->hw.pvs.cmd[R300_PVS_CNTL_3] =
(inst_count << R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT) |
(inst_count << R300_PVS_CNTL_3_PROGRAM_UNKNOWN2_SHIFT);
(inst_count << R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT) |
(inst_count << R300_PVS_CNTL_3_PROGRAM_UNKNOWN2_SHIFT);
}
static void r300SetupRealVertexProgram(r300ContextPtr rmesa)
File diff suppressed because it is too large Load Diff
@@ -3,11 +3,6 @@
#include "r300_reg.h"
struct r300_vertprog_instruction {
GLuint opcode;
GLuint src[3];
};
#define VSF_FLAG_X 1
#define VSF_FLAG_Y 2
#define VSF_FLAG_Z 4