nv50,nvc0: implement colour clamping controls
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 29 Mar 2011 21:09:02 +0000 (23:09 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 29 Mar 2011 21:09:02 +0000 (23:09 +0200)
12 files changed:
src/gallium/drivers/nv50/nv50_3d.xml.h
src/gallium/drivers/nv50/nv50_context.h
src/gallium/drivers/nv50/nv50_program.c
src/gallium/drivers/nv50/nv50_screen.c
src/gallium/drivers/nv50/nv50_shader_state.c
src/gallium/drivers/nv50/nv50_state.c
src/gallium/drivers/nv50/nv50_state_validate.c
src/gallium/drivers/nv50/nv50_stateobj.h
src/gallium/drivers/nvc0/nvc0_screen.c
src/gallium/drivers/nvc0/nvc0_shader_state.c
src/gallium/drivers/nvc0/nvc0_state.c
src/gallium/drivers/nvc0/nvc0_stateobj.h

index 9bb3211728c2af36c2714e29bb77e91de665a59b..92b97ddb9f4b45324fbe274301d0d8f8b96121ed 100644 (file)
@@ -1673,7 +1673,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define NV50_3D_MAP_SEMANTIC_0_BFC0_ID__SHIFT                  8
 #define NV50_3D_MAP_SEMANTIC_0_COLR_NR__MASK                   0x00ff0000
 #define NV50_3D_MAP_SEMANTIC_0_COLR_NR__SHIFT                  16
-#define NV50_3D_MAP_SEMANTIC_0_CLMP_EN                         0xff000000
+#define NV50_3D_MAP_SEMANTIC_0_CLMP_EN                         0x01000000
 
 #define NV50_3D_MAP_SEMANTIC_1                                 0x00001908
 #define NV50_3D_MAP_SEMANTIC_1_CLIP_START__MASK                        0x000000ff
index 46e6c2250af721dc2215300e511f1f90154cee38..f480f0430963b724bf658c4fba5923e65e5fb9de 100644 (file)
@@ -80,6 +80,8 @@ struct nv50_context {
       uint32_t instance_elts; /* bitmask of per-instance elements */
       uint32_t instance_base;
       uint32_t interpolant_ctrl;
+      uint32_t semantic_color;
+      uint32_t semantic_psize;
       int32_t index_bias;
       boolean prim_restart;
       boolean point_sprite;
@@ -183,7 +185,7 @@ void nv50_fragprog_validate(struct nv50_context *);
 void nv50_fp_linkage_validate(struct nv50_context *);
 void nv50_gp_linkage_validate(struct nv50_context *);
 void nv50_constbufs_validate(struct nv50_context *);
-void nv50_sprite_coords_validate(struct nv50_context *);
+void nv50_validate_derived_rs(struct nv50_context *);
 
 /* nv50_state.c */
 extern void nv50_init_state_functions(struct nv50_context *);
index a63f9d8a6d5c5acfdb9ea7bfa3884ff41ea6495e..37025a6f12e8db34fe026c66364dfdcbf87bd09c 100644 (file)
@@ -486,7 +486,7 @@ nv50_fragprog_prepare(struct nv50_translation_info *ti)
       ++nintp;
    }
 
-   p->fp.colors = (1 << 24) | 4; /* CLAMP, FFC0_ID = 4 */
+   p->fp.colors = 4 << NV50_3D_MAP_SEMANTIC_0_FFC0_ID__SHIFT; /* after HPOS */
 
    for (i = 0; i < p->in_nr; ++i) {
       int j = p->in[i].id;
index 7690c80eef0d62568e7d81bb30de470d538ecb5d..9978d1e7861e3f4345dde39a9366cfea9693044a 100644 (file)
@@ -108,6 +108,8 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
       return 1;
    case PIPE_CAP_MAX_RENDER_TARGETS:
       return 8;
+   case PIPE_CAP_FRAGMENT_COLOR_CLAMP_CONTROL:
+      return 1;
    case PIPE_CAP_TIMER_QUERY:
    case PIPE_CAP_OCCLUSION_QUERY:
       return 1;
index bea9c095bb3bbb0b6ace6033f9d6f30c7758cf40..82c346cb5eab340e86ad9d3bc70354fd2e8e1086 100644 (file)
@@ -226,7 +226,7 @@ nv50_gmtyprog_validate(struct nv50_context *nv50)
    OUT_RING  (chan, gp->code_base);
 }
 
-void
+static void
 nv50_sprite_coords_validate(struct nv50_context *nv50)
 {
    struct nouveau_channel *chan = nv50->screen->base.channel;
@@ -282,6 +282,39 @@ nv50_sprite_coords_validate(struct nv50_context *nv50)
    OUT_RINGp (chan, pntc, 8);
 }
 
+/* Validate state derived from shaders and the rasterizer cso. */
+void
+nv50_validate_derived_rs(struct nv50_context *nv50)
+{
+   struct nouveau_channel *chan = nv50->screen->base.channel;
+   uint32_t color, psize;
+
+   nv50_sprite_coords_validate(nv50);
+
+   if (nv50->dirty & NV50_NEW_FRAGPROG)
+      return;
+   psize = nv50->state.semantic_psize & ~NV50_3D_MAP_SEMANTIC_3_PTSZ_EN__MASK;
+   color = nv50->state.semantic_color & ~NV50_3D_MAP_SEMANTIC_0_CLMP_EN;
+
+   if (nv50->rast->pipe.clamp_vertex_color)
+      color |= NV50_3D_MAP_SEMANTIC_0_CLMP_EN;
+
+   if (color != nv50->state.semantic_color) {
+      nv50->state.semantic_color = color;
+      BEGIN_RING(chan, RING_3D(MAP_SEMANTIC_0), 1);
+      OUT_RING  (chan, color);
+   }
+
+   if (nv50->rast->pipe.point_size_per_vertex)
+      psize |= NV50_3D_MAP_SEMANTIC_3_PTSZ_EN__MASK;
+
+   if (psize != nv50->state.semantic_psize) {
+      nv50->state.semantic_psize = psize;
+      BEGIN_RING(chan, RING_3D(MAP_SEMANTIC_3), 1);
+      OUT_RING  (chan, psize);
+   }
+}
+
 static int
 nv50_vec4_map(uint8_t *map, int mid, uint32_t lin[4],
               struct nv50_varying *in, struct nv50_varying *out)
@@ -372,6 +405,9 @@ nv50_fp_linkage_validate(struct nv50_context *nv50)
       map[m++] = vp->vp.psiz;
    }
 
