diff options
author | Anthony Waters <awaters1@gmail.com> | 2014-01-29 11:21:13 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2014-01-31 10:05:34 -0500 |
commit | 654e1536a6d6539dcc30d9151122536c1807f34a (patch) | |
tree | 5290537ad9ccd593f2b54f3d6f9f8b2a97951447 | |
parent | f4bb57f025472f48ef01193074a4950b4820845d (diff) |
glamor: Add in support for the stride parameter when uploading texture data
The method __glamor_upload_pixmap_to_texture was updated to support a
stride parameter for the data being uploaded to a texture. This
required correctly setting the alignment from 4 to a value based on the
depth of the data and also required setting GL_UNPACK_ROW_LENGTH based
on both the stride and the alignment.
The stride parameter was also updated in glamor_put_image to be
correctly specified, the old values would cause the xserver to crash.
Part of bug:
https://bugs.freedesktop.org/show_bug.cgi?id=71813
Signed-off-by: Anthony Waters <awaters1@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | src/glamor_pixmap.c | 18 | ||||
-rw-r--r-- | src/glamor_putimage.c | 8 | ||||
-rw-r--r-- | src/glamor_utils.h | 20 |
3 files changed, 38 insertions, 8 deletions
diff --git a/src/glamor_pixmap.c b/src/glamor_pixmap.c index 84694ec..b34cf5b 100644 --- a/src/glamor_pixmap.c +++ b/src/glamor_pixmap.c @@ -387,7 +387,7 @@ static void __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex, GLenum format, GLenum type, - int x, int y, int w, int h, + int x, int y, int w, int h, int stride, void *bits, int pbo) { glamor_screen_private *glamor_priv = @@ -395,6 +395,12 @@ __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex, glamor_gl_dispatch *dispatch; int non_sub = 0; unsigned int iformat = 0; + int bpp = depth_for_type(type); + int alignment = bpp / 8; + if (stride == 0) { + alignment = 4; + } + dispatch = glamor_get_dispatch(glamor_priv); if (*tex == 0) { @@ -412,11 +418,13 @@ __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex, GL_NEAREST); dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - dispatch->glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + dispatch->glPixelStorei(GL_UNPACK_ALIGNMENT, alignment); if (bits == NULL) dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo); + + dispatch->glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / alignment); if (non_sub) dispatch->glTexImage2D(GL_TEXTURE_2D, 0, iformat, w, h, 0, @@ -428,6 +436,8 @@ __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex, format, type, bits); + dispatch->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + if (bits == NULL) dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); glamor_put_dispatch(glamor_priv); @@ -511,7 +521,7 @@ ready_to_upload: assert(y + fbo_y_off + h <= pixmap_priv->base.fbo->height); __glamor_upload_pixmap_to_texture(pixmap, &pixmap_priv->base.fbo->tex, format, type, - x + fbo_x_off, y + fbo_y_off, w, h, + x + fbo_x_off, y + fbo_y_off, w, h, stride, bits, pbo); return TRUE; } @@ -542,7 +552,7 @@ ready_to_upload: glamor_set_destination_pixmap_priv_nc(pixmap_priv); __glamor_upload_pixmap_to_texture(pixmap, &tex, format, type, - 0, 0, w, h, + 0, 0, w, h, stride, bits, pbo); dispatch->glActiveTexture(GL_TEXTURE0); dispatch->glBindTexture(GL_TEXTURE_2D, tex); diff --git a/src/glamor_putimage.c b/src/glamor_putimage.c index 99f7ac6..8b36f45 100644 --- a/src/glamor_putimage.c +++ b/src/glamor_putimage.c @@ -300,13 +300,13 @@ _glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, } glamor_upload_sub_pixmap_to_texture(temp_pixmap, 0, 0, w, h, - pixmap->devKind, bits, 0); - + 0, bits, 0); glamor_copy_area(&temp_pixmap->drawable, drawable, gc, 0, 0, w, h, x, y); glamor_destroy_pixmap(temp_pixmap); - } else + } else { glamor_upload_sub_pixmap_to_texture(pixmap, x + drawable->x + x_off, y + drawable->y + y_off, - w, h, PixmapBytePad(w, depth), bits, 0); + w, h, 0, bits, 0); + } ret = TRUE; goto done; diff --git a/src/glamor_utils.h b/src/glamor_utils.h index d307838..cf0f1eb 100644 --- a/src/glamor_utils.h +++ b/src/glamor_utils.h @@ -880,6 +880,26 @@ format_for_depth(int depth) } } +static inline int +depth_for_type(GLenum type) +{ + switch (type) { + case GL_UNSIGNED_BYTE: + return 8; + case GL_UNSIGNED_INT_8_8_8_8: + case GL_UNSIGNED_INT_8_8_8_8_REV: + case GL_UNSIGNED_INT_2_10_10_10_REV: + return 32; + case GL_UNSIGNED_SHORT_5_6_5: + case GL_UNSIGNED_SHORT_5_6_5_REV: + case GL_UNSIGNED_SHORT_1_5_5_5_REV: + case GL_UNSIGNED_SHORT_4_4_4_4_REV: + return 16; + default: + return 0; + } +} + static inline void gl_iformat_for_depth(int depth, GLenum * format) { |