Fetch uniforms from main memory.
authorIan Romanick <idr@us.ibm.com>
Wed, 30 Jan 2008 20:59:09 +0000 (12:59 -0800)
committerIan Romanick <idr@us.ibm.com>
Thu, 31 Jan 2008 04:14:51 +0000 (20:14 -0800)
src/mesa/pipe/cell/spu/spu_exec.c

index 85b5815cad115a3d99fafa499a7e866b6b8a6cd0..78f7d0962f86be3e2cefa123524066e6a26a091c 100644 (file)
@@ -791,12 +791,23 @@ fetch_src_file_channel(
    case TGSI_EXTSWIZZLE_Z:
    case TGSI_EXTSWIZZLE_W:
       switch( file ) {
-      case TGSI_FILE_CONSTANT:
-         chan->f[0] = mach->Consts[index->i[0]][swizzle];
-         chan->f[1] = mach->Consts[index->i[1]][swizzle];
-         chan->f[2] = mach->Consts[index->i[2]][swizzle];
-         chan->f[3] = mach->Consts[index->i[3]][swizzle];
+      case TGSI_FILE_CONSTANT: {
+         unsigned char buffer[32] ALIGN16_ATTRIB;
+         unsigned i;
+
+         for (i = 0; i < 4; i++) {
+            const float *ptr = mach->Consts[index->i[i]];
+            const uint64_t addr = (uint64_t)(uintptr_t) ptr;
+            const unsigned size = ((addr & 0x0f) == 0) ? 16 : 32;
+
+            mfc_get(buffer, addr & ~0x0f, size, TAG_VERTEX_BUFFER, 0, 0);
+            wait_on_mask(1 << TAG_VERTEX_BUFFER);
+
+            (void) memcpy(& chan->f[i], &buffer[(addr & 0x0f) 
+                + (sizeof(float) * swizzle)], sizeof(float));
+         }
          break;
+      }
 
       case TGSI_FILE_INPUT:
          chan->u[0] = mach->Inputs[index->i[0]].xyzw[swizzle].u[0];