summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrian Paul <brian.paul@tungstengraphics.com>2008-03-21 13:44:27 -0600
committerBrian Paul <brian.paul@tungstengraphics.com>2008-03-21 13:44:27 -0600
commitf1626f0bfd2b14ad8ca2afaad2ea8afb539e6491 (patch)
treeacd3ff1fff95a61945dd18e50587c65aa44f441d /src
parentff938bf059a41a9bdf4c2c93cebe4a3b8a89c201 (diff)
gallium: implement PBO operations for glDraw/ReadPixels and glBitmap
At this time there are no optimizations for directly blitting between buffer objects and surfaces (always go through mappings). glean pbo test passes now
Diffstat (limited to 'src')
-rw-r--r--src/mesa/state_tracker/st_cb_bitmap.c22
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c22
-rw-r--r--src/mesa/state_tracker/st_cb_readpixels.c19
3 files changed, 35 insertions, 28 deletions
diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c
index 33256196bb..4e23db0edc 100644
--- a/src/mesa/state_tracker/st_cb_bitmap.c
+++ b/src/mesa/state_tracker/st_cb_bitmap.c
@@ -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);
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index b4cd93cd54..c0f8e5ffdd 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -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);
diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c
index c89c74229e..b22e846a15 100644
--- a/src/mesa/state_tracker/st_cb_readpixels.c
+++ b/src/mesa/state_tracker/st_cb_readpixels.c
@@ -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);
}