Mesa (master): cell: updates for new pipe_transfer changes

Brian Paul brianp at kemper.freedesktop.org
Thu Feb 19 04:50:43 UTC 2009


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

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Feb 18 21:46:12 2009 -0700

cell: updates for new pipe_transfer changes

Update framebuffer color/z/stencil mapping/unmapping.

---

 src/gallium/drivers/cell/ppu/cell_context.h    |    3 +
 src/gallium/drivers/cell/ppu/cell_pipe_state.c |  101 ++++++++++++++++++------
 2 files changed, 81 insertions(+), 23 deletions(-)

diff --git a/src/gallium/drivers/cell/ppu/cell_context.h b/src/gallium/drivers/cell/ppu/cell_context.h
index eb1397b..ca03dc1 100644
--- a/src/gallium/drivers/cell/ppu/cell_context.h
+++ b/src/gallium/drivers/cell/ppu/cell_context.h
@@ -127,6 +127,9 @@ struct cell_context
    struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
    uint num_vertex_elements;
 
+   struct pipe_transfer *cbuf_transfer[PIPE_MAX_COLOR_BUFS];
+   struct pipe_transfer *zsbuf_transfer;
+
    ubyte *cbuf_map[PIPE_MAX_COLOR_BUFS];
    ubyte *zsbuf_map;
 
diff --git a/src/gallium/drivers/cell/ppu/cell_pipe_state.c b/src/gallium/drivers/cell/ppu/cell_pipe_state.c
index ca358ed..facd955 100644
--- a/src/gallium/drivers/cell/ppu/cell_pipe_state.c
+++ b/src/gallium/drivers/cell/ppu/cell_pipe_state.c
@@ -253,10 +253,13 @@ cell_set_sampler_textures(struct pipe_context *pipe,
    assert(num <= CELL_MAX_SAMPLERS);
 
    for (i = 0; i < CELL_MAX_SAMPLERS; i++) {
-      struct pipe_texture *new_tex = i < num ? texture[i] : NULL;
-      if ((struct pipe_texture *) cell->texture[i] != new_tex) {
+      struct cell_texture *new_tex = cell_texture(i < num ? texture[i] : NULL);
+      struct cell_texture *old_tex = cell->texture[i];
+      if (old_tex != new_tex) {
+
          pipe_texture_reference((struct pipe_texture **) &cell->texture[i],
-                                new_tex);
+                                (struct pipe_texture *) new_tex);
+
          changed |= (1 << i);
       }
    }
@@ -270,6 +273,76 @@ cell_set_sampler_textures(struct pipe_context *pipe,
 }
 
 
+/**
+ * Map color and z/stencil framebuffer surfaces.
+ */
+static void
+cell_map_surfaces(struct cell_context *cell)
+{
+   struct pipe_screen *screen = cell->pipe.screen;
+   uint i;
+
+   for (i = 0; i < 1; i++) {
+      struct pipe_surface *ps = cell->framebuffer.cbufs[i];
+      if (ps) {
+         cell->cbuf_transfer[i] =
+            screen->get_tex_transfer(screen, ps->texture, ps->face,
+                                     ps->level, ps->zslice,
+                                     PIPE_TRANSFER_READ_WRITE,
+                                     0, 0, ps->width, ps->height);
+
+         cell->cbuf_map[i] =
+            screen->transfer_map(screen, cell->cbuf_transfer[i]);
+      }
+   }
+
+   {
+      struct pipe_surface *ps = cell->framebuffer.zsbuf;
+      if (ps) {
+         cell->zsbuf_transfer =
+            screen->get_tex_transfer(screen, ps->texture, ps->face,
+                                     ps->level, ps->zslice,
+                                     PIPE_TRANSFER_READ_WRITE,
+                                     0, 0, ps->width, ps->height);
+
+         cell->zsbuf_map =
+            screen->transfer_map(screen, cell->zsbuf_transfer);
+      }
+   }
+}
+
+
+/**
+ * Unmap color and z/stencil framebuffer surfaces.
+ */
+static void
+cell_unmap_surfaces(struct cell_context *cell)
+{
+   struct pipe_screen *screen = cell->pipe.screen;
+   uint i;
+
+   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
+      if (cell->cbuf_transfer[i] && cell->cbuf_map[i]) {
+         /* unmap color buffer/surface [i] */
+         screen->transfer_unmap(screen, cell->cbuf_transfer[i]);
+         cell->cbuf_map[i] = NULL;
+
+         /* get rid of transfer object [i] */
+         screen->tex_transfer_release(screen, &cell->cbuf_transfer[i]);
+         assert(cell->cbuf_transfer[i] == NULL);
+      }
+   }
+
+   if (cell->zsbuf_transfer && cell->zsbuf_map) {
+      screen->transfer_unmap(screen, cell->zsbuf_transfer);
+      cell->zsbuf_map = NULL;
+
+      /* get rid of transfer object */
+      screen->tex_transfer_release(screen, &cell->zsbuf_transfer);
+      assert(cell->zsbuf_transfer == NULL);
+   }
+}
+
 
 static void
 cell_set_framebuffer_state(struct pipe_context *pipe,
@@ -278,24 +351,10 @@ cell_set_framebuffer_state(struct pipe_context *pipe,
    struct cell_context *cell = cell_context(pipe);
 
    if (1 /*memcmp(&cell->framebuffer, fb, sizeof(*fb))*/) {
-      struct pipe_surface *csurf = fb->cbufs[0];
-      struct pipe_surface *zsurf = fb->zsbuf;
       uint i;
-      uint flags = (PIPE_BUFFER_USAGE_GPU_WRITE |
-                    PIPE_BUFFER_USAGE_GPU_READ);
 
       /* unmap old surfaces */
-      for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
-         if (cell->framebuffer.cbufs[i] && cell->cbuf_map[i]) {
-            pipe_surface_unmap(cell->framebuffer.cbufs[i]);
-            cell->cbuf_map[i] = NULL;
-         }
-      }
-
-      if (cell->framebuffer.zsbuf && cell->zsbuf_map) {
-         pipe_surface_unmap(cell->framebuffer.zsbuf);
-         cell->zsbuf_map = NULL;
-      }
+      cell_unmap_surfaces(cell);
 
       /* Finish any pending rendering to the current surface before
        * installing a new surface!
@@ -314,11 +373,7 @@ cell_set_framebuffer_state(struct pipe_context *pipe,
       pipe_surface_reference(&cell->framebuffer.zsbuf, fb->zsbuf);
 
       /* map new surfaces */
-      if (csurf)
-         cell->cbuf_map[0] = pipe_surface_map(csurf, flags);
-
-      if (zsurf)
-         cell->zsbuf_map = pipe_surface_map(zsurf, flags);
+      cell_map_surfaces(cell);
 
       cell->dirty |= CELL_NEW_FRAMEBUFFER;
    }




More information about the mesa-commit mailing list