Refactors __glXImageSize and __glXImage3DSize into a single function. It
replaces all calls to the old functions with calls to __glXImageSize
    with the new parameter list.
I have also added 'target' as a parameter. This is a stepping stone to the
    code in patch #2410. Basically, if the texture target is one of
    GL_PROXY_*, the image size is always zero. This gathers all the checks
    for that into a single place. I have *not* modified the existing
    callers to take this into account. They still do their own checks for
    GL_PROXY_*. However, when the generated versions of those functions are
    added to the tree, they *will* rely on that.
The code growth is mainly due to the new 40 line comment before
    __glXImageSize.
I have tested this with a few of the texture using demos and tests from
    Mesa, including tunnel, texdown, and drawpix.
Reviewed by: Adam Jackson, Eric Anholt, and Brian Paul.
			
			
This commit is contained in:
		
							parent
							
								
									e27b3e4ea1
								
							
						
					
					
						commit
						2c82429f89
					
				|  | @ -225,12 +225,9 @@ extern void glxSwapQueryServerStringReply(ClientPtr client, | |||
|  */ | ||||
| 
 | ||||
| extern int __glXTypeSize(GLenum enm); | ||||
| extern int __glXImageSize(GLenum format, GLenum type, GLsizei w, GLsizei h, | ||||
| 			  GLint rowLength, GLint skipRows, GLint alignment); | ||||
| extern int __glXImage3DSize(GLenum format, GLenum type, | ||||
| 			    GLsizei w, GLsizei h, GLsizei d, | ||||
| 			    GLint imageHeight, GLint rowLength, | ||||
| 			    GLint skipImages, GLint skipRows, | ||||
| extern int __glXImageSize(GLenum format, GLenum type, | ||||
|     GLenum target, GLsizei w, GLsizei h, GLsizei d, | ||||
|     GLint imageHeight, GLint rowLength, GLint skipImages, GLint skipRows, | ||||
|     GLint alignment); | ||||
| 
 | ||||
| extern int __glXCallListsReqSize(GLbyte *pc, Bool swap); | ||||
|  |  | |||
|  | @ -301,8 +301,9 @@ void __glXDisp_SeparableFilter2D(GLbyte *pc) | |||
|     /* XXX check this usage - internal code called
 | ||||
|     ** a version without the packing parameters | ||||
|     */ | ||||
|     image1len = __glXImageSize(hdr->format, hdr->type, hdr->width, 1, | ||||
| 			       hdr->rowLength, hdr->skipRows, hdr->alignment); | ||||
|     image1len = __glXImageSize(hdr->format, hdr->type, 0, hdr->width, 1, 1, | ||||
| 			       0, hdr->rowLength, 0, hdr->skipRows, | ||||
| 			       hdr->alignment); | ||||
|     image1len = __GLX_PAD(image1len); | ||||
| 
 | ||||
|     glSeparableFilter2D(hdr->target, hdr->internalformat, | ||||
|  |  | |||
|  | @ -543,8 +543,9 @@ void __glXDispSwap_SeparableFilter2D(GLbyte *pc) | |||
|     /* XXX check this usage - internal code called
 | ||||
|     ** a version without the packing parameters | ||||
|     */ | ||||
|     image1len = __glXImageSize(hdr->format, hdr->type, hdr->width, 1, | ||||
| 			       hdr->rowLength, hdr->skipRows, hdr->alignment); | ||||
|     image1len = __glXImageSize(hdr->format, hdr->type, 0, hdr->width, 1, 1, | ||||
| 			       0, hdr->rowLength, 0, hdr->skipRows, | ||||
| 			       hdr->alignment); | ||||
|     image1len = __GLX_PAD(image1len); | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										115
									
								
								GL/glx/rensize.c
								
								
								
								
							
							
						
						
									
										115
									
								
								GL/glx/rensize.c
								
								
								
								
							|  | @ -268,18 +268,48 @@ int __glXPixelMapusvReqSize(GLbyte *pc, Bool swap ) | |||
|     return 2 * mapsize; | ||||
| } | ||||
| 
 | ||||
| int __glXImageSize( GLenum format, GLenum type, GLsizei w, GLsizei h, | ||||
| 	       GLint rowLength, GLint skipRows, GLint alignment ) | ||||
| { | ||||
|     return __glXImage3DSize( format, type, w, h, 1, 0, rowLength, | ||||
| 			     0, skipRows, alignment ); | ||||
| } | ||||
| 
 | ||||
| /* XXX
 | ||||
|  * This should be folded into __glXImageSize(). | ||||
| /**
 | ||||
|  * Calculate the size of an image. | ||||
|  *  | ||||
|  * The size of an image sent to the server from the client or sent from the | ||||
|  * server to the client is calculated.  The size is based on the dimensions | ||||
|  * of the image, the type of pixel data, padding in the image, and the | ||||
|  * alignment requirements of the image. | ||||
|  *  | ||||
|  * \param format       Format of the pixels.  Same as the \c format parameter | ||||
|  *                     to \c glTexImage1D | ||||
|  * \param type         Type of the pixel data.  Same as the \c type parameter | ||||
|  *                     to \c glTexImage1D | ||||
|  * \param target       Typically the texture target of the image.  If the | ||||
|  *                     target is one of \c GL_PROXY_*, the size returned is | ||||
|  *                     always zero. For uses that do not have a texture target | ||||
|  *                     (e.g, glDrawPixels), zero should be specified. | ||||
|  * \param w            Width of the image data.  Must be >= 1. | ||||
|  * \param h            Height of the image data.  Must be >= 1, even for 1D | ||||
|  *                     images. | ||||
|  * \param d            Depth of the image data.  Must be >= 1, even for 1D or | ||||
|  *                     2D images. | ||||
|  * \param imageHeight  If non-zero, defines the true height of a volumetric | ||||
|  *                     image.  This value will be used instead of \c h for | ||||
|  *                     calculating the size of the image. | ||||
|  * \param rowLength    If non-zero, defines the true width of an image.  This | ||||
|  *                     value will be used instead of \c w for calculating the | ||||
|  *                     size of the image. | ||||
|  * \param skipImages   Number of extra layers of image data in a volumtric | ||||
|  *                     image that are to be skipped before the real data. | ||||
|  * \param skipRows     Number of extra rows of image data in an image that are | ||||
|  *                     to be skipped before the real data. | ||||
|  * \param alignment    Specifies the alignment for the start of each pixel row | ||||
|  *                     in memory.  This value must be one of 1, 2, 4, or 8. | ||||
|  * | ||||
|  * \returns | ||||
|  * The size of the image is returned.  If the specified \c format and \c type | ||||
|  * are invalid, -1 is returned.  If \c target is one of \c GL_PROXY_*, zero | ||||
|  * is returned. | ||||
|  */ | ||||
| int __glXImage3DSize( GLenum format, GLenum type, GLsizei w, GLsizei h, | ||||
| 		      GLsizei d, GLint imageHeight, GLint rowLength, | ||||
| int __glXImageSize( GLenum format, GLenum type, GLenum target, | ||||
| 		    GLsizei w, GLsizei h, GLsizei d, | ||||
| 		    GLint imageHeight, GLint rowLength, | ||||
| 		    GLint skipImages, GLint skipRows, GLint alignment ) | ||||
| { | ||||
|     GLint bytesPerElement, elementsPerGroup, groupsPerRow; | ||||
|  | @ -292,6 +322,22 @@ int __glXImage3DSize( GLenum format, GLenum type, GLsizei w, GLsizei h, | |||
|     } | ||||
|     if (w==0 || h==0 || d == 0) return 0; | ||||
| 
 | ||||
|     switch( target ) { | ||||
|     case GL_PROXY_TEXTURE_1D: | ||||
|     case GL_PROXY_TEXTURE_2D: | ||||
|     case GL_PROXY_TEXTURE_3D: | ||||
|     case GL_PROXY_TEXTURE_4D_SGIS: | ||||
|     case GL_PROXY_TEXTURE_CUBE_MAP: | ||||
|     case GL_PROXY_TEXTURE_RECTANGLE_ARB: | ||||
|     case GL_PROXY_HISTOGRAM: | ||||
|     case GL_PROXY_COLOR_TABLE: | ||||
|     case GL_PROXY_TEXTURE_COLOR_TABLE_SGI: | ||||
|     case GL_PROXY_POST_CONVOLUTION_COLOR_TABLE: | ||||
|     case GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE: | ||||
|     case GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP: | ||||
| 	return 0; | ||||
|     } | ||||
| 
 | ||||
|     if (type == GL_BITMAP) { | ||||
| 	if (rowLength > 0) { | ||||
| 	    groupsPerRow = rowLength; | ||||
|  | @ -425,7 +471,8 @@ int __glXDrawPixelsReqSize(GLbyte *pc, Bool swap ) | |||
| 	skipRows = SWAPL( skipRows ); | ||||
| 	alignment = SWAPL( alignment ); | ||||
|     } | ||||
|     return __glXImageSize( format, type, w, h, rowLength, skipRows, alignment ); | ||||
|     return __glXImageSize( format, type, 0, w, h, 1, | ||||
| 			   0, rowLength, 0, skipRows, alignment ); | ||||
| } | ||||
| 
 | ||||
| int __glXBitmapReqSize(GLbyte *pc, Bool swap ) | ||||
|  | @ -444,8 +491,8 @@ int __glXBitmapReqSize(GLbyte *pc, Bool swap ) | |||
| 	skipRows = SWAPL( skipRows ); | ||||
| 	alignment = SWAPL( alignment ); | ||||
|     } | ||||
|     return __glXImageSize( GL_COLOR_INDEX, GL_BITMAP, w, h, | ||||
| 		      rowLength, skipRows, alignment ); | ||||
|     return __glXImageSize( GL_COLOR_INDEX, GL_BITMAP, 0, w, h, 1, | ||||
| 		      0, rowLength, 0, skipRows, alignment ); | ||||
| } | ||||
| 
 | ||||
| int __glXTexImage1DReqSize(GLbyte *pc, Bool swap ) | ||||
|  | @ -473,7 +520,8 @@ int __glXTexImage1DReqSize(GLbyte *pc, Bool swap ) | |||
|     } else if (format == GL_STENCIL_INDEX || format == GL_DEPTH_COMPONENT) { | ||||
| 	return -1; | ||||
|     } | ||||
|     return __glXImageSize( format, type, w, 1, rowLength, skipRows, alignment ); | ||||
|     return __glXImageSize( format, type, 0, w, 1, 1, | ||||
| 			   0, rowLength, 0, skipRows, alignment ); | ||||
| } | ||||
| 
 | ||||
