Convert the i915 driver blend state to the new semantics.
authorZack Rusin <zack@tungstengraphics.com>
Wed, 19 Sep 2007 17:05:58 +0000 (13:05 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Wed, 19 Sep 2007 17:12:09 +0000 (13:12 -0400)
src/mesa/pipe/i915simple/i915_context.h
src/mesa/pipe/i915simple/i915_state.c
src/mesa/pipe/i915simple/i915_state_dynamic.c
src/mesa/pipe/i915simple/i915_state_immediate.c

index 9052c92..ea6d1ce 100644 (file)
@@ -113,7 +113,12 @@ struct i915_state
    unsigned id;                        /* track lost context events */
 };
 
-
+struct i915_blend_state {
+   unsigned iab;
+   unsigned modes4;
+   unsigned LIS5;
+   unsigned LIS6;
+};
 
 struct i915_context
 {
@@ -123,7 +128,7 @@ struct i915_context
 
    /* The most recent drawing state as set by the driver:
     */
-   const struct pipe_blend_state   *blend;
+   const struct i915_blend_state   *blend;
    const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
    const struct pipe_depth_stencil_state   *depth_stencil;
    const struct pipe_rasterizer_state *rasterizer;
index 86c1089..4a4d26b 100644 (file)
@@ -33,7 +33,9 @@
 #include "pipe/p_winsys.h"
 
 #include "i915_context.h"
+#include "i915_reg.h"
 #include "i915_state.h"
+#include "i915_state_inlines.h"
 
 /* None of this state is actually used for anything yet.
  */
@@ -42,25 +44,90 @@ static void *
 i915_create_blend_state(struct pipe_context *pipe,
                         const struct pipe_blend_state *blend)
 {
-   struct pipe_blend_state *new_blend = malloc(sizeof(struct pipe_blend_state));
-   memcpy(new_blend, blend, sizeof(struct pipe_blend_state));
+   struct i915_blend_state *cso_data = calloc(1, sizeof(struct i915_blend_state));
 
-   return new_blend;
+   {
+      unsigned eqRGB  = blend->rgb_func;
+      unsigned srcRGB = blend->rgb_src_factor;
+      unsigned dstRGB = blend->rgb_dst_factor;
+
+      unsigned eqA    = blend->alpha_func;
+      unsigned srcA   = blend->alpha_src_factor;
+      unsigned dstA   = blend->alpha_dst_factor;
+
+      /* Special handling for MIN/MAX filter modes handled at
+       * state_tracker level.
+       */
+
+      if (srcA != srcRGB ||
+         dstA != dstRGB ||
+         eqA != eqRGB) {
+
+        cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
+                          IAB_MODIFY_ENABLE |
+                          IAB_ENABLE |
+                          IAB_MODIFY_FUNC |
+                          IAB_MODIFY_SRC_FACTOR |
+                          IAB_MODIFY_DST_FACTOR |
+                          SRC_ABLND_FACT(i915_translate_blend_factor(srcA)) |
+                          DST_ABLND_FACT(i915_translate_blend_factor(dstA)) |
+                          (i915_translate_blend_func(eqA) << IAB_FUNC_SHIFT));
+      }
+      else {
+        cso_data->iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
+                          IAB_MODIFY_ENABLE |
+                          0);
+      }
+   }
+
+   cso_data->modes4 |= (_3DSTATE_MODES_4_CMD |
+                        ENABLE_LOGIC_OP_FUNC |
+                        LOGIC_OP_FUNC(i915_translate_logic_op(blend->logicop_func)));
+
+   if (blend->logicop_enable)
+      cso_data->LIS5 |= S5_LOGICOP_ENABLE;
+
+   if (blend->dither)
+      cso_data->LIS5 |= S5_COLOR_DITHER_ENABLE;
+
+   if ((blend->colormask & PIPE_MASK_R) == 0)
+      cso_data->LIS5 |= S5_WRITEDISABLE_RED;
+
+   if ((blend->colormask & PIPE_MASK_G) == 0)
+      cso_data->LIS5 |= S5_WRITEDISABLE_GREEN;
+
+   if ((blend->colormask & PIPE_MASK_B) == 0)
+      cso_data->LIS5 |= S5_WRITEDISABLE_BLUE;
+
+   if ((blend->colormask & PIPE_MASK_A) == 0)
+      cso_data->LIS5 |= S5_WRITEDISABLE_ALPHA;
+
+   if (blend->blend_enable) {
+      unsigned funcRGB = blend->rgb_func;
+      unsigned srcRGB  = blend->rgb_src_factor;
+      unsigned dstRGB  = blend->rgb_dst_factor;
+
+      cso_data->LIS6 |= (S6_CBUF_BLEND_ENABLE |
+                         SRC_BLND_FACT(i915_translate_blend_factor(srcRGB)) |
+                         DST_BLND_FACT(i915_translate_blend_factor(dstRGB)) |
+                         (i915_translate_blend_func(funcRGB) << S6_CBUF_BLEND_FUNC_SHIFT));
+   }
+
+   return cso_data;
 }
 
