nvc0: shrink CSOs a little
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Fri, 8 Apr 2011 13:32:18 +0000 (15:32 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 10 Apr 2011 12:06:52 +0000 (14:06 +0200)
src/gallium/drivers/nv50/nv50_state.c
src/gallium/drivers/nvc0/nvc0_state.c
src/gallium/drivers/nvc0/nvc0_state_validate.c
src/gallium/drivers/nvc0/nvc0_stateobj.h

index 030cdcb89d3f4f109b8bbd571371d9d29bed7877..ef5a1842b116d213387426c7dfa1b8c2803fafa3 100644 (file)
@@ -155,7 +155,7 @@ nv50_blend_state_create(struct pipe_context *pipe,
          SB_DATA(so, cmask);
    }
 
-   assert(so->size < (sizeof(so->state) / sizeof(so->state[0])));
+   assert(so->size <= (sizeof(so->state) / sizeof(so->state[0])));
    return so;
 }
 
@@ -262,7 +262,7 @@ nv50_rasterizer_state_create(struct pipe_context *pipe,
       SB_DATA    (so, fui(cso->offset_units * 2.0f));
    }
 
-   assert(so->size < (sizeof(so->state) / sizeof(so->state[0])));
+   assert(so->size <= (sizeof(so->state) / sizeof(so->state[0])));
    return (void *)so;
 }
 
@@ -341,7 +341,7 @@ nv50_zsa_state_create(struct pipe_context *pipe,
       SB_DATA    (so, 0);
    }
 
-   assert(so->size < (sizeof(so->state) / sizeof(so->state[0])));
+   assert(so->size <= (sizeof(so->state) / sizeof(so->state[0])));
    return (void *)so;
 }
 
index db3b78f10b8a0478e4e3e3243005f88e5507067f..85a4d9916877de751b98e5ac4172dba222b52f88 100644 (file)
@@ -93,9 +93,18 @@ nvc0_blend_state_create(struct pipe_context *pipe,
 
     SB_IMMED_3D(so, BLEND_INDEPENDENT, cso->independent_blend_enable);
 
+    if (!cso->logicop_enable)
+       SB_IMMED_3D(so, LOGIC_OP_ENABLE, 0);
+
+    if (cso->logicop_enable) {
+       SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 2);
+       SB_DATA    (so, 1);
+       SB_DATA    (so, nvgl_logicop_func(cso->logicop_func));
+
+       SB_IMMED_3D(so, BLEND_ENABLES, 0);
+    } else
     if (!cso->independent_blend_enable) {
-        SB_BEGIN_3D(so, BLEND_ENABLES, 1);
-        SB_DATA    (so, cso->rt[0].blend_enable ? 0xff : 0);
+        SB_IMMED_3D(so, BLEND_ENABLES, cso->rt[0].blend_enable ? 0xff : 0);
 
         if (cso->rt[0].blend_enable) {
             SB_BEGIN_3D(so, BLEND_EQUATION_RGB, 5);
@@ -126,23 +135,14 @@ nvc0_blend_state_create(struct pipe_context *pipe,
             SB_DATA    (so, nvc0_blend_fac(cso->rt[i].alpha_src_factor));
             SB_DATA    (so, nvc0_blend_fac(cso->rt[i].alpha_dst_factor));
         }
-        SB_BEGIN_3D(so, BLEND_ENABLES, 1);
-        SB_DATA    (so, en);
+        SB_IMMED_3D(so, BLEND_ENABLES, en);
 
         SB_BEGIN_3D(so, COLOR_MASK(0), 8);
         for (i = 0; i < 8; ++i)
             SB_DATA(so, nvc0_colormask(cso->rt[i].colormask));
     }
 
-    if (cso->logicop_enable) {
-       SB_BEGIN_3D(so, LOGIC_OP_ENABLE, 2);
-       SB_DATA    (so, 1);
-       SB_DATA    (so, nvgl_logicop_func(cso->logicop_func));
-    } else {
-       SB_IMMED_3D(so, LOGIC_OP_ENABLE, 0);
-    }
-
-    assert(so->size < (sizeof(so->state) / sizeof(so->state[0])));
+    assert(so->size <= (sizeof(so->state) / sizeof(so->state[0])));
     return so;
 }
 
