diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_fragprog.c | 91 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_state.c | 14 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_state.h | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_vertexprog.c | 67 | 
4 files changed, 103 insertions, 70 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c index a1c634a54d..d3062a4145 100644 --- a/src/mesa/drivers/dri/r300/r300_fragprog.c +++ b/src/mesa/drivers/dri/r300/r300_fragprog.c @@ -49,6 +49,7 @@  #include "r300_context.h"  #include "r300_fragprog.h"  #include "r300_reg.h" +#include "r300_state.h"  /*   * Usefull macros and values @@ -1787,6 +1788,94 @@ static GLboolean parse_program(struct r300_fragment_program *rp)  	return GL_TRUE;  } +static void insert_wpos(struct gl_program *prog) +{ +	GLint tokens[6] = { STATE_INTERNAL, STATE_R300_WINDOW_DIMENSION, 0, 0, 0, 0 }; +	struct prog_instruction *fpi; +	GLuint window_index; +	int i = 0; +	GLuint tempregi = prog->NumTemporaries; +	/* should do something else if no temps left... */ +	prog->NumTemporaries++; + +	 +	fpi = malloc((prog->NumInstructions + 3) * sizeof(struct prog_instruction)); +	/* all including END */ +	memcpy(&fpi[3], prog->Instructions, prog->NumInstructions * sizeof(struct prog_instruction)); +	 +	memset(fpi, 0, 3 * sizeof(struct prog_instruction)); + +	/* perspective divide */ +	fpi[i].Opcode = OPCODE_RCP; + +	fpi[i].DstReg.File = PROGRAM_TEMPORARY; +	fpi[i].DstReg.Index = tempregi; +	fpi[i].DstReg.WriteMask = WRITEMASK_W; +	fpi[i].DstReg.CondMask = COND_TR; + +	fpi[i].SrcReg[0].File = PROGRAM_INPUT; +	fpi[i].SrcReg[0].Index = FRAG_ATTRIB_WPOS; +	fpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W); +	i++; + +	fpi[i].Opcode = OPCODE_MUL; + +	fpi[i].DstReg.File = PROGRAM_TEMPORARY; +	fpi[i].DstReg.Index = tempregi; +	fpi[i].DstReg.WriteMask = WRITEMASK_XYZ; +	fpi[i].DstReg.CondMask = COND_TR; + +	fpi[i].SrcReg[0].File = PROGRAM_INPUT; +	fpi[i].SrcReg[0].Index = FRAG_ATTRIB_WPOS; +	fpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W); + +	fpi[i].SrcReg[1].File = PROGRAM_TEMPORARY; +	fpi[i].SrcReg[1].Index = tempregi; +	fpi[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W); +	i++; + +	/* viewport transformation */ +	window_index = _mesa_add_state_reference(prog->Parameters, tokens); + +	fpi[i].Opcode = OPCODE_MAD; + +	fpi[i].DstReg.File = PROGRAM_TEMPORARY; +	fpi[i].DstReg.Index = tempregi; +	fpi[i].DstReg.WriteMask = WRITEMASK_XYZ; +	fpi[i].DstReg.CondMask = COND_TR; + +	fpi[i].SrcReg[0].File = PROGRAM_TEMPORARY; +	fpi[i].SrcReg[0].Index = tempregi; +	fpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); + +	fpi[i].SrcReg[1].File = PROGRAM_STATE_VAR; +	fpi[i].SrcReg[1].Index = window_index; +	fpi[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); + +	fpi[i].SrcReg[2].File = PROGRAM_STATE_VAR; +	fpi[i].SrcReg[2].Index = window_index; +	fpi[i].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); +	i++; + +	free(prog->Instructions); + +	prog->Instructions = fpi; + +	prog->NumInstructions += i; +	fpi = &prog->Instructions[prog->NumInstructions-1]; + +	assert(fpi->Opcode == OPCODE_END); +	 +	for(fpi = &prog->Instructions[3]; fpi->Opcode != OPCODE_END; fpi++){ +		for(i=0; i<3; i++) +		    if( fpi->SrcReg[i].File == PROGRAM_INPUT && +			fpi->SrcReg[i].Index == FRAG_ATTRIB_WPOS ){ +			    fpi->SrcReg[i].File = PROGRAM_TEMPORARY; +			    fpi->SrcReg[i].Index = tempregi; +    		    } +	} +} +  /* - Init structures   * - Determine what hwregs each input corresponds to   */ @@ -1844,6 +1933,7 @@ static void init_program(r300ContextPtr r300, struct r300_fragment_program *rp)  	if (InputsRead & FRAG_BIT_WPOS) {  		cs->inputs[FRAG_ATTRIB_WPOS].refcount = 0;  		cs->inputs[FRAG_ATTRIB_WPOS].reg = get_hw_temp(rp); +		insert_wpos(&mp->Base);  	}  	InputsRead &= ~FRAG_BIT_WPOS; @@ -1956,6 +2046,7 @@ void r300_translate_fragment_shader(r300ContextPtr r300, struct r300_fragment_pr  		rp->translated = GL_TRUE;  		if (0) dump_program(rp); +		r300UpdateStateParameters(rp->ctx, _NEW_PROGRAM);  	}  	update_params(rp); diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index 895c2ff43c..fcb61a2831 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -1066,8 +1066,8 @@ static void r300FetchStateParameter(GLcontext *ctx, const enum state_index state      	switch(state[1])  	{  	case STATE_R300_WINDOW_DIMENSION: -	    value[0] = r300->radeon.dri.drawable->w;	/* width */ -    	    value[1] = r300->radeon.dri.drawable->h;	/* height */ +	    value[0] = r300->radeon.dri.drawable->w*0.5f;/* width*0.5 */ +    	    value[1] = r300->radeon.dri.drawable->h*0.5f;/* height*0.5 */  	    value[2] = 0.5F; 				/* for moving range [-1 1] -> [0 1] */      	    value[3] = 1.0F; 				/* not used */  	    break; @@ -1081,20 +1081,20 @@ static void r300FetchStateParameter(GLcontext *ctx, const enum state_index state   * Update R300's own internal state parameters.   * For now just STATE_R300_WINDOW_DIMENSION   */ -static void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state) +void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state)  { -	struct r300_vertex_program_cont *vpc; +	struct r300_fragment_program *fp;  	struct gl_program_parameter_list *paramList;  	GLuint i;  	if(!(new_state & (_NEW_BUFFERS|_NEW_PROGRAM)))  	    return; -	vpc = (struct r300_vertex_program_cont *)ctx->VertexProgram._Current; -	if (!vpc) +	fp = (struct r300_fragment_program *)ctx->FragmentProgram._Current; +	if (!fp)  	    return; -	paramList = vpc->mesa_program.Base.Parameters; +	paramList = fp->mesa_program.Base.Parameters;  	if (!paramList)  	    return; diff --git a/src/mesa/drivers/dri/r300/r300_state.h b/src/mesa/drivers/dri/r300/r300_state.h index f6a50655d1..52e606f241 100644 --- a/src/mesa/drivers/dri/r300/r300_state.h +++ b/src/mesa/drivers/dri/r300/r300_state.h @@ -61,6 +61,7 @@ do {							\  extern void r300ResetHwState(r300ContextPtr r300); +extern void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state);  extern void r300InitState(r300ContextPtr r300);  extern void r300InitStateFuncs(struct dd_function_table* functions);  extern void r300UpdateViewportOffset( GLcontext *ctx ); diff --git a/src/mesa/drivers/dri/r300/r300_vertexprog.c b/src/mesa/drivers/dri/r300/r300_vertexprog.c index 2ff92e1328..68a11a42b3 100644 --- a/src/mesa/drivers/dri/r300/r300_vertexprog.c +++ b/src/mesa/drivers/dri/r300/r300_vertexprog.c @@ -962,22 +962,19 @@ static void insert_wpos(struct r300_vertex_program *vp,  		       struct gl_program *prog,  		       GLuint temp_index)  { - -	GLint tokens[6] = { STATE_INTERNAL, STATE_R300_WINDOW_DIMENSION, 0, 0, 0, 0 };  	struct prog_instruction *vpi;  	struct prog_instruction *vpi_insert; -	GLuint window_index;  	int i = 0; -	vpi = malloc((prog->NumInstructions + 5) * sizeof(struct prog_instruction)); +	vpi = malloc((prog->NumInstructions + 2) * sizeof(struct prog_instruction));  	/* all but END */  	memcpy(vpi, prog->Instructions, (prog->NumInstructions - 1) * sizeof(struct prog_instruction));  	/* END */ -	memcpy(&vpi[prog->NumInstructions + 4], &prog->Instructions[prog->NumInstructions - 1], +	memcpy(&vpi[prog->NumInstructions + 1], &prog->Instructions[prog->NumInstructions - 1],  		sizeof(struct prog_instruction));  	vpi_insert = &vpi[prog->NumInstructions - 1]; -	memset(vpi_insert, 0, 5 * sizeof(struct prog_instruction)); +	memset(vpi_insert, 0, 2 * sizeof(struct prog_instruction));  	vpi_insert[i].Opcode = OPCODE_MOV; @@ -991,59 +988,7 @@ static void insert_wpos(struct r300_vertex_program *vp,  	vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W);  	i++; -	/* perspective divide */ -	vpi_insert[i].Opcode = OPCODE_RCP; - -	vpi_insert[i].DstReg.File = PROGRAM_TEMPORARY; -	vpi_insert[i].DstReg.Index = temp_index; -	vpi_insert[i].DstReg.WriteMask = WRITEMASK_W; -	vpi_insert[i].DstReg.CondMask = COND_TR; - -	vpi_insert[i].SrcReg[0].File = PROGRAM_TEMPORARY; -	vpi_insert[i].SrcReg[0].Index = temp_index; -	vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO); -	i++; - -	vpi_insert[i].Opcode = OPCODE_MUL; - -	vpi_insert[i].DstReg.File = PROGRAM_TEMPORARY; -	vpi_insert[i].DstReg.Index = temp_index; -	vpi_insert[i].DstReg.WriteMask = WRITEMASK_XYZ; -	vpi_insert[i].DstReg.CondMask = COND_TR; - -	vpi_insert[i].SrcReg[0].File = PROGRAM_TEMPORARY; -	vpi_insert[i].SrcReg[0].Index = temp_index; -	vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); - -	vpi_insert[i].SrcReg[1].File = PROGRAM_TEMPORARY; -	vpi_insert[i].SrcReg[1].Index = temp_index; -	vpi_insert[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_ZERO); -	i++; - -	/* viewport transformation */ -	window_index = _mesa_add_state_reference(prog->Parameters, tokens); - -	vpi_insert[i].Opcode = OPCODE_MAD; - -	vpi_insert[i].DstReg.File = PROGRAM_TEMPORARY; -	vpi_insert[i].DstReg.Index = temp_index; -	vpi_insert[i].DstReg.WriteMask = WRITEMASK_XYZ; -	vpi_insert[i].DstReg.CondMask = COND_TR; - -	vpi_insert[i].SrcReg[0].File = PROGRAM_TEMPORARY; -	vpi_insert[i].SrcReg[0].Index = temp_index; -	vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); - -	vpi_insert[i].SrcReg[1].File = PROGRAM_STATE_VAR; -	vpi_insert[i].SrcReg[1].Index = window_index; -	vpi_insert[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_ZERO); - -	vpi_insert[i].SrcReg[2].File = PROGRAM_STATE_VAR; -	vpi_insert[i].SrcReg[2].Index = window_index; -	vpi_insert[i].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_ZERO); -	i++; - -	vpi_insert[i].Opcode = OPCODE_MUL; +	vpi_insert[i].Opcode = OPCODE_MOV;  	vpi_insert[i].DstReg.File = PROGRAM_OUTPUT;  	vpi_insert[i].DstReg.Index = VERT_RESULT_TEX0+vp->wpos_idx; @@ -1053,10 +998,6 @@ static void insert_wpos(struct r300_vertex_program *vp,  	vpi_insert[i].SrcReg[0].File = PROGRAM_TEMPORARY;  	vpi_insert[i].SrcReg[0].Index = temp_index;  	vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W); - -	vpi_insert[i].SrcReg[1].File = PROGRAM_STATE_VAR; -	vpi_insert[i].SrcReg[1].Index = window_index; -	vpi_insert[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_ONE, SWIZZLE_ONE);  	i++;  	free(prog->Instructions);  | 
