Mesa (master): i915g: Switch to state atoms

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Tue Jun 22 11:08:52 PDT 2010


Module: Mesa
Branch: master
Commit: e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e694f3fd4865f7e85cf1d4c9fe5789fad399dbc6

Author: Jakob Bornecrantz <wallbraker at gmail.com>
Date:   Sat Jun 12 01:34:54 2010 +0200

i915g: Switch to state atoms

---

 src/gallium/drivers/i915/i915_state.h           |   19 ++++--
 src/gallium/drivers/i915/i915_state_derived.c   |   75 ++++++++++++++++-------
 src/gallium/drivers/i915/i915_state_dynamic.c   |   43 +++++++++-----
 src/gallium/drivers/i915/i915_state_immediate.c |   33 +++++++---
 src/gallium/drivers/i915/i915_state_sampler.c   |   15 ++++-
 5 files changed, 128 insertions(+), 57 deletions(-)

diff --git a/src/gallium/drivers/i915/i915_state.h b/src/gallium/drivers/i915/i915_state.h
index 86c6b00..7795046 100644
--- a/src/gallium/drivers/i915/i915_state.h
+++ b/src/gallium/drivers/i915/i915_state.h
@@ -35,16 +35,21 @@ struct i915_context;
 
 
 struct i915_tracked_state {
+   const char *name;
+   void (*update)(struct i915_context *);
    unsigned dirty;
-   void (*update)( struct i915_context * );
 };
 
-void i915_update_immediate( struct i915_context *i915 );
-void i915_update_dynamic( struct i915_context *i915 );
-void i915_update_derived( struct i915_context *i915 );
-void i915_update_samplers( struct i915_context *i915 );
-void i915_update_textures(struct i915_context *i915);
+extern struct i915_tracked_state i915_update_vertex_layout;
 
-void i915_emit_hardware_state( struct i915_context *i915 );
+extern struct i915_tracked_state i915_hw_samplers;
+extern struct i915_tracked_state i915_hw_sampler_views;
+extern struct i915_tracked_state i915_hw_immediate;
+extern struct i915_tracked_state i915_hw_dynamic;
+extern struct i915_tracked_state i915_hw_fs;
+extern struct i915_tracked_state i915_hw_framebuffer;
+
+void i915_update_derived(struct i915_context *i915);
+void i915_emit_hardware_state(struct i915_context *i915);
 
 #endif
diff --git a/src/gallium/drivers/i915/i915_state_derived.c b/src/gallium/drivers/i915/i915_state_derived.c
index 4da4677..5ebda94 100644
--- a/src/gallium/drivers/i915/i915_state_derived.c
+++ b/src/gallium/drivers/i915/i915_state_derived.c
@@ -36,11 +36,11 @@
 
 
 
-/**
+/***********************************************************************
  * Determine the hardware vertex layout.
  * Depends on vertex/fragment shader state.
  */
-static void calculate_vertex_layout( struct i915_context *i915 )
+static void calculate_vertex_layout(struct i915_context *i915)
 {
    const struct i915_fragment_shader *fs = i915->fs;
    const enum interp_mode colorInterp = i915->rasterizer->color_interp;
@@ -146,37 +146,68 @@ static void calculate_vertex_layout( struct i915_context *i915 )
    }
 }
 
+struct i915_tracked_state i915_update_vertex_layout = {
+   "vertex_layout",
+   calculate_vertex_layout,
+   I915_NEW_RASTERIZER | I915_NEW_FS | I915_NEW_VS
+};
 
 
 
-/* Hopefully this will remain quite simple, otherwise need to pull in
- * something like the state tracker mechanism.
+/***********************************************************************
+ * Update fragment state
  */
-void i915_update_derived( struct i915_context *i915 )
+static void update_fs(struct i915_context *i915)
 {
-   if (i915->dirty & (I915_NEW_RASTERIZER | I915_NEW_FS | I915_NEW_VS))
-      calculate_vertex_layout( i915 );
-
-   if (i915->dirty & (I915_NEW_SAMPLER | I915_NEW_SAMPLER_VIEW))
-      i915_update_samplers(i915);
-
-   if (i915->dirty & I915_NEW_SAMPLER_VIEW)
-      i915_update_textures(i915);
+   i915->hardware_dirty |= I915_HW_PROGRAM; /* XXX right? */
+}
 
-   if (i915->dirty)
-      i915_update_immediate( i915 );
+struct i915_tracked_state i915_hw_fs = {
+   "fs",
+   update_fs,
+   I915_NEW_FS
+};
 
