radeong: flush CS if a buffer being mapped is referenced by it
authorMarek Olšák <maraeo@gmail.com>
Fri, 4 Dec 2009 14:54:29 +0000 (15:54 +0100)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Fri, 4 Dec 2009 17:23:59 +0000 (09:23 -0800)
Also, overlapping occlusion queries seems to work now.

src/gallium/drivers/r300/r300_emit.c
src/gallium/winsys/drm/radeon/core/radeon_buffer.c

index 3bb42f9e4342bc035b9f01c7d41f8c632eeca5d6..60be03f54fcb6995c707d8db7f8d16d50068be15 100644 (file)
@@ -382,8 +382,6 @@ static void r300_emit_query_start(struct r300_context *r300)
     if (!query)
        return;
 
-    /* XXX This will almost certainly not return good results
-     * for overlapping queries. */
     BEGIN_CS(4);
     if (caps->family == CHIP_FAMILY_RV530) {
         OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL);
index 0ca7b39255407c11c3e4c87258224030f2d15c58..2a8daed051d4777f566b5d0566995cae55762f95 100644 (file)
@@ -140,10 +140,15 @@ static void *radeon_buffer_map(struct pipe_winsys *ws,
                                struct pipe_buffer *buffer,
                                unsigned flags)
 {
+    struct radeon_winsys_priv *priv = ((struct radeon_winsys *)ws)->priv;
     struct radeon_pipe_buffer *radeon_buffer =
         (struct radeon_pipe_buffer*)buffer;
     int write = 0;
 
+    if (radeon_bo_is_referenced_by_cs(radeon_buffer->bo, priv->cs)) {
+        priv->cs->space_flush_fn(priv->cs->space_flush_data);
+    }
+
     if (flags & PIPE_BUFFER_USAGE_DONTBLOCK) {
         uint32_t domain;