Fix a few typos
[mesa.git] / src / gallium / drivers / i915 / i915_state_dynamic.c
index d964483ac7e2168b319953ff2d3e1aaa33d2a876..4050cd4ac44f2420f0e65c9f3f5749f5e8f0dd06 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  *
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2003 VMware, Inc.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -18,7 +18,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -30,7 +30,7 @@
 #include "i915_context.h"
 #include "i915_reg.h"
 #include "i915_state.h"
-#include "util/u_math.h"
+
 #include "util/u_memory.h"
 #include "util/u_pack_color.h"
 
  * (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;
 
-   for (i = 0; i < dwords; i++)
+   if (!memcmp(src, &i915->current.dynamic[offset], dwords * 4))
+      return;
+
+   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;
 }
@@ -76,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 = {
@@ -104,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 = {
@@ -138,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 = {
@@ -158,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 = {
@@ -176,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 = {
@@ -231,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 = {
@@ -250,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 = {
@@ -271,18 +268,15 @@ static void upload_SCISSOR_RECT(struct i915_context *i915)
 {
    unsigned x1 = i915->scissor.minx;
    unsigned y1 = i915->scissor.miny;
-   unsigned x2 = i915->scissor.maxx;
-   unsigned y2 = i915->scissor.maxy;
+   unsigned x2 = i915->scissor.maxx - 1;
+   unsigned y2 = i915->scissor.maxy - 1;
    unsigned sc[3];
 
    sc[0] = _3DSTATE_SCISSOR_RECT_0_CMD;
    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 = {
@@ -321,5 +315,5 @@ static void update_dynamic(struct i915_context *i915)
 struct i915_tracked_state i915_hw_dynamic = {
    "dynamic",
    update_dynamic,
-   ~0 /* all state atoms, becuase we do internal checking */
+   ~0 /* all state atoms, because we do internal checking */
 };