| int __glXTexImage2DReqSize(GLbyte *pc, Bool swap ) | ||||
|  | @ -503,7 +551,8 @@ int __glXTexImage2DReqSize(GLbyte *pc, Bool swap ) | |||
|     } else if (format == GL_STENCIL_INDEX || format == GL_DEPTH_COMPONENT) { | ||||
| 	return -1; | ||||
|     } | ||||
|     return __glXImageSize( format, type, w, h, rowLength, skipRows, alignment ); | ||||
|     return __glXImageSize( format, type, 0, w, h, 1, | ||||
| 			   0, rowLength, 0, skipRows, alignment ); | ||||
| } | ||||
| 
 | ||||
| /* XXX this is used elsewhere - should it be exported from glxserver.h? */ | ||||
|  | @ -614,7 +663,8 @@ int __glXTexSubImage1DReqSize(GLbyte *pc, Bool swap ) | |||
| 	skipRows = SWAPL( skipRows ); | ||||
| 	alignment = SWAPL( alignment ); | ||||
|     } | ||||
|     return __glXImageSize( format, type, w, 1, rowLength, skipRows, alignment ); | ||||
|     return __glXImageSize( format, type, 0, w, 1, 1, | ||||
| 			   0, rowLength, 0, skipRows, alignment ); | ||||
| } | ||||
| 
 | ||||
