r300g: turn blend color into a CB
authorMarek Olšák <maraeo@gmail.com>
Sun, 13 Jun 2010 01:25:39 +0000 (03:25 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sun, 13 Jun 2010 15:43:38 +0000 (17:43 +0200)
src/gallium/drivers/r300/r300_context.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_state.c

index 43e567c432883d9e6909554529bd3095d2430664..aac3660207f9873170f3dddc73573efaca1b9f9c 100644 (file)
@@ -164,6 +164,19 @@ static void r300_setup_atoms(struct r300_context* r300)
     r300->texture_cache_inval.allow_null_state = TRUE;
 }
 
+/* Not every state tracker calls every driver function before the first draw
+ * call and we must initialize the command buffers somehow. */
+static void r300_init_states(struct pipe_context *pipe)
+{
+    struct pipe_blend_color bc = {{0}};
+    struct pipe_clip_state cs = {{{0}}};
+    struct pipe_scissor_state ss = {0};
+
+    pipe->set_blend_color(pipe, &bc);
+    pipe->set_clip_state(pipe, &cs);
+    pipe->set_scissor_state(pipe, &ss);
+}
+
 struct pipe_context* r300_create_context(struct pipe_screen* screen,
                                          void *priv)
 {
@@ -231,6 +244,8 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
 
     r300->tran.translate_cache = translate_cache_create();
 
+    r300_init_states(&r300->context);
+
     return &r300->context;
 
  no_upload_ib:
index a527ba07416439a8fc1e5a91084c4e4568a8f78b..6d6185cf1f5ff12dfa1bca248c4fa908c29763f5 100644 (file)
@@ -67,11 +67,7 @@ struct r300_blend_state {
 };
 
 struct r300_blend_color_state {
-    /* RV515 and earlier */
-    uint32_t blend_color;            /* R300_RB3D_BLEND_COLOR: 0x4e10 */
-    /* R520 and newer */
-    uint32_t blend_color_red_alpha;  /* R500_RB3D_CONSTANT_COLOR_AR: 0x4ef8 */
-    uint32_t blend_color_green_blue; /* R500_RB3D_CONSTANT_COLOR_GB: 0x4efc */
+    uint32_t cb[3];
 };
 
 struct r300_dsa_state {
index 2c1d67eaa10b84ff0b94ac84bdcc3d4010628e42..04a3ab5fb3712a6353b0ba097fb2cd136b3d0402 100644 (file)
@@ -56,17 +56,7 @@ void r300_emit_blend_color_state(struct r300_context* r300,
     struct r300_blend_color_state* bc = (struct r300_blend_color_state*)state;
     CS_LOCALS(r300);
 
-    if (r300->screen->caps.is_r500) {
-        BEGIN_CS(size);
-        OUT_CS_REG_SEQ(R500_RB3D_CONSTANT_COLOR_AR, 2);
-        OUT_CS(bc->blend_color_red_alpha);
-        OUT_CS(bc->blend_color_green_blue);
-        END_CS;
-    } else {
-        BEGIN_CS(size);
-        OUT_CS_REG(R300_RB3D_BLEND_COLOR, bc->blend_color);
-        END_CS;
-    }
+    WRITE_CS_TABLE(bc->cb, size);
 }
 
 void r300_emit_clip_state(struct r300_context* r300,
index 73d866fa5d7d43893bd2e77f06ad61c019b1a772..d5ed119527f5bbab0dbd97dbfa600f85dc35dfa4 100644 (file)
@@ -394,20 +394,26 @@ static void r300_set_blend_color(struct pipe_context* pipe,
     struct r300_context* r300 = r300_context(pipe);
     struct r300_blend_color_state* state =
         (struct r300_blend_color_state*)r300->blend_color_state.state;
-    union util_color uc;
+    CB_LOCALS;
 
-    util_pack_color(color->color, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
-    state->blend_color = uc.ui;
+    if (r300->screen->caps.is_r500) {
+        /* XXX if FP16 blending is enabled, we should use the FP16 format */
+        BEGIN_CB(state->cb, 3);
+        OUT_CB_REG_SEQ(R500_RB3D_CONSTANT_COLOR_AR, 2);
+        OUT_CB(float_to_fixed10(color->color[0]) |
+               (float_to_fixed10(color->color[3]) << 16));
+        OUT_CB(float_to_fixed10(color->color[2]) |
+               (float_to_fixed10(color->color[1]) << 16));
+        END_CB;
+    } else {
+        union util_color uc;
+        util_pack_color(color->color, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
 
-    /* XXX if FP16 blending is enabled, we should use the FP16 format */
-    state->blend_color_red_alpha =
-        float_to_fixed10(color->color[0]) |
-        (float_to_fixed10(color->color[3]) << 16);
-    state->blend_color_green_blue =
-        float_to_fixed10(color->color[2]) |
-        (float_to_fixed10(color->color[1]) << 16);
+        BEGIN_CB(state->cb, 2);
+        OUT_CB_REG(R300_RB3D_BLEND_COLOR, uc.ui);
+        END_CB;
+    }
 
-    r300->blend_color_state.size = r300->screen->caps.is_r500 ? 3 : 2;
     r300->blend_color_state.dirty = TRUE;
 }