gallium: add shadow 1D and 2D array samplers to TGSI
authorMarek Olšák <maraeo@gmail.com>
Mon, 5 Sep 2011 01:23:05 +0000 (03:23 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sat, 10 Sep 2011 06:53:29 +0000 (08:53 +0200)
And filling in all the switch statements in auxiliary. Mostly untested.

src/gallium/auxiliary/gallivm/lp_bld_tgsi_info.c
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
src/gallium/auxiliary/tgsi/tgsi_dump.c
src/gallium/auxiliary/tgsi/tgsi_exec.c
src/gallium/auxiliary/tgsi/tgsi_sse2.c
src/gallium/auxiliary/tgsi/tgsi_text.c
src/gallium/auxiliary/tgsi/tgsi_util.c
src/gallium/include/pipe/p_shader_tokens.h

index 5ad32d9182c6922dea0776ad258c7ce90a183947..b9a5c5c48993362d0bfa59bd69a6e30fb2516ca7 100644 (file)
@@ -113,17 +113,23 @@ analyse_tex(struct analysis_context *ctx,
       case TGSI_TEXTURE_1D:
          readmask = TGSI_WRITEMASK_X;
          break;
+      case TGSI_TEXTURE_1D_ARRAY:
       case TGSI_TEXTURE_2D:
       case TGSI_TEXTURE_RECT:
          readmask = TGSI_WRITEMASK_XY;
          break;
       case TGSI_TEXTURE_SHADOW1D:
+      case TGSI_TEXTURE_SHADOW1D_ARRAY:
       case TGSI_TEXTURE_SHADOW2D:
       case TGSI_TEXTURE_SHADOWRECT:
+      case TGSI_TEXTURE_2D_ARRAY:
       case TGSI_TEXTURE_3D:
       case TGSI_TEXTURE_CUBE:
          readmask = TGSI_WRITEMASK_XYZ;
          break;
+      case TGSI_TEXTURE_SHADOW2D_ARRAY:
+         readmask = TGSI_WRITEMASK_XYZW;
+         break;
       default:
          assert(0);
          return;
index d8adb9fbfaf1d2e91e4eb4b90594a204875e5d30..602f96e4037da7fa613954c4b2acca1a920d9289 100644 (file)
@@ -1080,17 +1080,23 @@ emit_tex( struct lp_build_tgsi_soa_context *bld,
    case TGSI_TEXTURE_1D:
       num_coords = 1;
       break;
+   case TGSI_TEXTURE_1D_ARRAY:
    case TGSI_TEXTURE_2D:
    case TGSI_TEXTURE_RECT:
       num_coords = 2;
       break;
    case TGSI_TEXTURE_SHADOW1D:
+   case TGSI_TEXTURE_SHADOW1D_ARRAY:
    case TGSI_TEXTURE_SHADOW2D:
    case TGSI_TEXTURE_SHADOWRECT:
+   case TGSI_TEXTURE_2D_ARRAY:
    case TGSI_TEXTURE_3D:
    case TGSI_TEXTURE_CUBE:
       num_coords = 3;
       break;
+   case TGSI_TEXTURE_SHADOW2D_ARRAY:
+      num_coords = 4;
+      break;
    default:
       assert(0);
       return;
index 7e2825e9ce1d7e79c254b7ff58ca5da24c310dd5..64927ed6e028e08bb5ceb5877661d67b96abdb6e 100644 (file)
@@ -160,7 +160,9 @@ tgsi_texture_names[TGSI_TEXTURE_COUNT] =
    "SHADOW2D",
    "SHADOWRECT",
    "1DARRAY",
-   "2DARRAY"
+   "2DARRAY",
+   "SHADOW1DARRAY",
+   "SHADOW2DARRAY",
 };
 
 const char *tgsi_property_names[TGSI_PROPERTY_COUNT] =
index fd118c5bb118c6ce347b5f3738e960aa61385c1e..d9de41bf826bb69ba857076e7152707e430630a2 100644 (file)
@@ -1791,6 +1791,7 @@ exec_tex(struct tgsi_exec_machine *mach,
       break;
 
    case TGSI_TEXTURE_1D_ARRAY:
+   case TGSI_TEXTURE_SHADOW1D_ARRAY:
       FETCH(&r[0], 0, CHAN_X);
       FETCH(&r[1], 0, CHAN_Y);
 
@@ -1805,6 +1806,7 @@ exec_tex(struct tgsi_exec_machine *mach,
       break;
 
    case TGSI_TEXTURE_2D_ARRAY:
+   case TGSI_TEXTURE_SHADOW2D_ARRAY:
       FETCH(&r[0], 0, CHAN_X);
       FETCH(&r[1], 0, CHAN_Y);
       FETCH(&r[2], 0, CHAN_Z);
@@ -1884,8 +1886,10 @@ exec_txd(struct tgsi_exec_machine *mach,
                   &r[0], &r[1], &r[2], &r[3]);           /* R, G, B, A */
       break;
 
+   case TGSI_TEXTURE_1D_ARRAY:
    case TGSI_TEXTURE_2D:
    case TGSI_TEXTURE_RECT:
+   case TGSI_TEXTURE_SHADOW1D_ARRAY:
    case TGSI_TEXTURE_SHADOW2D:
    case TGSI_TEXTURE_SHADOWRECT:
 
@@ -1899,6 +1903,7 @@ exec_txd(struct tgsi_exec_machine *mach,
                   &r[0], &r[1], &r[2], &r[3]);     /* outputs */
       break;
 
+   case TGSI_TEXTURE_2D_ARRAY:
    case TGSI_TEXTURE_3D:
    case TGSI_TEXTURE_CUBE:
 
@@ -1912,6 +1917,19 @@ exec_txd(struct tgsi_exec_machine *mach,
                   &r[0], &r[1], &r[2], &r[3]);
       break;
 
+   case TGSI_TEXTURE_SHADOW2D_ARRAY:
+
+      FETCH(&r[0], 0, CHAN_X);
+      FETCH(&r[1], 0, CHAN_Y);
+      FETCH(&r[2], 0, CHAN_Z);
+      FETCH(&r[3], 0, CHAN_W);
+
+      fetch_texel(mach->Samplers[unit],
+                  &r[0], &r[1], &r[2], &r[3],
+                  tgsi_sampler_lod_bias,
+                  &r[0], &r[1], &r[2], &r[3]);
+      break;
+
    default:
       assert(0);
    }
@@ -1957,10 +1975,12 @@ exec_txf(struct tgsi_exec_machine *mach,
    switch(inst->Texture.Texture) {
    case TGSI_TEXTURE_3D:
    case TGSI_TEXTURE_2D_ARRAY:
+   case TGSI_TEXTURE_SHADOW2D_ARRAY:
       IFETCH(&r[2], 0, CHAN_Z);
       /* fallthrough */
    case TGSI_TEXTURE_2D:
    case TGSI_TEXTURE_RECT:
+   case TGSI_TEXTURE_SHADOW1D_ARRAY:
    case TGSI_TEXTURE_SHADOW2D:
    case TGSI_TEXTURE_SHADOWRECT:
    case TGSI_TEXTURE_1D_ARRAY:
@@ -2067,8 +2087,10 @@ exec_sample(struct tgsi_exec_machine *mach,
                   &r[0], &r[1], &r[2], &r[3]);     /* R, G, B, A */
       break;
 
+   case TGSI_TEXTURE_1D_ARRAY:
    case TGSI_TEXTURE_2D:
    case TGSI_TEXTURE_RECT:
+   case TGSI_TEXTURE_SHADOW1D_ARRAY:
    case TGSI_TEXTURE_SHADOW2D:
    case TGSI_TEXTURE_SHADOWRECT:
       FETCH(&r[0], 0, CHAN_X);
@@ -2087,6 +2109,7 @@ exec_sample(struct tgsi_exec_machine *mach,
                   &r[0], &r[1], &r[2], &r[3]);  /* outputs */
       break;
 
+   case TGSI_TEXTURE_2D_ARRAY:
    case TGSI_TEXTURE_3D:
    case TGSI_TEXTURE_CUBE:
       FETCH(&r[0], 0, CHAN_X);
@@ -2105,6 +2128,20 @@ exec_sample(struct tgsi_exec_machine *mach,
                   &r[0], &r[1], &r[2], &r[3]);
       break;
 
+   case TGSI_TEXTURE_SHADOW2D_ARRAY:
+      FETCH(&r[0], 0, CHAN_X);
+      FETCH(&r[1], 0, CHAN_Y);
+      FETCH(&r[2], 0, CHAN_Z);
+      FETCH(&r[3], 0, CHAN_W);
+
+      assert(modifier != TEX_MODIFIER_PROJECTED);
+
+      fetch_texel(mach->Samplers[sampler_unit],
+                  &r[0], &r[1], &r[2], &r[3],
+                  control,
+                  &r[0], &r[1], &r[2], &r[3]);
+      break;
+
    default:
       assert(0);
    }
index 664946b00f621677b75e150ef7720ccb418384ba..5614caf63e7a08787c578e5433628ada850dcf77 100644 (file)
@@ -1526,8 +1526,12 @@ emit_tex( struct x86_function *func,
    case TGSI_TEXTURE_3D:
    case TGSI_TEXTURE_CUBE:
    case TGSI_TEXTURE_2D_ARRAY:
+   case TGSI_TEXTURE_SHADOW1D_ARRAY:
       count = 3;
       break;
+   case TGSI_TEXTURE_SHADOW2D_ARRAY:
+      count = 4;
+      break;
    default:
       assert(0);
       return;
index 57622a0dea6339fe4552fb6b5df841a9890d7fb8..6b97803711f2aec3e5e928e572f6d2170f9aed0c 100644 (file)
@@ -826,7 +826,11 @@ static const char *texture_names[TGSI_TEXTURE_COUNT] =
    "RECT",
    "SHADOW1D",
    "SHADOW2D",
-   "SHADOWRECT"
+   "SHADOWRECT",
+   "1DARRAY",
+   "2DARRAY",
+   "SHADOW1DARRAY",
+   "SHADOW2DARRAY"
 };
 
 static const char *type_names[] =
index aa9a886d4a98322e74d99c610d50aee4a370da19..9f6997dc88a8e8f6ffab3ea747a1a3afc4b207a8 100644 (file)
@@ -270,21 +270,21 @@ tgsi_util_get_inst_usage_mask(const struct tgsi_full_instruction *inst,
          case TGSI_TEXTURE_SHADOW1D:
             read_mask = TGSI_WRITEMASK_XZ;
             break;
+         case TGSI_TEXTURE_1D_ARRAY:
          case TGSI_TEXTURE_2D:
          case TGSI_TEXTURE_RECT:
             read_mask = TGSI_WRITEMASK_XY;
             break;
+         case TGSI_TEXTURE_SHADOW1D_ARRAY:
          case TGSI_TEXTURE_SHADOW2D:
          case TGSI_TEXTURE_SHADOWRECT:
+         case TGSI_TEXTURE_2D_ARRAY:
          case TGSI_TEXTURE_3D:
          case TGSI_TEXTURE_CUBE:
             read_mask = TGSI_WRITEMASK_XYZ;
             break;
-         case TGSI_TEXTURE_1D_ARRAY:
-            read_mask = TGSI_WRITEMASK_XY;
-            break;
-         case TGSI_TEXTURE_2D_ARRAY:
-            read_mask = TGSI_WRITEMASK_XYZ;
+         case TGSI_TEXTURE_SHADOW2D_ARRAY:
+            read_mask = TGSI_WRITEMASK_XYZW;
             break;
          default:
             assert(0);
index 72d3139562e1f6b26b096298ef39d4f19bcc346c..b9e3dcf885873fee3620cf097c143218dda7b9f5 100644 (file)
@@ -433,8 +433,10 @@ struct tgsi_instruction_label
 #define TGSI_TEXTURE_SHADOW2D       7
 #define TGSI_TEXTURE_SHADOWRECT     8
 #define TGSI_TEXTURE_1D_ARRAY       9
-#define TGSI_TEXTURE_2D_ARRAY      10
-#define TGSI_TEXTURE_COUNT         11
+#define TGSI_TEXTURE_2D_ARRAY       10
+#define TGSI_TEXTURE_SHADOW1D_ARRAY 11
+#define TGSI_TEXTURE_SHADOW2D_ARRAY 12
+#define TGSI_TEXTURE_COUNT          13
 
 struct tgsi_instruction_texture
 {