-static void i915_bind_blend_state( struct pipe_context *pipe,
-                                   void *blend )
+static void i915_bind_blend_state(struct pipe_context *pipe,
+                                  void *blend)
 {
    struct i915_context *i915 = i915_context(pipe);
 
-   i915->blend = (struct pipe_blend_state *)blend;
+   i915->blend = (struct i915_blend_state*)blend;
 
    i915->dirty |= I915_NEW_BLEND;
 }
 
 
-static void i915_delete_blend_state( struct pipe_context *pipe,
-                                     void *blend )
+static void i915_delete_blend_state(struct pipe_context *pipe, void *blend)
 {
    free(blend);
 }
index a979196..262ac94 100644 (file)
@@ -79,12 +79,8 @@ static void upload_MODES4( struct i915_context *i915 )
    }
 
    /* I915_NEW_BLEND */
-   {
-      modes4 |= (_3DSTATE_MODES_4_CMD |
-                ENABLE_LOGIC_OP_FUNC |
-                LOGIC_OP_FUNC(i915_translate_logic_op(i915->blend->logicop_func)));
-   }
-   
+   modes4 |= i915->blend->modes4;
+
    /* Always, so that we know when state is in-active: 
     */
    set_dynamic_indirect( i915, 
@@ -201,44 +197,10 @@ const struct i915_tracked_state i915_upload_BLENDCOLOR = {
 
 static void upload_IAB( struct i915_context *i915 )
 {
-   unsigned iab = 0;
-
-   {
-      unsigned eqRGB  = i915->blend->rgb_func;
-      unsigned srcRGB = i915->blend->rgb_src_factor;
-      unsigned dstRGB = i915->blend->rgb_dst_factor;
+   unsigned iab = i915->blend->iab;
 
-      unsigned eqA    = i915->blend->alpha_func;
-      unsigned srcA   = i915->blend->alpha_src_factor;
-      unsigned dstA   = i915->blend->alpha_dst_factor;
 
-      /* Special handling for MIN/MAX filter modes handled at
-       * state_tracker level.
-       */
-
-      if (srcA != srcRGB ||
-         dstA != dstRGB ||
-         eqA != eqRGB) {
-
-        iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |    
-               IAB_MODIFY_ENABLE |
-               IAB_ENABLE |
-               IAB_MODIFY_FUNC | 
-               IAB_MODIFY_SRC_FACTOR | 
-               IAB_MODIFY_DST_FACTOR |
-               SRC_ABLND_FACT(i915_translate_blend_factor(srcA)) |
-               DST_ABLND_FACT(i915_translate_blend_factor(dstA)) |
-               (i915_translate_blend_func(eqA) << IAB_FUNC_SHIFT));
-      }         
-      else {
-        iab = (_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |    
-               IAB_MODIFY_ENABLE |
-               0);
-      }
-   }
-
-
-   set_dynamic_indirect( i915, 
+   set_dynamic_indirect( i915,
                         I915_DYNAMIC_IAB,
                         &iab,
                         1 );
index 73508f5..38cf2ad 100644 (file)
@@ -144,25 +144,7 @@ static void upload_S5( struct i915_context *i915 )
               (dpop << S5_STENCIL_PASS_Z_PASS_SHIFT));
    }
 
-   /* I915_NEW_BLEND */
-   if (i915->blend->logicop_enable) 
-      LIS5 |= S5_LOGICOP_ENABLE;
-
-   if (i915->blend->dither) 
-      LIS5 |= S5_COLOR_DITHER_ENABLE;
-
-   if ((i915->blend->colormask & PIPE_MASK_R) == 0)
-      LIS5 |= S5_WRITEDISABLE_RED;
-
-   if ((i915->blend->colormask & PIPE_MASK_G) == 0)
-      LIS5 |= S5_WRITEDISABLE_GREEN;
-   
-   if ((i915->blend->colormask & PIPE_MASK_B) == 0)
-      LIS5 |= S5_WRITEDISABLE_BLUE;
-
-   if ((i915->blend->colormask & PIPE_MASK_A) == 0)
-      LIS5 |= S5_WRITEDISABLE_ALPHA;
-
+   LIS5 |= i915->blend->LIS5;
 
 #if 0
    /* I915_NEW_RASTERIZER */
@@ -205,17 +187,7 @@ static void upload_S6( struct i915_context *i915 )
 
    /* I915_NEW_BLEND
     */
-   if (i915->blend->blend_enable)
-   {
-      unsigned funcRGB = i915->blend->rgb_func;
-      unsigned srcRGB = i915->blend->rgb_src_factor;
-      unsigned dstRGB = i915->blend->rgb_dst_factor;
-      
-      LIS6 |= (S6_CBUF_BLEND_ENABLE |
-              SRC_BLND_FACT(i915_translate_blend_factor(srcRGB)) |
-              DST_BLND_FACT(i915_translate_blend_factor(dstRGB)) |
-              (i915_translate_blend_func(funcRGB) << S6_CBUF_BLEND_FUNC_SHIFT));
-   }
+   LIS6 |= i915->blend->LIS6;
 
    /* I915_NEW_DEPTH 
     */