-   if (i915->dirty)
-      i915_update_dynamic( i915 );
 
-   if (i915->dirty & I915_NEW_FS) {
-      i915->hardware_dirty |= I915_HW_PROGRAM; /* XXX right? */
-   }
 
+/***********************************************************************
+ * Update framebuffer state
+ */
+static void update_framebuffer(struct i915_context *i915)
+{
    /* HW emit currently references framebuffer state directly:
     */
-   if (i915->dirty & I915_NEW_FRAMEBUFFER)
-      i915->hardware_dirty |= I915_HW_STATIC;
+   i915->hardware_dirty |= I915_HW_STATIC;
+}
+
+struct i915_tracked_state i915_hw_framebuffer = {
+   "framebuffer",
+   update_framebuffer,
+   I915_NEW_FRAMEBUFFER
+};
+
+
+
+/***********************************************************************
+ */
+static struct i915_tracked_state *atoms[] = {
+   &i915_update_vertex_layout,
+   &i915_hw_samplers,
+   &i915_hw_sampler_views,
+   &i915_hw_immediate,
+   &i915_hw_dynamic,
+   &i915_hw_fs,
+   &i915_hw_framebuffer,
+   NULL,
+};
+
+void i915_update_derived(struct i915_context *i915)
+{
+   int i;
+
+   for (i = 0; atoms[i]; i++)
+      if (atoms[i]->dirty & i915->dirty)
+         atoms[i]->update(i915);
 
    i915->dirty = 0;
 }
