summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaciej Cencora <[email protected]>2009-07-03 20:06:23 +0200
committerMaciej Cencora <[email protected]>2009-07-13 19:25:57 +0200
commitbce224c1f108e6c8131dfc953ef607689b83ae7e (patch)
tree3d3558c60810b9f2f55cba2fb1b45b0f0756d962
parent7829b7a1b85dd8e6c31189e7f3dec91d71d134c3 (diff)
r300: don't modify original vertex program
Keep the original vertex program untouched because it may be needed after some state change for generating new r300 specific vertex program.
-rw-r--r--src/mesa/drivers/dri/r300/r300_context.h4
-rw-r--r--src/mesa/drivers/dri/r300/r300_shader.c1
-rw-r--r--src/mesa/drivers/dri/r300/r300_vertprog.c51
3 files changed, 28 insertions, 28 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h
index fc436e1100e..30b6e750398 100644
--- a/src/mesa/drivers/dri/r300/r300_context.h
+++ b/src/mesa/drivers/dri/r300/r300_context.h
@@ -405,6 +405,7 @@ struct r300_hw_state {
#undef TAG
struct r300_vertex_program {
+ struct gl_vertex_program *Base;
struct r300_vertex_program *next;
struct r300_vertex_program_key {
@@ -674,9 +675,6 @@ extern GLboolean r300CreateContext(const __GLcontextModes * glVisual,
extern void r300SelectVertexShader(r300ContextPtr r300);
extern void r300InitShaderFuncs(struct dd_function_table *functions);
-extern int r300VertexProgUpdateParams(GLcontext * ctx,
- struct r300_vertex_program_cont *vp,
- float *dst);
extern void r300InitShaderFunctions(r300ContextPtr r300);
diff --git a/src/mesa/drivers/dri/r300/r300_shader.c b/src/mesa/drivers/dri/r300/r300_shader.c
index c9a429943ab..7206379ea05 100644
--- a/src/mesa/drivers/dri/r300/r300_shader.c
+++ b/src/mesa/drivers/dri/r300/r300_shader.c
@@ -50,6 +50,7 @@ static void freeVertProgCache(GLcontext *ctx, struct r300_vertex_program_cont *c
while (vp) {
tmp = vp->next;
+ _mesa_reference_vertprog(ctx, &vp->Base, NULL);
_mesa_free(vp);
vp = tmp;
}
diff --git a/src/mesa/drivers/dri/r300/r300_vertprog.c b/src/mesa/drivers/dri/r300/r300_vertprog.c
index 49fcb6ff2c0..25c42814ec7 100644
--- a/src/mesa/drivers/dri/r300/r300_vertprog.c
+++ b/src/mesa/drivers/dri/r300/r300_vertprog.c
@@ -99,15 +99,13 @@ static GLuint combineSwizzles(GLuint src, GLuint swz_x, GLuint swz_y, GLuint swz
return ret;
}
-int r300VertexProgUpdateParams(GLcontext * ctx,
- struct r300_vertex_program_cont *vp, float *dst)
+static int r300VertexProgUpdateParams(GLcontext * ctx, struct gl_vertex_program *vp, float *dst)
{
int pi;
- struct gl_vertex_program *mesa_vp = &vp->mesa_program;
float *dst_o = dst;
struct gl_program_parameter_list *paramList;
- if (mesa_vp->IsNVProgram) {
+ if (vp->IsNVProgram) {
_mesa_load_tracked_matrices(ctx);
for (pi = 0; pi < MAX_NV_VERTEX_PROGRAM_PARAMS; pi++) {
@@ -119,16 +117,18 @@ int r300VertexProgUpdateParams(GLcontext * ctx,
return dst - dst_o;
}
- assert(mesa_vp->Base.Parameters);
- _mesa_load_state_parameters(ctx, mesa_vp->Base.Parameters);
+ if (!vp->Base.Parameters)
+ return 0;
+
+ _mesa_load_state_parameters(ctx, vp->Base.Parameters);
- if (mesa_vp->Base.Parameters->NumParameters * 4 >
+ if (vp->Base.Parameters->NumParameters * 4 >
VSF_MAX_FRAGMENT_LENGTH) {
fprintf(stderr, "%s:Params exhausted\n", __FUNCTION__);
_mesa_exit(-1);
}
- paramList = mesa_vp->Base.Parameters;
+ paramList = vp->Base.Parameters;
for (pi = 0; pi < paramList->NumParameters; pi++) {
switch (paramList->Parameters[pi].Type) {
case PROGRAM_STATE_VAR:
@@ -1027,9 +1027,9 @@ static void t_inputs_outputs(struct r300_vertex_program *vp)
}
}
-static void r300TranslateVertexShader(struct r300_vertex_program *vp,
- struct prog_instruction *vpi)
+static void r300TranslateVertexShader(struct r300_vertex_program *vp)
{
+ struct prog_instruction *vpi = vp->Base->Base.Instructions;
int i;
GLuint *inst;
unsigned long num_operands;
@@ -1450,27 +1450,31 @@ static void translateInsts(struct gl_program *prog)
static struct r300_vertex_program *build_program(GLcontext *ctx,
struct r300_vertex_program_key *wanted_key,
- struct gl_vertex_program *mesa_vp,
+ const struct gl_vertex_program *mesa_vp,
GLint wpos_idx)
{
struct r300_vertex_program *vp;
+ struct gl_program *prog;
vp = _mesa_calloc(sizeof(*vp));
+ vp->Base = (struct gl_vertex_program *) _mesa_clone_program(ctx, &mesa_vp->Base);
_mesa_memcpy(&vp->key, wanted_key, sizeof(vp->key));
vp->wpos_idx = wpos_idx;
+ prog = &vp->Base->Base;
+
if (RADEON_DEBUG & DEBUG_VERTS) {
fprintf(stderr, "Initial vertex program:\n");
- _mesa_print_program(&mesa_vp->Base);
+ _mesa_print_program(prog);
fflush(stdout);
}
if (mesa_vp->IsPositionInvariant) {
- _mesa_insert_mvp_code(ctx, mesa_vp);
+ _mesa_insert_mvp_code(ctx, vp->Base);
}
if (wpos_idx > -1) {
- pos_as_texcoord(vp, &mesa_vp->Base);
+ pos_as_texcoord(vp, prog);
}
/* Some outputs may be artificially added, to match the inputs of the fragment program.
@@ -1488,8 +1492,8 @@ static struct r300_vertex_program *build_program(GLcontext *ctx,
if (count > 0) {
struct prog_instruction *inst;
- _mesa_insert_instructions(&mesa_vp->Base, mesa_vp->Base.NumInstructions - 1, count);
- inst = &mesa_vp->Base.Instructions[mesa_vp->Base.NumInstructions - 1 - count];
+ _mesa_insert_instructions(prog, prog->NumInstructions - 1, count);
+ inst = &prog->Instructions[prog->NumInstructions - 1 - count];
for (i = 0; i < VERT_RESULT_MAX; ++i) {
if (vp->key.OutputsAdded & (1 << i)) {
@@ -1510,17 +1514,17 @@ static struct r300_vertex_program *build_program(GLcontext *ctx,
}
}
- translateInsts(&mesa_vp->Base);
+ translateInsts(prog);
if (RADEON_DEBUG & DEBUG_VERTS) {
fprintf(stderr, "Vertex program after native rewrite:\n");
- _mesa_print_program(&mesa_vp->Base);
+ _mesa_print_program(prog);
fflush(stdout);
}
- assert(mesa_vp->Base.NumInstructions);
- vp->num_temporaries = mesa_vp->Base.NumTemporaries;
- r300TranslateVertexShader(vp, mesa_vp->Base.Instructions);
+ assert(prog->NumInstructions);
+ vp->num_temporaries = prog->NumTemporaries;
+ r300TranslateVertexShader(vp);
return vp;
}
@@ -1653,10 +1657,7 @@ void r300SetupVertexProgram(r300ContextPtr rmesa)
((drm_r300_cmd_header_t *) rmesa->hw.vps.cmd)->vpu.count = 0;
R300_STATECHANGE(rmesa, vpp);
- param_count = r300VertexProgUpdateParams(ctx,
- (struct r300_vertex_program_cont *)
- ctx->VertexProgram._Current,
- (float *)&rmesa->hw.vpp.cmd[R300_VPP_PARAM_0]);
+ param_count = r300VertexProgUpdateParams(ctx, prog->Base, (float *)&rmesa->hw.vpp.cmd[R300_VPP_PARAM_0]);
bump_vpu_count(rmesa->hw.vpp.cmd, param_count);
param_count /= 4;