[Glamor] [PATCH 1/2] glamor: Add in support for the stride parameter when uploading texture data
Alex Deucher
alexdeucher at gmail.com
Fri Jan 31 07:12:46 PST 2014
On Wed, Jan 29, 2014 at 11:21 AM, Anthony Waters <awaters1 at gmail.com> wrote:
> 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 at gmail.com>
For the series:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> src/glamor_pixmap.c | 18 ++++++++++++++----
> src/glamor_putimage.c | 8 ++++----
> 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)
> {
> --
> 1.8.5.3
>
> _______________________________________________
> Glamor mailing list
> Glamor at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/glamor
More information about the Glamor
mailing list