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)  { | 
