[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