nvc0: switch to the proper constants upload path
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 19 Dec 2010 20:38:42 +0000 (21:38 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 19 Dec 2010 20:38:42 +0000 (21:38 +0100)
Makes things suddenly go surprisingly fast.

src/gallium/drivers/nvc0/nvc0_context.h
src/gallium/drivers/nvc0/nvc0_state_validate.c

index 26263309d8e67cbb29cf3291780f9bd62d33ffe2..0ea18d74ee3538ef4e55d5a773df9e4e48db023b 100644 (file)
@@ -80,7 +80,7 @@ struct nvc0_context {
       uint8_t num_textures[5];
       uint8_t num_samplers[5];
       uint16_t scissor;
-      uint8_t uniform_buffer_bound; /* workaround */
+      uint32_t uniform_buffer_bound[5];
    } state;
 
    struct nvc0_blend_stateobj *blend;
index ded461b9c5161120f4d3292025a6d648f3914003..fe40d493d9ef9b0d07b547cdc99cf026a661ba8c 100644 (file)
@@ -263,7 +263,7 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0)
             BEGIN_RING(chan, RING_3D(CB_BIND(s)), 1);
             OUT_RING  (chan, (i << 4) | 0);
             if (i == 0)
-               nvc0->state.uniform_buffer_bound &= ~(1 << s);
+               nvc0->state.uniform_buffer_bound[s] = 0;
             continue;
          }
 
@@ -272,14 +272,15 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0)
                base = s << 16;
                bo = nvc0->screen->uniforms;
 
-               if (nvc0->state.uniform_buffer_bound & (1 << s))
+               if (nvc0->state.uniform_buffer_bound[s] >= res->base.width0)
                   rebind = FALSE;
                else
-                  nvc0->state.uniform_buffer_bound |= (1 << s);
+                  nvc0->state.uniform_buffer_bound[s] =
+                     align(res->base.width0, 0x100);
             } else {
                bo = res->bo;
             }
-#if 1
+#if 0
             nvc0_m2mf_push_linear(nvc0, bo, NOUVEAU_BO_VRAM,
                                   base, res->base.width0, res->data);
             BEGIN_RING(chan, RING_3D_(0x021c), 1);
@@ -290,7 +291,7 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0)
          } else {
             bo = res->bo;
             if (i == 0)
-               nvc0->state.uniform_buffer_bound &= ~(1 << s);
+               nvc0->state.uniform_buffer_bound[s] = 0;
          }
 
          if (bo != nvc0->screen->uniforms)