diff options
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/i915/i915_context.c | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/i915/i915_context.h | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/i915/i915_flush.c | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/i915/i915_state_dynamic.c | 69 | ||||
| -rw-r--r-- | src/gallium/drivers/i915/i915_state_emit.c | 4 | 
5 files changed, 36 insertions, 40 deletions
| diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c index 99303fae36..707b2e9f95 100644 --- a/src/gallium/drivers/i915/i915_context.c +++ b/src/gallium/drivers/i915/i915_context.c @@ -164,6 +164,7 @@ i915_create_context(struct pipe_screen *screen, void *priv)     i915->dirty = ~0;     i915->hardware_dirty = ~0;     i915->immediate_dirty = ~0; +   i915->dynamic_dirty = ~0;     /* Batch stream debugging is a bit hacked up at the moment:      */ diff --git a/src/gallium/drivers/i915/i915_context.h b/src/gallium/drivers/i915/i915_context.h index 0e53b0eafd..2cf53424f0 100644 --- a/src/gallium/drivers/i915/i915_context.h +++ b/src/gallium/drivers/i915/i915_context.h @@ -236,6 +236,7 @@ struct i915_context {     struct i915_state current;     unsigned hardware_dirty;     unsigned immediate_dirty; +   unsigned dynamic_dirty;     struct util_slab_mempool transfer_pool;  }; diff --git a/src/gallium/drivers/i915/i915_flush.c b/src/gallium/drivers/i915/i915_flush.c index 440e07e5ed..911c051d1f 100644 --- a/src/gallium/drivers/i915/i915_flush.c +++ b/src/gallium/drivers/i915/i915_flush.c @@ -95,4 +95,5 @@ void i915_flush(struct i915_context *i915, struct pipe_fence_handle **fence)     i915->vbo_flushed = 1;     i915->hardware_dirty = ~0;     i915->immediate_dirty = ~0; +   i915->dynamic_dirty = ~0;  } diff --git a/src/gallium/drivers/i915/i915_state_dynamic.c b/src/gallium/drivers/i915/i915_state_dynamic.c index d61a8c3407..204cee6fe9 100644 --- a/src/gallium/drivers/i915/i915_state_dynamic.c +++ b/src/gallium/drivers/i915/i915_state_dynamic.c @@ -46,18 +46,34 @@   * (active) state every time a 4kb boundary is crossed.   */ -static INLINE void set_dynamic_indirect(struct i915_context *i915, -                                        unsigned offset, -                                        const unsigned *src, -                                        unsigned dwords) +static INLINE void set_dynamic(struct i915_context *i915, +                               unsigned offset, +                               const unsigned state) +{ +   if (i915->current.dynamic[offset] == state) +      return; + +   i915->current.dynamic[offset] = state; +   i915->dynamic_dirty |= 1 << offset; +   i915->hardware_dirty |= I915_HW_DYNAMIC; +} + + + +static INLINE void set_dynamic_array(struct i915_context *i915, +                                     unsigned offset, +                                     const unsigned *src, +                                     unsigned dwords)  {     unsigned i;     if (!memcmp(src, &i915->current.dynamic[offset], dwords * 4))        return; -   for (i = 0; i < dwords; i++) +   for (i = 0; i < dwords; i++) {        i915->current.dynamic[offset + i] = src[i]; +      i915->dynamic_dirty |= 1 << (offset + i); +   }     i915->hardware_dirty |= I915_HW_DYNAMIC;  } @@ -79,12 +95,7 @@ static void upload_MODES4(struct i915_context *i915)       */     modes4 |= i915->blend->modes4; -   /* Always, so that we know when state is in-active: -    */ -   set_dynamic_indirect(i915, -                        I915_DYNAMIC_MODES4, -                        &modes4, -                        1); +   set_dynamic(i915, I915_DYNAMIC_MODES4, modes4);  }  const struct i915_tracked_state i915_upload_MODES4 = { @@ -107,10 +118,7 @@ static void upload_BFO(struct i915_context *i915)        bfo[0] |= i915->stencil_ref.ref_value[1] << BFO_STENCIL_REF_SHIFT;     } -   set_dynamic_indirect(i915, -                        I915_DYNAMIC_BFO_0, -                        &(bfo[0]), -                        2); +   set_dynamic_array(i915, I915_DYNAMIC_BFO_0, bfo, 2);  }  const struct i915_tracked_state i915_upload_BFO = { @@ -141,10 +149,7 @@ static void upload_BLENDCOLOR(struct i915_context *i915)                                 color[3]);     } -   set_dynamic_indirect(i915, -                        I915_DYNAMIC_BC_0, -                        bc, -                        2); +   set_dynamic_array(i915, I915_DYNAMIC_BC_0, bc, 2);  }  const struct i915_tracked_state i915_upload_BLENDCOLOR = { @@ -161,10 +166,7 @@ static void upload_IAB(struct i915_context *i915)  {     unsigned iab = i915->blend->iab; -   set_dynamic_indirect(i915, -                        I915_DYNAMIC_IAB, -                        &iab, -                        1); +   set_dynamic(i915, I915_DYNAMIC_IAB, iab);  }  const struct i915_tracked_state i915_upload_IAB = { @@ -179,10 +181,8 @@ const struct i915_tracked_state i915_upload_IAB = {   */  static void upload_DEPTHSCALE(struct i915_context *i915)  { -   set_dynamic_indirect(i915, -                        I915_DYNAMIC_DEPTHSCALE_0, -                        &(i915->rasterizer->ds[0].u), -                        2); +   set_dynamic_array(i915, I915_DYNAMIC_DEPTHSCALE_0, +                     &i915->rasterizer->ds[0].u, 2);  }  const struct i915_tracked_state i915_upload_DEPTHSCALE = { @@ -234,10 +234,7 @@ static void upload_STIPPLE(struct i915_context *i915)                  (p[3] << 12));     } -   set_dynamic_indirect(i915, -                        I915_DYNAMIC_STP_0, -                        &st[0], -                        2); +   set_dynamic_array(i915, I915_DYNAMIC_STP_0, st, 2);  }  const struct i915_tracked_state i915_upload_STIPPLE = { @@ -253,10 +250,7 @@ const struct i915_tracked_state i915_upload_STIPPLE = {   */  static void upload_SCISSOR_ENABLE( struct i915_context *i915 )  { -   set_dynamic_indirect(i915, -                        I915_DYNAMIC_SC_ENA_0, -                        &(i915->rasterizer->sc[0]), -                        1); +   set_dynamic(i915, I915_DYNAMIC_SC_ENA_0, i915->rasterizer->sc[0]);  }  const struct i915_tracked_state i915_upload_SCISSOR_ENABLE = { @@ -282,10 +276,7 @@ static void upload_SCISSOR_RECT(struct i915_context *i915)     sc[1] = (y1 << 16) | (x1 & 0xffff);     sc[2] = (y2 << 16) | (x2 & 0xffff); -   set_dynamic_indirect(i915, -                        I915_DYNAMIC_SC_RECT_0, -                        &sc[0], -                        3); +   set_dynamic_array(i915, I915_DYNAMIC_SC_RECT_0, sc, 3);  }  const struct i915_tracked_state i915_upload_SCISSOR_RECT = { diff --git a/src/gallium/drivers/i915/i915_state_emit.c b/src/gallium/drivers/i915/i915_state_emit.c index fcbe299ec2..509d487b49 100644 --- a/src/gallium/drivers/i915/i915_state_emit.c +++ b/src/gallium/drivers/i915/i915_state_emit.c @@ -223,7 +223,8 @@ i915_emit_hardware_state(struct i915_context *i915 )     {        int i;        for (i = 0; i < I915_MAX_DYNAMIC; i++) { -         OUT_BATCH(i915->current.dynamic[i]); +         if (i915->dynamic_dirty & (1 << i)); +            OUT_BATCH(i915->current.dynamic[i]);        }     }  #endif @@ -444,4 +445,5 @@ i915_emit_hardware_state(struct i915_context *i915 )     i915->hardware_dirty = 0;     i915->immediate_dirty = 0; +   i915->dynamic_dirty = 0;  } | 
