diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/r300/r300_context.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/r300/r300_maos.c | 6 | ||||
-rw-r--r-- | src/mesa/drivers/dri/r300/r300_render.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/r300/r300_state.c | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/r300/r300_vertexprog.c | 91 |
5 files changed, 77 insertions, 29 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h index 9075f6321fe..13c6fb03b91 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -566,6 +566,9 @@ struct r300_vertex_shader_state { int unknown_ptr3; /* pointer within program space */ }; +#define VERTPROG_ACTIVE(ctx) ( ctx->VertexProgram._Enabled && (R300_CONTEXT(ctx)->current_vp != NULL) && \ + (R300_CONTEXT(ctx)->current_vp->translated) ) + /* r300_vertex_shader_state and r300_vertex_program should probably be merged together someday. * Keeping them them seperate for now should ensure fixed pipeline keeps functioning properly. */ diff --git a/src/mesa/drivers/dri/r300/r300_maos.c b/src/mesa/drivers/dri/r300/r300_maos.c index 946eb31f0c4..4decd1e6a20 100644 --- a/src/mesa/drivers/dri/r300/r300_maos.c +++ b/src/mesa/drivers/dri/r300/r300_maos.c @@ -254,7 +254,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd) exit(-1); \ } \ \ - if (rmesa->current_vp == NULL) \ + if (VERTPROG_ACTIVE(ctx) == GL_FALSE) \ rmesa->state.aos[nr-1].aos_reg = aa_vap_reg++; \ rmesa->state.aos[nr-1].aos_format = f; \ if (immd) { \ @@ -272,7 +272,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd) } \ } - if (rmesa->current_vp != NULL && ctx->VertexProgram._Enabled) { + if (VERTPROG_ACTIVE(ctx)) { if (rmesa->current_vp->inputs[VERT_ATTRIB_POS] != -1) { inputs |= _TNL_BIT_POS; rmesa->state.aos[nr++].aos_reg = rmesa->current_vp->inputs[VERT_ATTRIB_POS]; @@ -497,7 +497,7 @@ drm_radeon_cmd_header_t *cmd = NULL; #endif /* Stage 3: VAP output */ - if (rmesa->current_vp != NULL && ctx->VertexProgram._Enabled) + if (VERTPROG_ACTIVE(ctx)) outputs = rmesa->current_vp->outputs; else outputs = inputs; diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c index b855c816737..894d3d1b904 100644 --- a/src/mesa/drivers/dri/r300/r300_render.c +++ b/src/mesa/drivers/dri/r300/r300_render.c @@ -759,7 +759,7 @@ static void r300_check_tcl_render(GLcontext *ctx, struct tnl_pipeline_stage *sta stage->active = GL_FALSE; return; } - if((r300->current_vp != NULL) && ctx->VertexProgram._Enabled) { + if(VERTPROG_ACTIVE(ctx)) { stage->active = GL_TRUE; stage->inputs = ctx->VertexProgram.Current->InputsRead; } else { diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index c10e5dbf967..7cdc1733bd8 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -1435,7 +1435,7 @@ void r300_setup_rs_unit(GLcontext *ctx) cur_reg = 0; r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0; - if (r300->current_vp != NULL && ctx->VertexProgram._Enabled) + if (VERTPROG_ACTIVE(ctx)) vap_outputs = r300->current_vp->outputs; else vap_outputs = r300->state.render_inputs; @@ -1693,7 +1693,7 @@ void r300SetupVertexShader(r300ContextPtr rmesa) 0x400 area might have something to do with pixel shaders as it appears right after pfs programming. 0x406 is set to { 0.0, 0.0, 1.0, 0.0 } most of the time but should change with smooth points and in other rare cases. */ //setup_vertex_shader_fragment(rmesa, 0x406, &unk4); - if(rmesa->current_vp != NULL && ctx->VertexProgram._Enabled){ + if(VERTPROG_ACTIVE(ctx)){ r300SetupVertexProgram(rmesa); return ; } diff --git a/src/mesa/drivers/dri/r300/r300_vertexprog.c b/src/mesa/drivers/dri/r300/r300_vertexprog.c index 98bdebd2c84..c94f104e19f 100644 --- a/src/mesa/drivers/dri/r300/r300_vertexprog.c +++ b/src/mesa/drivers/dri/r300/r300_vertexprog.c @@ -357,8 +357,10 @@ void vp_dump_inputs(struct r300_vertex_program *vp, char *caller) { int i; - if(vp == NULL) + if(vp == NULL){ + fprintf(stderr, "vp null in call to %s from %s\n", __FUNCTION__, caller); return ; + } fprintf(stderr, "%s:<", caller); for(i=0; i < VERT_ATTRIB_MAX; i++) @@ -402,6 +404,18 @@ static unsigned long t_src(struct r300_vertex_program *vp, struct vp_src_registe src->Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE); } +static unsigned long t_src_scalar(struct r300_vertex_program *vp, struct vp_src_register *src) +{ + + return MAKE_VSF_SOURCE(t_src_index(vp, src), + t_swizzle(src->Swizzle[0]), + t_swizzle(src->Swizzle[0]), + t_swizzle(src->Swizzle[0]), + t_swizzle(src->Swizzle[0]), + t_src_class(src->File), + src->Negate ? VSF_FLAG_ALL : VSF_FLAG_NONE); +} + static unsigned long t_opcode(enum vp_opcode opcode) { @@ -461,6 +475,7 @@ static void translate_program(struct r300_vertex_program *vp) VERTEX_SHADER_INSTRUCTION t2rs[1024]; VERTEX_SHADER_INSTRUCTION *o_inst; unsigned long operands; + int are_srcs_scalar; /* Initial value should be last tmp reg that hw supports. Strangely enough r300 doesnt mind even though these would be out of range. Smart enough to realize that it doesnt need it? */ @@ -498,6 +513,8 @@ static void translate_program(struct r300_vertex_program *vp) for(vpi=mesa_vp->Instructions; vpi->Opcode != VP_OPCODE_END; vpi++, o_inst++){ operands=op_operands(vpi->Opcode); + are_srcs_scalar=operands & SCALAR_FLAG; + operands &= ~SCALAR_FLAG; for(i=0; i < operands; i++) src[i]=vpi->SrcReg[i]; @@ -771,30 +788,57 @@ static void translate_program(struct r300_vertex_program *vp) o_inst->op=MAKE_VSF_OP(t_opcode(vpi->Opcode), vpi->DstReg.Index, t_dst_mask(vpi->DstReg.WriteMask), t_dst_class(vpi->DstReg.File)); - - switch(operands){ - case 1: - o_inst->src1=t_src(vp, &src[0]); - o_inst->src2=0; - o_inst->src3=0; - break; + + if(are_srcs_scalar){ + switch(operands){ + case 1: + o_inst->src1=t_src_scalar(vp, &src[0]); + o_inst->src2=0; + o_inst->src3=0; + break; + + case 2: + o_inst->src1=t_src_scalar(vp, &src[0]); + o_inst->src2=t_src_scalar(vp, &src[1]); + o_inst->src3=0; + break; + + case 3: + o_inst->src1=t_src_scalar(vp, &src[0]); + o_inst->src2=t_src_scalar(vp, &src[1]); + o_inst->src3=t_src_scalar(vp, &src[2]); + break; + + default: + fprintf(stderr, "scalars and op RCC not handled yet"); + exit(-1); + break; + } + }else{ + switch(operands){ + case 1: + o_inst->src1=t_src(vp, &src[0]); + o_inst->src2=0; + o_inst->src3=0; + break; - case 2: - o_inst->src1=t_src(vp, &src[0]); - o_inst->src2=t_src(vp, &src[1]); - o_inst->src3=0; - break; + case 2: + o_inst->src1=t_src(vp, &src[0]); + o_inst->src2=t_src(vp, &src[1]); + o_inst->src3=0; + break; - case 3: - o_inst->src1=t_src(vp, &src[0]); - o_inst->src2=t_src(vp, &src[1]); - o_inst->src3=t_src(vp, &src[2]); - break; + case 3: + o_inst->src1=t_src(vp, &src[0]); + o_inst->src2=t_src(vp, &src[1]); + o_inst->src3=t_src(vp, &src[2]); + break; - default: - fprintf(stderr, "scalars and op RCC not handled yet"); - exit(-1); - break; + default: + fprintf(stderr, "scalars and op RCC not handled yet"); + exit(-1); + break; + } } next: ; #if 0 @@ -890,13 +934,14 @@ static void r300ProgramStringNotify(GLcontext *ctx, GLenum target, struct program *prog) { struct r300_vertex_program *vp=(void *)prog; -#if 0 +#if 0 fprintf(stderr, "r300ProgramStringNotify\n"); #endif switch(target) { case GL_VERTEX_PROGRAM_ARB: vp->translated=GL_FALSE; + break; case GL_FRAGMENT_PROGRAM_ARB: return ; break; |