| int __glXTexSubImage2DReqSize(GLbyte *pc, Bool swap ) | ||||
|  | @ -637,7 +687,8 @@ int __glXTexSubImage2DReqSize(GLbyte *pc, Bool swap ) | |||
| 	skipRows = SWAPL( skipRows ); | ||||
| 	alignment = SWAPL( alignment ); | ||||
|     } | ||||
|     return __glXImageSize( format, type, w, h, rowLength, skipRows, alignment ); | ||||
|     return __glXImageSize( format, type, 0, w, h, 1, | ||||
| 			   0, rowLength, 0, skipRows, alignment ); | ||||
| } | ||||
| 
 | ||||
| int __glXTexImage3DReqSize(GLbyte *pc, Bool swap ) | ||||
|  | @ -672,9 +723,8 @@ int __glXTexImage3DReqSize(GLbyte *pc, Bool swap ) | |||
|     if (target == GL_PROXY_TEXTURE_3D || nullImage) { | ||||
| 	return 0; | ||||
|     } else { | ||||
| 	return __glXImage3DSize( format, type, w, h, d, imageHeight, | ||||
| 				 rowLength, skipImages, skipRows, | ||||
| 				 alignment); | ||||
| 	return __glXImageSize( format, type, target, w, h, d, imageHeight, | ||||
| 			       rowLength, skipImages, skipRows, alignment ); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -710,9 +760,8 @@ int __glXTexSubImage3DReqSize(GLbyte *pc, Bool swap ) | |||
|     if (target == GL_PROXY_TEXTURE_3D) { | ||||
| 	return 0; | ||||
|     } else { | ||||
| 	return __glXImage3DSize( format, type, w, h, d, imageHeight, | ||||
| 				 rowLength, skipImages, skipRows, | ||||
| 				 alignment); | ||||
| 	return __glXImageSize( format, type, target, w, h, d, imageHeight, | ||||
| 			       rowLength, skipImages, skipRows, alignment ); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -735,7 +784,8 @@ int __glXConvolutionFilter1DReqSize(GLbyte *pc, Bool swap ) | |||
| 	alignment = SWAPL( alignment ); | ||||
|     } | ||||
| 
 | ||||
|     return __glXImageSize ( format, type, w, 1, rowLength, 0, alignment ); | ||||
|     return __glXImageSize( format, type, 0, w, 1, 1,  | ||||
| 			   0, rowLength, 0, 0, alignment ); | ||||
| } | ||||
| 
 | ||||
