r300g: flush CS if a buffer being deleted is referenced by it
authorMarek Olšák <maraeo@gmail.com>
Sat, 12 Dec 2009 22:44:02 +0000 (23:44 +0100)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Wed, 16 Dec 2009 03:04:45 +0000 (19:04 -0800)
src/gallium/winsys/drm/radeon/core/radeon_buffer.c
src/gallium/winsys/drm/radeon/core/radeon_buffer.h
src/gallium/winsys/drm/radeon/core/radeon_drm.c

index 2a8daed..76acc99 100644 (file)
@@ -81,6 +81,7 @@ static struct pipe_buffer *radeon_buffer_create(struct pipe_winsys *ws,
         domain |= RADEON_GEM_DOMAIN_GTT;
     }
 
+    radeon_buffer->ws = radeon_ws;
     radeon_buffer->bo = radeon_bo_open(radeon_ws->priv->bom, 0, size,
             alignment, domain, 0);
     if (radeon_buffer->bo == NULL) {
@@ -131,6 +132,11 @@ static void radeon_buffer_del(struct pipe_buffer *buffer)
 {
     struct radeon_pipe_buffer *radeon_buffer =
         (struct radeon_pipe_buffer*)buffer;
+    struct radeon_winsys_priv *priv = radeon_buffer->ws->priv;
+
+    if (radeon_bo_is_referenced_by_cs(radeon_buffer->bo, priv->cs)) {
+        priv->cs->space_flush_fn(priv->cs->space_flush_data);
+    }
 
     radeon_bo_unref(radeon_buffer->bo);
     free(radeon_buffer);
index bfe2221..1e91e18 100644 (file)
@@ -50,6 +50,7 @@
 struct radeon_pipe_buffer {
     struct pipe_buffer  base;
     struct radeon_bo    *bo;
+    struct radeon_winsys *ws;
     boolean flinked;
     uint32_t flink;
 };
index dec7c06..2f7fbc7 100644 (file)
@@ -171,6 +171,7 @@ struct pipe_buffer* radeon_buffer_from_handle(struct drm_api* api,
     radeon_buffer->base.screen = screen;
     radeon_buffer->base.usage = PIPE_BUFFER_USAGE_PIXEL;
     radeon_buffer->bo = bo;
+    radeon_buffer->ws = (struct radeon_winsys*)screen->winsys;
     return &radeon_buffer->base;
 }