I have made another attempt at supporting FOGC in vertex and fragment
shaders.

This patch is tested on Radeon X700 in World of Worcraft.

It makes it possible for me to play the game with shanders enabled.

/Tommy 

diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c
index 31cc00a..1ade0a3 100644
--- a/src/mesa/drivers/dri/r300/r300_context.c
+++ b/src/mesa/drivers/dri/r300/r300_context.c
@@ -83,7 +83,7 @@ int hw_tcl_on = 1;
 #define need_GL_ARB_vertex_buffer_object
 #define need_GL_ARB_vertex_program
 #define need_GL_EXT_blend_minmax
-//#define need_GL_EXT_fog_coord
+#define need_GL_EXT_fog_coord
 #define need_GL_EXT_multi_draw_arrays
 #define need_GL_EXT_secondary_color
 #define need_GL_EXT_blend_equation_separate
@@ -112,7 +112,7 @@ const struct dri_extension card_extensions[] = {
   {"GL_EXT_blend_func_separate",	GL_EXT_blend_func_separate_functions},
   {"GL_EXT_blend_minmax",		GL_EXT_blend_minmax_functions},
   {"GL_EXT_blend_subtract",		NULL},
-//  {"GL_EXT_fog_coord",			GL_EXT_fog_coord_functions },
+  {"GL_EXT_fog_coord",			GL_EXT_fog_coord_functions },
   {"GL_EXT_multi_draw_arrays",		GL_EXT_multi_draw_arrays_functions},
   {"GL_EXT_gpu_program_parameters",     GL_EXT_gpu_program_parameters_functions},
   {"GL_EXT_secondary_color", 		GL_EXT_secondary_color_functions},
diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h
index 53e5d18..ba54b3f 100644
--- a/src/mesa/drivers/dri/r300/r300_context.h
+++ b/src/mesa/drivers/dri/r300/r300_context.h
@@ -643,7 +643,6 @@ struct r300_vertex_program {
 
 	int pos_end;
 	int num_temporaries;	/* Number of temp vars used by program */
-	int wpos_idx;
 	int inputs[VERT_ATTRIB_MAX];
 	int outputs[VERT_RESULT_MAX];
 	int native;
diff --git a/src/mesa/drivers/dri/r300/r300_emit.c b/src/mesa/drivers/dri/r300/r300_emit.c
index 2ea17ad..5009759 100644
--- a/src/mesa/drivers/dri/r300/r300_emit.c
+++ b/src/mesa/drivers/dri/r300/r300_emit.c
@@ -314,10 +314,6 @@ GLuint r300VAPOutputCntl0(GLcontext * ctx, GLuint OutputsWritten)
 		    R300_VAP_OUTPUT_VTX_FMT_0__COLOR_2_PRESENT |
 		    R300_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT;
 
-#if 0
-	if (OutputsWritten & (1 << VERT_RESULT_FOGC)) ;
-#endif
-
 	if (OutputsWritten & (1 << VERT_RESULT_PSIZ))
 		ret |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT;
 
diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c
index a28841d..e6ba3bb 100644
--- a/src/mesa/drivers/dri/r300/r300_fragprog.c
+++ b/src/mesa/drivers/dri/r300/r300_fragprog.c
@@ -2138,6 +2138,14 @@ static void init_program(r300ContextPtr r300, struct r300_fragment_program *fp)
 	}
 	InputsRead &= ~FRAG_BIT_WPOS;
 
+	/* foogcord treated as a texcoord */
+	if (InputsRead & FRAG_BIT_FOGC) {
+		cs->inputs[FRAG_ATTRIB_FOGC].refcount = 0;
+		cs->inputs[FRAG_ATTRIB_FOGC].reg = get_hw_temp(fp, 0);
+		insert_wpos(&mp->Base);
+	}
+	InputsRead &= ~FRAG_BIT_FOGC;
+
 	/* Then primary colour */
 	if (InputsRead & FRAG_BIT_COL0) {
 		cs->inputs[FRAG_ATTRIB_COL0].refcount = 0;
diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c
index cb39ce0..bb40d06 100644
--- a/src/mesa/drivers/dri/r300/r300_state.c
+++ b/src/mesa/drivers/dri/r300/r300_state.c
@@ -1570,18 +1570,27 @@ static void r300SetupRSUnit(GLcontext * ctx)
 
 	r300->hw.rr.cmd[R300_RR_INST_1] = 0;
 
-	if (InputsRead & FRAG_BIT_WPOS) {
+	if (InputsRead & FRAG_BIT_WPOS || InputsRead & FRAG_BIT_FOGC) {
 		for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
 			if (!(InputsRead & (FRAG_BIT_TEX0 << i)))
 				break;
 
-		if (i == ctx->Const.MaxTextureUnits) {
+		if (i == ctx->Const.MaxTextureUnits || (
+			InputsRead & FRAG_BIT_WPOS && InputsRead & FRAG_BIT_FOGC
+			&& i-1 <= ctx->Const.MaxTextureUnits)) {
 			fprintf(stderr, "\tno free texcoord found...\n");
 			_mesa_exit(-1);
 		}
 
-		InputsRead |= (FRAG_BIT_TEX0 << i);
-		InputsRead &= ~FRAG_BIT_WPOS;
+		if(InputsRead & FRAG_BIT_WPOS) {
+		  InputsRead |= (FRAG_BIT_TEX0 << i);
+		  InputsRead &= ~FRAG_BIT_WPOS;
+		}
+
+		if(InputsRead & FRAG_BIT_FOGC) {
+		  InputsRead |= (FRAG_BIT_TEX0 << i);
+		  InputsRead &= ~FRAG_BIT_FOGC;
+		}
 	}
 
 	if (InputsRead & FRAG_BIT_COL0) {
diff --git a/src/mesa/drivers/dri/r300/r300_vertprog.c b/src/mesa/drivers/dri/r300/r300_vertprog.c
index 861f042..35eb4b7 100644
--- a/src/mesa/drivers/dri/r300/r300_vertprog.c
+++ b/src/mesa/drivers/dri/r300/r300_vertprog.c
@@ -993,11 +993,6 @@ static void t_inputs_outputs(struct r300_vertex_program *vp)
 		    vp->outputs[VERT_RESULT_COL0] + 3;
 		cur_reg = vp->outputs[VERT_RESULT_BFC1] + 1;
 	}
-#if 0
-	if (vp->key.OutputsWritten & (1 << VERT_RESULT_FOGC)) {
-		vp->outputs[VERT_RESULT_FOGC] = cur_reg++;
-	}
-#endif
 
 	for (i = VERT_RESULT_TEX0; i <= VERT_RESULT_TEX7; i++) {
 		if (vp->key.OutputsWritten & (1 << i)) {
@@ -1311,12 +1306,23 @@ static void position_invariant(struct gl_program *prog)
 	assert(vpi->Opcode == OPCODE_END);
 }
 
-static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog,
-			GLuint temp_index)
+static void insert_as_texcoord(struct r300_vertex_program *vp,
+			       struct gl_program *prog, GLint output_idx, GLint idx)
 {
-	struct prog_instruction *vpi;
 	struct prog_instruction *vpi_insert;
+	struct prog_instruction *vpi;
+	GLuint tempregi = prog->NumTemporaries;
 	int i = 0;
+	/* should do something else if no temps left... */
+	prog->NumTemporaries++;
+
+	for (vpi = prog->Instructions; vpi->Opcode != OPCODE_END; vpi++) {
+		if (vpi->DstReg.File == PROGRAM_OUTPUT
+		    && vpi->DstReg.Index == output_idx) {
+			vpi->DstReg.File = PROGRAM_TEMPORARY;
+			vpi->DstReg.Index = tempregi;
+		}
+	}
 
 	vpi = _mesa_alloc_instructions(prog->NumInstructions + 2);
 	_mesa_init_instructions(vpi, prog->NumInstructions + 2);
@@ -1332,24 +1338,24 @@ static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog,
 	vpi_insert[i].Opcode = OPCODE_MOV;
 
 	vpi_insert[i].DstReg.File = PROGRAM_OUTPUT;
-	vpi_insert[i].DstReg.Index = VERT_RESULT_HPOS;
+	vpi_insert[i].DstReg.Index = output_idx;
 	vpi_insert[i].DstReg.WriteMask = WRITEMASK_XYZW;
 	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].Index = tempregi;
 	vpi_insert[i].SrcReg[0].Swizzle = SWIZZLE_XYZW;
 	i++;
 
 	vpi_insert[i].Opcode = OPCODE_MOV;
 
 	vpi_insert[i].DstReg.File = PROGRAM_OUTPUT;
-	vpi_insert[i].DstReg.Index = VERT_RESULT_TEX0 + vp->wpos_idx;
+	vpi_insert[i].DstReg.Index = VERT_RESULT_TEX0 + idx;
 	vpi_insert[i].DstReg.WriteMask = WRITEMASK_XYZW;
 	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].Index = tempregi;
 	vpi_insert[i].SrcReg[0].Swizzle = SWIZZLE_XYZW;
 	i++;
 
@@ -1363,40 +1369,26 @@ static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog,
 	assert(vpi->Opcode == OPCODE_END);
 }
 
-static void pos_as_texcoord(struct r300_vertex_program *vp,
-			    struct gl_program *prog)
-{
-	struct prog_instruction *vpi;
-	GLuint tempregi = prog->NumTemporaries;
-	/* should do something else if no temps left... */
-	prog->NumTemporaries++;
-
-	for (vpi = prog->Instructions; vpi->Opcode != OPCODE_END; vpi++) {
-		if (vpi->DstReg.File == PROGRAM_OUTPUT
-		    && vpi->DstReg.Index == VERT_RESULT_HPOS) {
-			vpi->DstReg.File = PROGRAM_TEMPORARY;
-			vpi->DstReg.Index = tempregi;
-		}
-	}
-	insert_wpos(vp, prog, tempregi);
-}
-
 static struct r300_vertex_program *build_program(struct r300_vertex_program_key
 						 *wanted_key, struct gl_vertex_program
-						 *mesa_vp, GLint wpos_idx)
+						 *mesa_vp, GLint wpos_idx,
+						 GLint fogc_idx)
 {
 	struct r300_vertex_program *vp;
 
 	vp = _mesa_calloc(sizeof(*vp));
 	_mesa_memcpy(&vp->key, wanted_key, sizeof(vp->key));
-	vp->wpos_idx = wpos_idx;
 
 	if (mesa_vp->IsPositionInvariant) {
 		position_invariant(&mesa_vp->Base);
 	}
 
 	if (wpos_idx > -1) {
-		pos_as_texcoord(vp, &mesa_vp->Base);
+		insert_as_texcoord(vp, &mesa_vp->Base, VERT_RESULT_HPOS, wpos_idx);
+	}
+
+	if (fogc_idx > -1) {
+		insert_as_texcoord(vp, &mesa_vp->Base, VERT_RESULT_FOGC, fogc_idx);
 	}
 
 	assert(mesa_vp->Base.NumInstructions);
@@ -1424,6 +1416,7 @@ void r300SelectVertexShader(r300ContextPtr r300)
 	struct r300_vertex_program_cont *vpc;
 	struct r300_vertex_program *vp;
 	GLint wpos_idx;
+	GLint fogc_idx;
 
 	vpc = (struct r300_vertex_program_cont *)ctx->VertexProgram._Current;
 	wanted_key.InputsRead = vpc->mesa_program.Base.InputsRead;
@@ -1431,18 +1424,31 @@ void r300SelectVertexShader(r300ContextPtr r300)
 	InputsRead = ctx->FragmentProgram._Current->Base.InputsRead;
 
 	wpos_idx = -1;
-	if (InputsRead & FRAG_BIT_WPOS) {
+	fogc_idx = -1;
+	if (InputsRead & FRAG_BIT_WPOS || InputsRead & FRAG_BIT_FOGC) {
 		for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
 			if (!(InputsRead & (FRAG_BIT_TEX0 << i)))
 				break;
 
-		if (i == ctx->Const.MaxTextureUnits) {
+		if (i == ctx->Const.MaxTextureUnits
+		    || (InputsRead & FRAG_BIT_WPOS && InputsRead & FRAG_BIT_FOGC
+			&& i - 1 == ctx->Const.MaxTextureUnits)) {
 			fprintf(stderr, "\tno free texcoord found\n");
 			_mesa_exit(-1);
 		}
 
-		wanted_key.OutputsWritten |= 1 << (VERT_RESULT_TEX0 + i);
-		wpos_idx = i;
+		if (InputsRead & FRAG_BIT_WPOS) {
+			wanted_key.OutputsWritten |=
+			    1 << (VERT_RESULT_TEX0 + i);
+			wpos_idx = i;
+			i++;
+		}
+		if (InputsRead & FRAG_BIT_FOGC) {
+			wanted_key.OutputsWritten |=
+			    1 << (VERT_RESULT_TEX0 + i);
+			fogc_idx = i;
+			i++;
+		}
 	}
 
 	add_outputs(&wanted_key, VERT_RESULT_HPOS);
@@ -1474,7 +1480,7 @@ void r300SelectVertexShader(r300ContextPtr r300)
 		}
 	//_mesa_print_program(&vpc->mesa_program.Base);
 
-	vp = build_program(&wanted_key, &vpc->mesa_program, wpos_idx);
+	vp = build_program(&wanted_key, &vpc->mesa_program, wpos_idx, fogc_idx);
 	vp->next = vpc->progs;
 	vpc->progs = vp;
 	r300->selected_vp = vp;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to