summaryrefslogtreecommitdiff
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/state_tracker/st_atom_shader.c19
-rw-r--r--src/mesa/state_tracker/st_mesa_to_tgsi.c23
-rw-r--r--src/mesa/state_tracker/st_program.c7
3 files changed, 45 insertions, 4 deletions
diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
index ee649be885..c02ccc3528 100644
--- a/src/mesa/state_tracker/st_atom_shader.c
+++ b/src/mesa/state_tracker/st_atom_shader.c
@@ -137,8 +137,23 @@ find_translated_vp(struct st_context *st,
for (inAttr = 0; inAttr < FRAG_ATTRIB_MAX; inAttr++) {
if (fragInputsRead & (1 << inAttr)) {
- stfp->input_to_slot[inAttr] = numIn;
- numIn++;
+ if ((fragInputsRead & FRAG_BIT_FOGC)) {
+ if (stfp->Base.UsesPointCoord) {
+ stfp->input_to_slot[inAttr] = numIn;
+ numIn++;
+ }
+ if (stfp->Base.UsesFrontFacing) {
+ stfp->input_to_slot[inAttr] = numIn;
+ numIn++;
+ }
+ if (stfp->Base.UsesFogFragCoord) {
+ stfp->input_to_slot[inAttr] = numIn;
+ numIn++;
+ }
+ } else {
+ stfp->input_to_slot[inAttr] = numIn;
+ numIn++;
+ }
}
else {
stfp->input_to_slot[inAttr] = UNUSED;
diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
index 43c9afccc3..3140ebe04a 100644
--- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
+++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
@@ -101,8 +101,10 @@ map_register_file(
*/
static GLuint
map_register_file_index(
+ GLuint procType,
GLuint file,
GLuint index,
+ GLuint *swizzle,
const GLuint inputMapping[],
const GLuint outputMapping[],
const GLuint immediateMapping[],
@@ -110,6 +112,20 @@ map_register_file_index(
{
switch( file ) {
case TGSI_FILE_INPUT:
+ if (procType == TGSI_PROCESSOR_FRAGMENT &&
+ index == FRAG_ATTRIB_FOGC) {
+ if (GET_SWZ(*swizzle, 0) == SWIZZLE_X) {
+ /* do nothing we're, ok */
+ } else if (GET_SWZ(*swizzle, 0) == SWIZZLE_Y) {
+ /* replace the swizzle with xxxx */
+ *swizzle = MAKE_SWIZZLE4(SWIZZLE_X,
+ SWIZZLE_X,
+ SWIZZLE_X,
+ SWIZZLE_X);
+ } else {
+ /* fixme: point coord */
+ }
+ }
/* inputs are mapped according to the user-defined map */
return inputMapping[index];
@@ -236,8 +252,10 @@ compile_instruction(
fulldst = &fullinst->FullDstRegisters[0];
fulldst->DstRegister.File = map_register_file( inst->DstReg.File, 0, NULL, GL_FALSE );
fulldst->DstRegister.Index = map_register_file_index(
+ procType,
fulldst->DstRegister.File,
inst->DstReg.Index,
+ NULL,
inputMapping,
outputMapping,
NULL,
@@ -246,6 +264,7 @@ compile_instruction(
for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) {
GLuint j;
+ GLuint swizzle = inst->SrcReg[i].Swizzle;
fullsrc = &fullinst->FullSrcRegisters[i];
@@ -264,8 +283,10 @@ compile_instruction(
immediateMapping,
indirectAccess );
fullsrc->SrcRegister.Index = map_register_file_index(
+ procType,
fullsrc->SrcRegister.File,
inst->SrcReg[i].Index,
+ &swizzle,
inputMapping,
outputMapping,
immediateMapping,
@@ -278,7 +299,7 @@ compile_instruction(
GLboolean extended = (inst->SrcReg[i].Negate != NEGATE_NONE &&
inst->SrcReg[i].Negate != NEGATE_XYZW);
for( j = 0; j < 4; j++ ) {
- swz[j] = GET_SWZ( inst->SrcReg[i].Swizzle, j );
+ swz[j] = GET_SWZ( swizzle, j );
if (swz[j] > SWIZZLE_W)
extended = GL_TRUE;
}
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 72ca852458..9a346fbde0 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -437,11 +437,16 @@ st_translate_fragment_program(struct st_context *st,
if (stfp->Base.UsesPointCoord) {
stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
stfp->input_semantic_index[slot] = num_generic++;
+ interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
+ } else if (stfp->Base.UsesFrontFacing) {
+ stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
+ stfp->input_semantic_index[slot] = 0;
+ interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
} else {
stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
stfp->input_semantic_index[slot] = 0;
+ interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
}
- interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
break;
case FRAG_ATTRIB_TEX0:
case FRAG_ATTRIB_TEX1: