r300: Add scissor state, fix build.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Wed, 14 Jan 2009 08:49:48 +0000 (00:49 -0800)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Mon, 2 Feb 2009 07:30:22 +0000 (23:30 -0800)
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_state.c

index b9fff0deab9a6323f3be8672d93c730dd8bf0d9f..6c64c9fa83db7914aa82eaff820ed79a1c17a207 100644 (file)
@@ -34,7 +34,13 @@ struct r300_blend_state {
     uint32_t dither;              /* R300_RB3D_DITHER_CTL: 0x4e50 */
 };
 
-#define R300_NEW_BLEND 0x1
+struct r300_scissor_state {
+    uint32_t scissor_top_left;     /* R300_SC_SCISSORS_TL: 0x43e0 */
+    uint32_t scissor_bottom_right; /* R300_SC_SCISSORS_BR: 0x43e4 */
+};
+
+#define R300_NEW_BLEND    0x1
+#define R300_NEW_SCISSOR  0x2
 
 struct r300_context {
     /* Parent class */
@@ -48,6 +54,8 @@ struct r300_context {
     /* Various CSO state objects. */
     /* Blend state. */
     struct r300_blend_state* blend_state;
+    /* Scissor state. */
+    struct r300_scissor_state* scissor_state;
 
     /* Bitmask of dirty state objects. */
     uint32_t dirty_state;
index 93441f624e918b0801c7019645a177ebe695b9dd..2e19955454dd2411fa22c6b5c7675655023d06d4 100644 (file)
@@ -88,6 +88,9 @@ static uint32_t translate_blend_factor(int blend_fact) {
     return 0;
 }
 
+/* Create a new blend state based on the CSO blend state.
+ *
+ * This encompasses alpha blending, logic/raster ops, and blend dithering. */
 static void* r300_create_blend_state(struct pipe_context* pipe,
                                      struct pipe_blend_state* state)
 {
@@ -128,6 +131,7 @@ static void* r300_create_blend_state(struct pipe_context* pipe,
     return (void*)blend;
 }
 
+/* Bind blend state. */
 static void r300_bind_blend_state(struct pipe_context* pipe,
                                   void* state)
 {
@@ -137,12 +141,55 @@ static void r300_bind_blend_state(struct pipe_context* pipe,
     r300->dirty_state |= R300_NEW_BLEND;
 }
 
+/* Free blend state. */
 static void r300_delete_blend_state(struct pipe_context* pipe,
                                     void* state)
 {
     FREE(state);
 }
 
+/* Create a new scissor state based on the CSO scissor state.
+ *
+ * This is only for the fragment scissors. */
+static void* r300_create_scissor_state(struct pipe_context* pipe,
+                                    struct pipe_scissor_state* state)
+{
+    uint32_t left, top, right, bottom;
+    struct r300_scissor_state* scissor = CALLOC_STRUCT(r300_scissor_state);
+
+    /* So, a bit of info. The scissors are offset by R300_SCISSORS_OFFSET in
+     * both directions for all values, and can only be 13 bits wide. Why?
+     * We may never know. */
+    left = (state->minx + R300_SCISSORS_OFFSET) & 0x1fff;
+    top = (state->miny + R300_SCISSORS_OFFSET) & 0x1fff;
+    right = (state->maxx + R300_SCISSORS_OFFSET) & 0x1fff;
+    bottom = (state->maxy + R300_SCISSORS_OFFSET) & 0x1fff;
+
+    scissor->scissor_top_left = (left << R300_SCISSORS_X_SHIFT) |
+            (top << R300_SCISSORS_Y_SHIFT);
+    scissor->scissor_bottom_right = (right << R300_SCISSORS_X_SHIFT) |
+            (bottom << R300_SCISSORS_Y_SHIFT);
+
+    return (void*)scissor;
+}
+
+/* Bind scissor state.*/
+static void r300_bind_scissor_state(struct pipe_context* pipe,
+                                 void* state)
+{
+    struct r300_context* r300 = r300_context(pipe);
+
+    r300->scissor_state = (struct r300_scissor_state*)state;
+    r300->dirty_state |= R300_NEW_SCISSOR;
+}
+
+/* Delete scissor state. */
+static void r300_delete_scissor_state(struct pipe_context* pipe,
+                                   void* state)
+{
+    FREE(state);
+}
+
 static void* r300_create_vs_state(struct pipe_context* pipe,
                                   struct pipe_shader_state* state)
 {