diff --git a/src/gallium/drivers/i915/i915_state_dynamic.c b/src/gallium/drivers/i915/i915_state_dynamic.c
index 7a66a3e..d63d4a9 100644
--- a/src/gallium/drivers/i915/i915_state_dynamic.c
+++ b/src/gallium/drivers/i915/i915_state_dynamic.c
@@ -86,8 +86,9 @@ static void upload_MODES4(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_MODES4 = {
-   I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL,
-   upload_MODES4
+   "MODES4",
+   upload_MODES4,
+   I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL
 };
 
 
@@ -111,8 +112,9 @@ static void upload_BFO(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_BFO = {
-   I915_NEW_DEPTH_STENCIL,
-   upload_BFO
+   "BFO",
+   upload_BFO,
+   I915_NEW_DEPTH_STENCIL
 };
 
 
@@ -144,8 +146,9 @@ static void upload_BLENDCOLOR(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_BLENDCOLOR = {
-   I915_NEW_BLEND,
-   upload_BLENDCOLOR
+   "BLENDCOLOR",
+   upload_BLENDCOLOR,
+   I915_NEW_BLEND
 };
 
 
@@ -163,8 +166,9 @@ static void upload_IAB(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_IAB = {
-   I915_NEW_BLEND,
-   upload_IAB
+   "IAB",
+   upload_IAB,
+   I915_NEW_BLEND
 };
 
 
@@ -180,8 +184,9 @@ static void upload_DEPTHSCALE(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_DEPTHSCALE = {
-   I915_NEW_RASTERIZER,
-   upload_DEPTHSCALE
+   "DEPTHSCALE",
+   upload_DEPTHSCALE,
+   I915_NEW_RASTERIZER
 };
 
 
@@ -234,8 +239,9 @@ static void upload_STIPPLE(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_STIPPLE = {
-   I915_NEW_RASTERIZER | I915_NEW_STIPPLE,
-   upload_STIPPLE
+   "STIPPLE",
+   upload_STIPPLE,
+   I915_NEW_RASTERIZER | I915_NEW_STIPPLE
 };
 
 
@@ -281,8 +287,9 @@ static void upload_SCISSOR_RECT(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_SCISSOR_RECT = {
-   I915_NEW_SCISSOR,
-   upload_SCISSOR_RECT
+   "SCISSOR RECT",
+   upload_SCISSOR_RECT,
+   I915_NEW_SCISSOR
 };
 
 
@@ -303,7 +310,7 @@ static const struct i915_tracked_state *atoms[] = {
 /* These will be dynamic indirect state commands, but for now just end
  * up on the batch buffer with everything else.
  */
-void i915_update_dynamic(struct i915_context *i915)
+static void update_dynamic(struct i915_context *i915)
 {
    int i;
 
@@ -311,3 +318,9 @@ void i915_update_dynamic(struct i915_context *i915)
       if (i915->dirty & atoms[i]->dirty)
          atoms[i]->update(i915);
 }
+
+struct i915_tracked_state i915_hw_dynamic = {
+   "dynamic",
+   update_dynamic,
+   ~0 /* all state atoms, becuase we do internal checking */
+};
diff --git a/src/gallium/drivers/i915/i915_state_immediate.c b/src/gallium/drivers/i915/i915_state_immediate.c
index fb7fa8f..f9ade70 100644
--- a/src/gallium/drivers/i915/i915_state_immediate.c
+++ b/src/gallium/drivers/i915/i915_state_immediate.c
@@ -79,8 +79,9 @@ static void upload_S0S1(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_S0S1 = {
-   I915_NEW_VBO | I915_NEW_VERTEX_FORMAT,
-   upload_S0S1
+   "imm S0 S1",
+   upload_S0S1,
+   I915_NEW_VBO | I915_NEW_VERTEX_FORMAT
 };
 
 
@@ -115,8 +116,9 @@ static void upload_S2S4(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_S2S4 = {
-   I915_NEW_RASTERIZER | I915_NEW_VERTEX_FORMAT,
-   upload_S2S4
+   "imm S2 S4",
+   upload_S2S4,
+   I915_NEW_RASTERIZER | I915_NEW_VERTEX_FORMAT
 };
 
 
@@ -152,8 +154,9 @@ static void upload_S5(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_S5 = {
-   (I915_NEW_DEPTH_STENCIL | I915_NEW_BLEND | I915_NEW_RASTERIZER),
-   upload_S5
+   "imm S5",
+   upload_S5,
+   I915_NEW_DEPTH_STENCIL | I915_NEW_BLEND | I915_NEW_RASTERIZER
 };
 
 
@@ -184,8 +187,9 @@ static void upload_S6(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_S6 = {
-   I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL | I915_NEW_FRAMEBUFFER,
-   upload_S6
+   "imm s6",
+   upload_S6,
+   I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL | I915_NEW_FRAMEBUFFER
 };
 
 
@@ -207,8 +211,9 @@ static void upload_S7(struct i915_context *i915)
 }
 
 const struct i915_tracked_state i915_upload_S7 = {
-   I915_NEW_RASTERIZER,
-   upload_S7
+   "imm S7",
+   upload_S7,
+   I915_NEW_RASTERIZER
 };
 
 
@@ -223,7 +228,7 @@ static const struct i915_tracked_state *atoms[] = {
    &i915_upload_S7
 };
 
-void i915_update_immediate(struct i915_context *i915)
+static void update_immediate(struct i915_context *i915)
 {
    int i;
 
@@ -231,3 +236,9 @@ void i915_update_immediate(struct i915_context *i915)
       if (i915->dirty & atoms[i]->dirty)
          atoms[i]->update(i915);
 }
+
+struct i915_tracked_state i915_hw_immediate = {
+   "immediate",
+   update_immediate,
+   ~0 /* all state atoms, becuase we do internal checking */
+};
diff --git a/src/gallium/drivers/i915/i915_state_sampler.c b/src/gallium/drivers/i915/i915_state_sampler.c
index 8d2f16b..941259e 100644
--- a/src/gallium/drivers/i915/i915_state_sampler.c
+++ b/src/gallium/drivers/i915/i915_state_sampler.c
@@ -140,7 +140,7 @@ static void update_sampler(struct i915_context *i915,
    state[1] |= (unit << SS3_TEXTUREMAP_INDEX_SHIFT);
 }
 
-void i915_update_samplers(struct i915_context *i915)
+static void update_samplers(struct i915_context *i915)
 {
    uint unit;
 
@@ -173,6 +173,11 @@ void i915_update_samplers(struct i915_context *i915)
    i915->hardware_dirty |= I915_HW_SAMPLER | I915_HW_MAP;
 }
 
+struct i915_tracked_state i915_hw_samplers = {
+   "sampler_views",
+   update_samplers,
+   I915_NEW_SAMPLER | I915_NEW_SAMPLER_VIEW
+};
 
 
 
@@ -291,7 +296,7 @@ static void update_texture(struct i915_context *i915,
        | ((depth - 1) << MS4_VOLUME_DEPTH_SHIFT));
 }
 
-void i915_update_textures(struct i915_context *i915)
+static void update_textures(struct i915_context *i915)
 {
    uint unit;
 
@@ -312,3 +317,9 @@ void i915_update_textures(struct i915_context *i915)
 
    i915->hardware_dirty |= I915_HW_MAP;
 }
+
+struct i915_tracked_state i915_hw_sampler_views = {
+   "sampler_views",
+   update_textures,
+   I915_NEW_SAMPLER_VIEW
+};



More information about the mesa-commit mailing list