| int __glXConvolutionFilter2DReqSize(GLbyte *pc, Bool swap ) | ||||
|  | @ -761,7 +811,8 @@ int __glXConvolutionFilter2DReqSize(GLbyte *pc, Bool swap ) | |||
| 	alignment = SWAPL( alignment ); | ||||
|     } | ||||
| 
 | ||||
|     return __glXImageSize ( format, type, w, h, rowLength, skipRows, alignment ); | ||||
|     return __glXImageSize( format, type, 0, w, h, 1, | ||||
| 			   0, rowLength, 0, skipRows, alignment ); | ||||
| } | ||||
| 
 | ||||
| int __glXConvolutionParameterivSize(GLenum pname) | ||||
|  | @ -820,9 +871,11 @@ int __glXSeparableFilter2DReqSize(GLbyte *pc, Bool swap ) | |||
|     } | ||||
| 
 | ||||
|     /* XXX Should rowLength be used for either or both image? */ | ||||
|     image1size = __glXImageSize ( format, type, w, 1, rowLength, 0, alignment ); | ||||
|     image1size = __glXImageSize( format, type, 0, w, 1, 1, | ||||
| 				 0, rowLength, 0, 0, alignment ); | ||||
|     image1size = __GLX_PAD(image1size); | ||||
|     image2size = __glXImageSize ( format, type, h, 1, rowLength, 0, alignment ); | ||||
|     image2size = __glXImageSize( format, type, 0, h, 1, 1, | ||||
| 				 0, rowLength, 0, 0, alignment ); | ||||
|     return image1size + image2size; | ||||
| 
 | ||||
| } | ||||
|  | @ -876,7 +929,8 @@ int __glXColorTableReqSize(GLbyte *pc, Bool swap ) | |||
| 	alignment = SWAPL( alignment ); | ||||
|     } | ||||
| 
 | ||||
|     return __glXImageSize ( format, type, w, 1, rowLength, 0, alignment ); | ||||
|     return __glXImageSize( format, type, 0, w, 1, 1, | ||||
| 			   0, rowLength, 0, 0, alignment ); | ||||
| } | ||||
| 
 | ||||
| int __glXColorSubTableReqSize(GLbyte *pc, Bool swap ) | ||||
|  | @ -898,7 +952,8 @@ int __glXColorSubTableReqSize(GLbyte *pc, Bool swap ) | |||
| 	alignment = SWAPL( alignment ); | ||||
|     } | ||||
| 
 | ||||
|     return __glXImageSize ( format, type, count, 1, rowLength, 0, alignment ); | ||||
|     return __glXImageSize( format, type, 0, count, 1, 1, | ||||
| 			   0, rowLength, 0, 0, alignment ); | ||||
| } | ||||
| 
 | ||||
| int __glXColorTableParameterfvReqSize(GLbyte *pc, Bool swap ) | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ | |||
| 
 | ||||
| GLint __glReadPixels_size(GLenum format, GLenum type, GLint w, GLint h) | ||||
| { | ||||
|     return __glXImage3DSize( format, type, w, h, 1, 0, 0, 0, 0, 4 ); | ||||
|     return __glXImageSize( format, type, 0, w, h, 1, 0, 0, 0, 0, 4 ); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -1127,7 +1127,7 @@ GLint __glGetTexLevelParameteriv_size(GLenum pname) | |||
| GLint __glGetTexImage_size(GLenum target, GLint level, GLenum format, | ||||
| 			   GLenum type, GLint width, GLint height, GLint depth) | ||||
| { | ||||
|     return __glXImage3DSize( format, type, width, height, depth, | ||||
|     return __glXImageSize( format, type, target, width, height, depth, | ||||
| 			   0, 0, 0, 0, 4 ); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue