summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Waters <awaters1@gmail.com>2014-01-29 11:21:13 -0500
committerAlex Deucher <alexander.deucher@amd.com>2014-01-31 10:05:34 -0500
commit654e1536a6d6539dcc30d9151122536c1807f34a (patch)
tree5290537ad9ccd593f2b54f3d6f9f8b2a97951447
parentf4bb57f025472f48ef01193074a4950b4820845d (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.c18
-rw-r--r--src/glamor_putimage.c8
-rw-r--r--src/glamor_utils.h20
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)
{