aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2012-06-21 08:09:37 +0200
committermarha <marha@users.sourceforge.net>2012-06-21 08:09:37 +0200
commitda6ea6d64418710cbf7e0639dfefd2d856d53f1a (patch)
tree23900712d7923a4e77aa095f68e7a955321ba538 /mesalib/src/mesa/state_tracker/st_cb_drawpixels.c
parent36237c651fab7aa9e65da9c33eb89a619827edff (diff)
downloadvcxsrv-da6ea6d64418710cbf7e0639dfefd2d856d53f1a.tar.gz
vcxsrv-da6ea6d64418710cbf7e0639dfefd2d856d53f1a.tar.bz2
vcxsrv-da6ea6d64418710cbf7e0639dfefd2d856d53f1a.zip
mesa pixman xkeyboard-config xserver git update 21 Jun 2012
Diffstat (limited to 'mesalib/src/mesa/state_tracker/st_cb_drawpixels.c')
-rw-r--r--mesalib/src/mesa/state_tracker/st_cb_drawpixels.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c b/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c
index d3f8d1368..2bcbada4f 100644
--- a/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -1056,6 +1056,28 @@ get_depth_stencil_fp_variant(struct st_context *st, GLboolean write_depth,
/**
+ * Clamp glDrawPixels width and height to the maximum texture size.
+ */
+static void
+clamp_size(struct pipe_context *pipe, GLsizei *width, GLsizei *height,
+ struct gl_pixelstore_attrib *unpack)
+{
+ const unsigned maxSize =
+ 1 << (pipe->screen->get_param(pipe->screen,
+ PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
+
+ if (*width > maxSize) {
+ if (unpack->RowLength == 0)
+ unpack->RowLength = *width;
+ *width = maxSize;
+ }
+ if (*height > maxSize) {
+ *height = maxSize;
+ }
+}
+
+
+/**
* Called via ctx->Driver.DrawPixels()
*/
static void
@@ -1072,6 +1094,20 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
struct pipe_sampler_view *sv[2];
int num_sampler_view = 1;
struct st_fp_variant *fpv;
+ struct gl_pixelstore_attrib clippedUnpack;
+
+ /* Mesa state should be up to date by now */
+ assert(ctx->NewState == 0x0);
+
+ st_validate_state(st);
+
+ /* Limit the size of the glDrawPixels to the max texture size.
+ * Strictly speaking, that's not correct but since we don't handle
+ * larger images yet, this is better than crashing.
+ */
+ clippedUnpack = *unpack;
+ unpack = &clippedUnpack;
+ clamp_size(st->pipe, &width, &height, &clippedUnpack);
if (format == GL_DEPTH_STENCIL)
write_stencil = write_depth = GL_TRUE;
@@ -1088,11 +1124,6 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
return;
}
- /* Mesa state should be up to date by now */
- assert(ctx->NewState == 0x0);
-
- st_validate_state(st);
-
/*
* Get vertex/fragment shaders
*/