@@ -195,15 +195,12 @@ nvc0_rasterizer_state_create(struct pipe_context *pipe,
        SB_BEGIN_3D(so, LINE_WIDTH_ALIASED, 1);
     SB_DATA    (so, fui(cso->line_width));
 
-    SB_BEGIN_3D(so, LINE_STIPPLE_ENABLE, 1);
+    SB_IMMED_3D(so, LINE_STIPPLE_ENABLE, cso->line_stipple_enable);
     if (cso->line_stipple_enable) {
-        SB_DATA    (so, 1);
         SB_BEGIN_3D(so, LINE_STIPPLE_PATTERN, 1);
         SB_DATA    (so, (cso->line_stipple_pattern << 8) |
                          cso->line_stipple_factor);
                     
-    } else {
-        SB_DATA    (so, 0);
     }
 
     SB_IMMED_3D(so, VP_POINT_SIZE_EN, cso->point_size_per_vertex);
@@ -257,7 +254,7 @@ nvc0_rasterizer_state_create(struct pipe_context *pipe,
         SB_DATA    (so, fui(cso->offset_units * 2.0f));
     }
 
-    assert(so->size < (sizeof(so->state) / sizeof(so->state[0])));
+    assert(so->size <= (sizeof(so->state) / sizeof(so->state[0])));
     return (void *)so;
 }
 
@@ -328,7 +325,7 @@ nvc0_zsa_state_create(struct pipe_context *pipe,
       SB_DATA    (so, nvgl_comparison_op(cso->alpha.func));
    }
 
-   assert(so->size < (sizeof(so->state) / sizeof(so->state[0])));
+   assert(so->size <= (sizeof(so->state) / sizeof(so->state[0])));
    return (void *)so;
 }
 
index bb81480bab9be9ff43f431d8d44065a04ac01fc0..23a552622e15b45af8644ceb51d12288d31c7fdf 100644 (file)
@@ -156,11 +156,10 @@ static void
 nvc0_validate_stencil_ref(struct nvc0_context *nvc0)
 {
     struct nouveau_channel *chan = nvc0->screen->base.channel;
+    const ubyte *ref = &nvc0->stencil_ref.ref_value[0];
 
-    BEGIN_RING(chan, RING_3D(STENCIL_FRONT_FUNC_REF), 1);
-    OUT_RING  (chan, nvc0->stencil_ref.ref_value[0]);
-    BEGIN_RING(chan, RING_3D(STENCIL_BACK_FUNC_REF), 1);
-    OUT_RING  (chan, nvc0->stencil_ref.ref_value[1]);
+    IMMED_RING(chan, RING_3D(STENCIL_FRONT_FUNC_REF), ref[0]);
+    IMMED_RING(chan, RING_3D(STENCIL_BACK_FUNC_REF), ref[1]);
 }
 
 static void
index cc6b04d3578c4910a6a82260492c45ea1a57b71a..b300ec9097c2e9aa01b3ff525d2d9c7938910a76 100644 (file)
 struct nvc0_blend_stateobj {
    struct pipe_blend_state pipe;
    int size;
-   uint32_t state[72];
+   uint32_t state[69];
 };
 
 struct nvc0_rasterizer_stateobj {
    struct pipe_rasterizer_state pipe;
    int size;
-   uint32_t state[39];
+   uint32_t state[38];
 };
 
 struct nvc0_zsa_stateobj {
    struct pipe_depth_stencil_alpha_state pipe;
    int size;
-   uint32_t state[29];
+   uint32_t state[26];
 };
 
 struct nvc0_vertex_element {