diff options
author | Brian Paul <brianp@vmware.com> | 2012-06-19 09:39:54 -0600 |
---|---|---|
committer | Brian Paul <brianp@vmware.com> | 2012-06-19 14:40:44 -0600 |
commit | fc855ed5d968c6d650df77505540bfbdaa5fb35e (patch) | |
tree | c8e864ae7a67a1f867ab9ca069c5569281cf52d5 /src | |
parent | 7f4786ad29abbbbc4b0ebfcec8114921c1c8f6e3 (diff) |
st/mesa: clamp glDrawPixels size to max texture size
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/state_tracker/st_cb_drawpixels.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index aba9165025..2bcbada4f3 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/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,12 +1094,21 @@ 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; else if (format == GL_STENCIL_INDEX) |