Module: Mesa
Branch: master
Commit: c3df4e0601baa5786787a1c8f2537d635aa1913b
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=c3df4e0601baa5786787a1c8f2537d635aa1913b

Author: Gert Wollny <[email protected]>
Date:   Wed Apr 24 09:53:56 2019 +0200

softpipe: Add support for TGSI_OPCODE_INTERP_OFFSET

Since for this opcode the offsets are given manually the function
should actually also work for non-zero offsets, but the related piglits
only ever test with offset 0. Accordingly the patch satisfies
"fs-interpolateatoffset-*".

Signed-off-by: Gert Wollny <[email protected]>
Reviewed-by: Roland Scheidegger <[email protected]>

---

 src/gallium/auxiliary/tgsi/tgsi_exec.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c 
b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index 9c219abf01d..8fe46f780ab 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -5205,6 +5205,35 @@ exec_interp_at_sample(struct tgsi_exec_machine *mach,
       store_dest(mach, &result[chan], &inst->Dst[0], inst, chan, 
TGSI_EXEC_DATA_FLOAT);
    }
 }
+
+
+static void
+exec_interp_at_offset(struct tgsi_exec_machine *mach,
+                      const struct tgsi_full_instruction *inst)
+{
+   union tgsi_exec_channel index;
+   union tgsi_exec_channel index2D;
+   union tgsi_exec_channel ofsx;
+   union tgsi_exec_channel ofsy;
+   const struct tgsi_full_src_register *reg = &inst->Src[0];
+
+   assert(reg->Register.File == TGSI_FILE_INPUT);
+
+   get_index_registers(mach, reg, &index, &index2D);
+   unsigned pos = index2D.i[0] * TGSI_EXEC_MAX_INPUT_ATTRIBS + index.i[0];
+
+   fetch_source(mach, &ofsx, &inst->Src[1], TGSI_CHAN_X, TGSI_EXEC_DATA_FLOAT);
+   fetch_source(mach, &ofsy, &inst->Src[1], TGSI_CHAN_Y, TGSI_EXEC_DATA_FLOAT);
+
+   for (int chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
+      if (!(inst->Dst[0].Register.WriteMask & (1 << chan)))
+         continue;
+      union tgsi_exec_channel result;
+      fetch_src_file_channel(mach, TGSI_FILE_INPUT, chan, &index, &index2D, 
&result);
+      mach->InputSampleOffsetApply[pos](mach, pos, chan, ofsx.f[chan], 
ofsy.f[chan], &result);
+      store_dest(mach, &result, &inst->Dst[0], inst, chan, 
TGSI_EXEC_DATA_FLOAT);
+   }
+}
 /**
  * Execute a TGSI instruction.
  * Returns TRUE if a barrier instruction is hit,
@@ -6252,6 +6281,9 @@ exec_instruction(
    case TGSI_OPCODE_INTERP_SAMPLE:
       exec_interp_at_sample(mach, inst);
       break;
+   case TGSI_OPCODE_INTERP_OFFSET:
+      exec_interp_at_offset(mach, inst);
+      break;
    default:
       assert( 0 );
    }

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to