i965: Add Sandybridge scissor state.
authorEric Anholt <eric@anholt.net>
Thu, 17 Dec 2009 16:20:32 +0000 (08:20 -0800)
committerEric Anholt <eric@anholt.net>
Thu, 25 Feb 2010 18:53:07 +0000 (10:53 -0800)
src/mesa/drivers/dri/i965/Makefile
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_defines.h
src/mesa/drivers/dri/i965/brw_state.h
src/mesa/drivers/dri/i965/brw_state_upload.c
src/mesa/drivers/dri/i965/brw_structs.h
src/mesa/drivers/dri/i965/gen6_scissor_state.c [new file with mode: 0644]

index 35093f014b483b2cc65ee86854753bd8adf4e31d..9426ffc0da58e523362e6e3a8a1247038a2ceb24 100644 (file)
@@ -89,6 +89,7 @@ DRIVER_SOURCES = \
        gen6_clip_state.c \
        gen6_depthstencil.c \
        gen6_gs_state.c \
+       gen6_scissor_state.c \
        gen6_urb.c \
        gen6_vs_state.c
 
index c4b68ca05bcb94a3b0f48f9fce8226603d3bb5d0..d6fc37e4d8912f9a43bce50923364c16a144c480 100644 (file)
@@ -293,7 +293,7 @@ enum brw_cache_id {
    BRW_WM_UNIT,
    BRW_SF_PROG,
    BRW_SF_VP,
-   BRW_SF_UNIT,
+   BRW_SF_UNIT, /* scissor state on gen6 */
    BRW_VS_UNIT,
    BRW_VS_PROG,
    BRW_GS_UNIT,
index f727bf53f77d87f4fd2d70d3dd442869d1602fda..b11ec7b1655d89d9c66a7e6dae0e3f1f5e0eae16 100644 (file)
 # define GEN6_URB_GS_SIZE_SHIFT                                8
 # define GEN6_URB_GS_ENTRIES_SHIFT                     0
 
+#define CMD_3D_SCISSOR_STATE_POINTERS          0x780f /* GEN6+ */
+
 #define CMD_3D_VS_STATE                      0x7810 /* GEN6+ */
 /* DW2 */
 # define GEN6_VS_SPF_MODE                              (1 << 31)
index 11489d477c71466d65a68f2ace003ef7b3e74d58..25e261dd152faeb93e0c9f4102aef14ff6e7e1b0 100644 (file)
@@ -97,6 +97,7 @@ const struct brw_tracked_state gen6_clip_state;
 const struct brw_tracked_state gen6_color_calc_state;
 const struct brw_tracked_state gen6_depth_stencil_state;
 const struct brw_tracked_state gen6_gs_state;
+const struct brw_tracked_state gen6_scissor_state;
 const struct brw_tracked_state gen6_urb;
 const struct brw_tracked_state gen6_vs_state;
 
index 30a36956e24ec6967ed800679e6536ad21a047d6..d36cc3aa1b551c7580d0d5a9165c8c6c98bb8eef 100644 (file)
@@ -139,6 +139,9 @@ const struct brw_tracked_state *gen6_atoms[] =
    &brw_wm_samplers,
 
    &brw_wm_unit,
+#endif
+   &gen6_scissor_state,
+#if 0
    &brw_sf_vp,
    &brw_sf_unit,
 
index 10c0c62202703e906e1725264e085102b200e7cd..87d5c06cdc3acfe031e51e02cc8a646216064752 100644 (file)
@@ -909,6 +909,11 @@ struct brw_sf_unit_state
 
 };
 
+struct gen6_scissor_state
+{
+   GLuint ymin, xmin;
+   GLuint ymax, xmax;
+};
 
 struct brw_gs_unit_state
 {
diff --git a/src/mesa/drivers/dri/i965/gen6_scissor_state.c b/src/mesa/drivers/dri/i965/gen6_scissor_state.c
new file mode 100644 (file)
index 0000000..2d36f00
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright © 2009 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * 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 NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS 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.
+ *
+ * Authors:
+ *    Eric Anholt <eric@anholt.net>
+ *
+ */
+
+#include "brw_context.h"
+#include "brw_state.h"
+#include "brw_defines.h"
+#include "brw_util.h"
+#include "intel_batchbuffer.h"
+#include "main/macros.h"
+#include "main/enums.h"
+
+static void
+prepare_scissor_state(struct brw_context *brw)
+{
+   GLcontext *ctx = &brw->intel.ctx;
+   const GLboolean render_to_fbo = (ctx->DrawBuffer->Name != 0);
+   struct gen6_scissor_state scissor;
+
+   /* _NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT */
+
+   /* The scissor only needs to handle the intersection of drawable and
+    * scissor rect.  Clipping to the boundaries of static shared buffers
+    * for front/back/depth is covered by looping over cliprects in brw_draw.c.
+    *
+    * Note that the hardware's coordinates are inclusive, while Mesa's min is
+    * inclusive but max is exclusive.
+    */
+   if (render_to_fbo) {
+      /* texmemory: Y=0=bottom */
+      scissor.xmin = ctx->DrawBuffer->_Xmin;
+      scissor.xmax = ctx->DrawBuffer->_Xmax - 1;
+      scissor.ymin = ctx->DrawBuffer->_Ymin;
+      scissor.ymax = ctx->DrawBuffer->_Ymax - 1;
+   }
+   else {
+      /* memory: Y=0=top */
+      scissor.xmin = ctx->DrawBuffer->_Xmin;
+      scissor.xmax = ctx->DrawBuffer->_Xmax - 1;
+      scissor.ymin = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymax;
+      scissor.ymax = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymin - 1;
+   }
+
+   drm_intel_bo_unreference(brw->sf.state_bo);
+   brw->sf.state_bo = brw_cache_data(&brw->cache, BRW_SF_UNIT,
+                                    &scissor, sizeof(scissor),
+                                    NULL, 0);
+}
+
+const struct brw_tracked_state gen6_scissor_state = {
+   .dirty = {
+      .mesa = _NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT,
+      .brw = 0,
+      .cache = 0,
+   },
+   .prepare = prepare_scissor_state,
+};
+
+static void upload_scissor_state_pointers(struct brw_context *brw)
+{
+   struct intel_context *intel = &brw->intel;
+
+   BEGIN_BATCH(2);
+   OUT_BATCH(CMD_3D_SCISSOR_STATE_POINTERS << 16 | (2 - 2));
+   OUT_RELOC(brw->sf.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
+   ADVANCE_BATCH();
+
+   intel_batchbuffer_emit_mi_flush(intel->batch);
+}
+
+
+static void prepare_scissor_state_pointers(struct brw_context *brw)
+{
+   brw_add_validated_bo(brw, brw->sf.state_bo);
+}
+
+const struct brw_tracked_state gen6_scissor_state_pointers = {
+   .dirty = {
+      .mesa = 0,
+      .brw = BRW_NEW_BATCH,
+      .cache = CACHE_NEW_SF_UNIT
+   },
+   .prepare = prepare_scissor_state_pointers,
+   .emit = upload_scissor_state_pointers,
+};