Mesa (master): r300-gallium: Finish space accounting.

Corbin Simpson csimpson at kemper.freedesktop.org
Sat May 9 02:41:22 UTC 2009


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

Author: Corbin Simpson <MostAwesomeDude at gmail.com>
Date:   Fri May  8 15:28:09 2009 -0700

r300-gallium: Finish space accounting.

Still broken...

---

 src/gallium/drivers/r300/r300_context.h |    7 +++-
 src/gallium/drivers/r300/r300_emit.c    |   60 ++++++++++++++++++++++++++++---
 src/gallium/drivers/r300/r300_emit.h    |    2 +
 src/gallium/drivers/r300/r300_render.c  |   23 ++----------
 4 files changed, 66 insertions(+), 26 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index 6f62998..96f1f11 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -264,6 +264,11 @@ struct r300_context {
     /* Draw module. Used mostly for SW TCL. */
     struct draw_context* draw;
 
+    /* Vertex buffer for rendering. */
+    struct pipe_buffer* vbo;
+    /* Offset into the VBO. */
+    size_t vbo_offset;
+
     /* Various CSO state objects. */
     /* Blend state. */
     struct r300_blend_state* blend_state;
@@ -289,7 +294,7 @@ struct r300_context {
     /* Texture states. */
     struct r300_texture* textures[8];
     int texture_count;
-    /* Vertex buffers. */
+    /* Vertex buffers for Gallium. */
     struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
     int vertex_buffer_count;
     /* Vertex information. */
diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c
index 01bac5f..ab17af7 100644
--- a/src/gallium/drivers/r300/r300_emit.c
+++ b/src/gallium/drivers/r300/r300_emit.c
@@ -296,6 +296,30 @@ void r300_emit_texture(struct r300_context* r300,
     END_CS;
 }
 
+void r300_emit_vertex_buffer(struct r300_context* r300)
+{
+    CS_LOCALS(r300);
+
+    debug_printf("r300: Preparing vertex buffer %p for render, "
+            "vertex size %d\n", r300->vbo,
+            r300->vertex_info.vinfo.size);
+    /* Set the pointer to our vertex buffer. The emitted values are this:
+     * PACKET3 [3D_LOAD_VBPNTR]
+     * COUNT   [1]
+     * FORMAT  [size | stride << 8]
+     * OFFSET  [offset into BO]
+     * VBPNTR  [relocated BO]
+     */
+    BEGIN_CS(7);
+    OUT_CS_PKT3(R300_PACKET3_3D_LOAD_VBPNTR, 3);
+    OUT_CS(1);
+    OUT_CS(r300->vertex_info.vinfo.size |
+            (r300->vertex_info.vinfo.size << 8));
+    OUT_CS(r300->vbo_offset);
+    OUT_CS_RELOC(r300->vbo, 0, RADEON_GEM_DOMAIN_GTT, 0, 0);
+    END_CS;
+}
+
 void r300_emit_vertex_format_state(struct r300_context* r300)
 {
     int i;
@@ -421,20 +445,41 @@ void r300_flush_textures(struct r300_context* r300)
 void r300_emit_dirty_state(struct r300_context* r300)
 {
     struct r300_screen* r300screen = r300_screen(r300->context.screen);
+    struct r300_texture* tex;
     int i;
     int dirty_tex = 0;
 
-    if (!(r300->dirty_hw)) {
+    if (!(r300->dirty_state)) {
         return;
     }
 
     r300_update_derived_state(r300);
 
     /* XXX check size */
-    struct r300_texture* fb_tex =
-        (struct r300_texture*)r300->framebuffer_state.cbufs[0];
-    r300->winsys->add_buffer(r300->winsys, fb_tex->buffer,
-            0, RADEON_GEM_DOMAIN_VRAM);
+    /* Color buffers... */
+    for (i = 0; i < r300->framebuffer_state.nr_cbufs; i++) {
+        tex = (struct r300_texture*)r300->framebuffer_state.cbufs[i];
+        //assert(tex && tex->buffer && "cbuf is marked, but NULL!");
+        if (!tex->buffer) return;
+        r300->winsys->add_buffer(r300->winsys, tex->buffer,
+                0, RADEON_GEM_DOMAIN_VRAM);
+    }
+    /* ...depth buffer... */
+    if (r300->framebuffer_state.zsbuf) {
+        tex = (struct r300_texture*)r300->framebuffer_state.zsbuf;
+        //assert(tex && tex->buffer && "zsbuf is marked, but NULL!");
+        if (!tex->buffer) return;
+        r300->winsys->add_buffer(r300->winsys, tex->buffer,
+                0, RADEON_GEM_DOMAIN_VRAM);
+    }
+    /* ...and vertex buffer. */
+    if (r300->vbo) {
+        r300->winsys->add_buffer(r300->winsys, r300->vbo,
+                RADEON_GEM_DOMAIN_GTT, 0);
+    } else {
+        debug_printf("No VBO while emitting dirty state!\n");
+    }
+
     if (r300->winsys->validate(r300->winsys)) {
         /* XXX */
         r300->context.flush(&r300->context, 0, NULL);
@@ -519,4 +564,9 @@ void r300_emit_dirty_state(struct r300_context* r300)
         r300_emit_vertex_format_state(r300);
         r300->dirty_state &= ~R300_NEW_VERTEX_FORMAT;
     }
+
+    /* Finally, emit the VBO. */
+    r300_emit_vertex_buffer(r300);
+
+    r300->dirty_hw++;
 }
diff --git a/src/gallium/drivers/r300/r300_emit.h b/src/gallium/drivers/r300/r300_emit.h
index 31dbc7a..36e14f6 100644
--- a/src/gallium/drivers/r300/r300_emit.h
+++ b/src/gallium/drivers/r300/r300_emit.h
@@ -62,6 +62,8 @@ void r300_emit_scissor_state(struct r300_context* r300,
 void r300_emit_texture(struct r300_context* r300,
                        struct r300_texture* tex, unsigned offset);
 
+void r300_emit_vertex_buffer(struct r300_context* r300);
+
 void r300_emit_vertex_format_state(struct r300_context* r300);
 
 void r300_emit_vertex_shader(struct r300_context* r300,
diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index cbd84d7..29b66ce 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -180,27 +180,10 @@ static void prepare_render(struct r300_render* render, unsigned count)
 
     CS_LOCALS(r300);
 
-    /* Make sure that all possible state is emitted. */
-    r300_emit_dirty_state(r300);
+    r300->vbo = render->vbo;
+    r300->vbo_offset = render->vbo_offset;
 
-    debug_printf("r300: Preparing vertex buffer %p for render, "
-            "vertex size %d, vertex count %d\n", render->vbo,
-            r300->vertex_info.vinfo.size, count);
-    /* Set the pointer to our vertex buffer. The emitted values are this:
-     * PACKET3 [3D_LOAD_VBPNTR]
-     * COUNT   [1]
-     * FORMAT  [size | stride << 8]
-     * OFFSET  [0]
-     * VBPNTR  [relocated BO]
-     */
-    BEGIN_CS(7);
-    OUT_CS_PKT3(R300_PACKET3_3D_LOAD_VBPNTR, 3);
-    OUT_CS(1);
-    OUT_CS(r300->vertex_info.vinfo.size |
-            (r300->vertex_info.vinfo.size << 8));
-    OUT_CS(render->vbo_offset);
-    OUT_CS_RELOC(render->vbo, 0, RADEON_GEM_DOMAIN_GTT, 0, 0);
-    END_CS;
+    r300_emit_dirty_state(r300);
 }
 
 static void r300_render_draw_arrays(struct vbuf_render* render,




More information about the mesa-commit mailing list