gallium: implement PBO operations for glDraw/ReadPixels and glBitmap
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 21 Mar 2008 19:44:27 +0000 (13:44 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 21 Mar 2008 19:44:27 +0000 (13:44 -0600)
At this time there are no optimizations for directly blitting between
buffer objects and surfaces (always go through mappings).
glean pbo test passes now

src/mesa/state_tracker/st_cb_bitmap.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_cb_readpixels.c

index 33256196bb59e9c89e042ff982010e05534be416..4e23db0edcce90275e03919a5cabbca022929bab 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "main/imports.h"
 #include "main/image.h"
+#include "main/bufferobj.h"
 #include "main/macros.h"
 #include "main/texformat.h"
 #include "shader/program.h"
@@ -191,7 +192,6 @@ combined_bitmap_fragment_program(GLcontext *ctx)
 }
 
 
-
 /**
  * Create a texture which represents a bitmap image.
  */
@@ -224,19 +224,21 @@ make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height,
       assert( 0 );
    }
 
+   /* PBO source... */
+   bitmap = _mesa_validate_and_map_bitmap_pbo(ctx, width, height,
+                                              unpack, bitmap);
+   if (!bitmap) {
+      return NULL;
+   }
+
    /**
-    * Create a texture.
+    * Create texture to hold bitmap pattern.
     */
    pt = st_texture_create(ctx->st, PIPE_TEXTURE_2D, format, 0, width, height,
                          1, 0);
-   if (!pt)
+   if (!pt) {
+      _mesa_unmap_bitmap_pbo(ctx, unpack);
       return NULL;
-
-   if (unpack->BufferObj && unpack->BufferObj->Name) {
-      /*
-      pt->region = buffer_object_region(unpack->BufferObj);
-      */
-      printf("st_Bitmap (sourcing from PBO not implemented yet)\n");
    }
 
    surface = screen->get_tex_surface(screen, pt, 0, 0, 0);
@@ -301,6 +303,8 @@ make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height,
 
    } /* row */
 
+   _mesa_unmap_bitmap_pbo(ctx, unpack);
+
    /* Release surface */
    pipe_surface_unmap(surface);
    pipe_surface_reference(&surface, NULL);
index b4cd93cd548e31b52db0c054d61a27f152ca2e91..c0f8e5ffdd74d29d0344619185ec4b732e688ed8 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "main/imports.h"
 #include "main/image.h"
+#include "main/bufferobj.h"
 #include "main/macros.h"
 #include "main/texformat.h"
 #include "shader/program.h"
@@ -334,16 +335,17 @@ make_texture(struct st_context *st,
    assert(pipeFormat);
    cpp = st_sizeof_format(pipeFormat);
 
+   pixels = _mesa_validate_and_map_drawpix_pbo(ctx, width, height,
+                                               format, type,
+                                               unpack, pixels);
+   if (!pixels)
+      return NULL;
+
    pt = st_texture_create(st, PIPE_TEXTURE_2D, pipeFormat, 0, width, height,
                          1, 0);
-   if (!pt)
+   if (!pt) {
+      _mesa_unmap_drapix_pbo(ctx, unpack);
       return NULL;
-
-   if (unpack->BufferObj && unpack->BufferObj->Name) {
-      /*
-      pt->region = buffer_object_region(unpack->BufferObj);
-      */
-      printf("st_DrawPixels (sourcing from PBO not implemented yet)\n");
    }
 
    {
@@ -388,6 +390,8 @@ make_texture(struct st_context *st,
       ctx->_ImageTransferState = imageTransferStateSave;
    }
 
+   _mesa_unmap_drapix_pbo(ctx, unpack);
+
    return pt;
 }
 
@@ -836,9 +840,9 @@ st_DrawPixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
 
    bufferFormat = ps->format;
 
-   if (any_fragment_ops(st) ||
+   if (1/*any_fragment_ops(st) ||
        any_pixel_transfer_ops(st) ||
-       !compatible_formats(format, type, ps->format)) {
+       !compatible_formats(format, type, ps->format)*/) {
       /* textured quad */
       struct pipe_texture *pt
          = make_texture(ctx->st, width, height, format, type, unpack, pixels);
index c89c74229e5b66f50b7422531ad53e63f902d888..b22e846a15719f8953944325323e1432c2eb8d5f 100644 (file)
@@ -34,6 +34,7 @@
 
 
 #include "main/imports.h"
+#include "main/bufferobj.h"
 #include "main/context.h"
 #include "main/image.h"
 
@@ -126,7 +127,6 @@ st_read_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
 }
 
 
-
 /**
  * Do glReadPixels by getting rows from the framebuffer surface with
  * get_tile().  Convert to requested format/type with Mesa image routines.
@@ -155,18 +155,15 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
       return;
    }
 
+   dest = _mesa_validate_and_map_readpix_pbo(ctx, x, y, width, height,
+                                             format, type,
+                                             &clippedPacking, dest);
+   if (!dest)
+      return;
+
    /* make sure rendering has completed */
    pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE);
 
-   if (pack->BufferObj && pack->BufferObj->Name) {
-      /* reading into a PBO */
-
-   }
-   else {
-      /* reading into user memory/buffer */
-
-   }
-
    if (format == GL_STENCIL_INDEX) {
       st_read_stencil_pixels(ctx, x, y, width, height, type, pack, dest);
       return;
@@ -285,6 +282,8 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
          }
       }
    }
+
+   _mesa_unmap_readpix_pbo(ctx, &clippedPacking);
 }