Mesa (master): r300g: add a function for marking framebuffer atoms as dirty

Marek Olšák mareko at kemper.freedesktop.org
Thu Jul 8 16:08:04 UTC 2010


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Thu Jul  8 06:20:01 2010 +0200

r300g: add a function for marking framebuffer atoms as dirty

---

 src/gallium/drivers/r300/r300_context.c |    2 +-
 src/gallium/drivers/r300/r300_context.h |    6 +++++
 src/gallium/drivers/r300/r300_state.c   |   35 ++++++++++++++++++++++--------
 3 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c
index 3ca3436..7f43281 100644
--- a/src/gallium/drivers/r300/r300_context.c
+++ b/src/gallium/drivers/r300/r300_context.c
@@ -233,7 +233,7 @@ static void r300_setup_atoms(struct r300_context* r300)
     r300->query_start.allow_null_state = TRUE;
     r300->texture_cache_inval.allow_null_state = TRUE;
 
-    /* Some states must be marked dirty here to properly set up
+    /* Some states must be marked as dirty here to properly set up
      * hardware in the first command stream. */
     r300->invariant_state.dirty = TRUE;
     r300->pvs_flush.dirty = TRUE;
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 9a4df0a..2483af7 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -592,6 +592,12 @@ void r300_translate_index_buffer(struct r300_context *r300,
 void r300_plug_in_stencil_ref_fallback(struct r300_context *r300);
 
 /* r300_state.c */
+enum r300_fb_state_change {
+    R300_CHANGED_FB_STATE = 0
+};
+
+void r300_mark_fb_state_dirty(struct r300_context *r300,
+                              enum r300_fb_state_change change);
 void r300_mark_fs_code_dirty(struct r300_context *r300);
 
 /* r300_debug.c */
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 4bb5757..4fbe8bf 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -670,6 +670,30 @@ static void r300_print_fb_surf_info(struct pipe_surface *surf, unsigned index,
             tex->last_level, util_format_short_name(tex->format));
 }
 
+void r300_mark_fb_state_dirty(struct r300_context *r300,
+                              enum r300_fb_state_change change)
+{
+    struct pipe_framebuffer_state *state = r300->fb_state.state;
+
+    /* What is marked as dirty depends on the enum r300_fb_state_change. */
+    r300->gpu_flush.dirty = TRUE;
+    r300->fb_state.dirty = TRUE;
+    r300->hyperz_state.dirty = TRUE;
+
+    if (change == R300_CHANGED_FB_STATE) {
+        r300->aa_state.dirty = TRUE;
+        r300->fb_state_pipelined.dirty = TRUE;
+    }
+
+    /* Now compute the fb_state atom size. */
+    r300->fb_state.size = 2 + (8 * state->nr_cbufs);
+
+    if (state->zsbuf)
+        r300->fb_state.size += r300->screen->caps.has_hiz ? 18 : 14;
+
+    /* The size of the rest of atoms stays the same. */
+}
+
 static void
     r300_set_framebuffer_state(struct pipe_context* pipe,
                                const struct pipe_framebuffer_state* state)
@@ -698,12 +722,6 @@ static void
         draw_flush(r300->draw);
     }
 
-    r300->gpu_flush.dirty = TRUE;
-    r300->aa_state.dirty = TRUE;
-    r300->fb_state.dirty = TRUE;
-    r300->hyperz_state.dirty = TRUE;
-    r300->fb_state_pipelined.dirty = TRUE;
-
     /* If nr_cbufs is changed from zero to non-zero or vice versa... */
     if (!!old_state->nr_cbufs != !!state->nr_cbufs) {
         r300->blend_state.dirty = TRUE;
@@ -718,10 +736,7 @@ static void
 
     util_assign_framebuffer_state(r300->fb_state.state, state);
 
-    r300->fb_state.size =
-            2 +
-            (8 * state->nr_cbufs) +
-            (state->zsbuf ? (r300->screen->caps.has_hiz ? 18 : 14) : 0);
+    r300_mark_fb_state_dirty(r300, R300_CHANGED_FB_STATE);
 
     /* Polygon offset depends on the zbuffer bit depth. */
     if (state->zsbuf && r300->polygon_offset_enabled) {




More information about the mesa-commit mailing list