+   if (nv50->rast->pipe.clamp_vertex_color)
+      colors |= NV50_3D_MAP_SEMANTIC_0_CLMP_EN;
+
    n = (m + 3) / 4;
    assert(m <= 64);
 
@@ -404,6 +440,9 @@ nv50_fp_linkage_validate(struct nv50_context *nv50)
 
    nv50->state.interpolant_ctrl = interp;
 
+   nv50->state.semantic_color = colors;
+   nv50->state.semantic_psize = psiz;
+
    BEGIN_RING(chan, RING_3D(NOPERSPECTIVE_BITMAP(0)), 4);
    OUT_RINGp (chan, lin, 4);
 
index db2571596989ebd44a3d5dc21797298dfc920281..4c96db84e43bf164a77ba9d29d2246d2941b247f 100644 (file)
@@ -198,6 +198,9 @@ nv50_rasterizer_state_create(struct pipe_context *pipe,
    SB_BEGIN_3D(so, VERTEX_TWO_SIDE_ENABLE, 1);
    SB_DATA    (so, cso->light_twoside);
 
+   SB_BEGIN_3D(so, FRAG_COLOR_CLAMP_EN, 1);
+   SB_DATA    (so, cso->clamp_fragment_color ? 0x11111111 : 0x00000000);
+
    SB_BEGIN_3D(so, LINE_WIDTH, 1);
    SB_DATA    (so, fui(cso->line_width));
    SB_BEGIN_3D(so, LINE_SMOOTH_ENABLE, 1);
index f3d45eb95e03ebd48260304b0f185785d240614f..cdf1a982fcc32df3a0079bd1c0c5b42eba2c9920 100644 (file)
@@ -309,7 +309,7 @@ static struct state_validate {
     { nv50_fp_linkage_validate,    NV50_NEW_FRAGPROG | NV50_NEW_VERTPROG |
                                    NV50_NEW_GMTYPROG },
     { nv50_gp_linkage_validate,    NV50_NEW_GMTYPROG | NV50_NEW_VERTPROG },
-    { nv50_sprite_coords_validate, NV50_NEW_FRAGPROG | NV50_NEW_RASTERIZER |
+    { nv50_validate_derived_rs,    NV50_NEW_FRAGPROG | NV50_NEW_RASTERIZER |
                                    NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG },
     { nv50_constbufs_validate,     NV50_NEW_CONSTBUF },
     { nv50_validate_textures,      NV50_NEW_TEXTURES },
index 515e3e78d42c9ef0c55c04646abb7aea10bfea3f..cd55ad83f847890994f0952c3769fb8bad3897da 100644 (file)
@@ -27,7 +27,7 @@ struct nv50_blend_stateobj {
 struct nv50_rasterizer_stateobj {
    struct pipe_rasterizer_state pipe;
    int size;
-   uint32_t state[40];
+   uint32_t state[42];
 };
 
 struct nv50_zsa_stateobj {
index 1047ba3c3377822dbdc9bd26c9478089d8b096f1..f0f5237de52892a603754aa4b93febfebd42a63c 100644 (file)
@@ -93,6 +93,8 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
       return 1;
    case PIPE_CAP_MAX_RENDER_TARGETS:
       return 8;
+   case PIPE_CAP_FRAGMENT_COLOR_CLAMP_CONTROL:
+      return 1;
    case PIPE_CAP_TIMER_QUERY:
    case PIPE_CAP_OCCLUSION_QUERY:
       return 1;
@@ -599,8 +601,6 @@ nvc0_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
    BEGIN_RING(chan, RING_3D(POINT_RASTER_RULES), 1);
    OUT_RING  (chan, NVC0_3D_POINT_RASTER_RULES_OGL);
 
-   BEGIN_RING(chan, RING_3D(FRAG_COLOR_CLAMP_EN), 1);
-   OUT_RING  (chan, 0x11111111);
    BEGIN_RING(chan, RING_3D(EDGEFLAG_ENABLE), 1);
    OUT_RING  (chan, 1);
 
index 7294eaa222e1b074cd859d358e612c959c966207..287160e0b2a22ead185b4d9a0b4e7c10266e74a0 100644 (file)
@@ -97,8 +97,6 @@ nvc0_vertprog_validate(struct nvc0_context *nvc0)
 
    // BEGIN_RING(chan, RING_3D_(0x163c), 1);
    // OUT_RING  (chan, 0);
-   BEGIN_RING(chan, RING_3D(VERT_COLOR_CLAMP_EN), 1);
-   OUT_RING  (chan, 1);
 }
 
 void
index ab68abcfb5a6497bcc4544be6aeb94acd3c3d56e..c482b25f6b62f663b635e1bec2aa220ffe558dce 100644 (file)
@@ -183,6 +183,10 @@ nvc0_rasterizer_state_create(struct pipe_context *pipe,
     SB_IMMED_3D(so, PROVOKING_VERTEX_LAST, !cso->flatshade_first);
     SB_IMMED_3D(so, VERTEX_TWO_SIDE_ENABLE, cso->light_twoside);
 
+    SB_IMMED_3D(so, VERT_COLOR_CLAMP_EN, cso->clamp_vertex_color);
+    SB_BEGIN_3D(so, FRAG_COLOR_CLAMP_EN, 1);
+    SB_DATA    (so, cso->clamp_fragment_color ? 0x11111111 : 0x00000000);
+
     SB_BEGIN_3D(so, LINE_WIDTH, 1);
     SB_DATA    (so, fui(cso->line_width));
     SB_IMMED_3D(so, LINE_SMOOTH_ENABLE, cso->line_smooth);
index 8222f9375ee2c69adaa349164f267b14a9fcb55b..cc6b04d3578c4910a6a82260492c45ea1a57b71a 100644 (file)
@@ -25,7 +25,7 @@ struct nvc0_blend_stateobj {
 struct nvc0_rasterizer_stateobj {
    struct pipe_rasterizer_state pipe;
    int size;
-   uint32_t state[36];
+   uint32_t state[39];
 };
 
 struct nvc0_zsa_stateobj {