X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=progs%2Fdemos%2Freadpix.c;h=c0aac2272f7598e6aacebc2e11edb2d0fe1e3587;hb=86f3135fbd9db9ca08a6c0bfc620345c8a8e3f04;hp=71ce9723543973f47df16a7100a6de683e93a845;hpb=0fe7f406be7ffa8e849d9097e00a4d6229c138bd;p=mesa.git diff --git a/progs/demos/readpix.c b/progs/demos/readpix.c index 71ce9723543..c0aac2272f7 100644 --- a/progs/demos/readpix.c +++ b/progs/demos/readpix.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include "readtex.h" @@ -28,29 +29,32 @@ static GLboolean ScaleAndBias = GL_FALSE; static GLboolean Benchmark = GL_FALSE; static GLubyte *TempImage = NULL; -#if 0 +#define COMBO 1 +#if COMBO == 0 #define ReadFormat ImgFormat #define ReadType GL_UNSIGNED_BYTE -#endif -#if 1 +#elif COMBO == 1 static GLenum ReadFormat = GL_RGBA; static GLenum ReadType = GL_UNSIGNED_BYTE; -#endif -#if 0 +#elif COMBO == 2 +static GLenum ReadFormat = GL_RGB; +static GLenum ReadType = GL_UNSIGNED_BYTE; +#elif COMBO == 3 static GLenum ReadFormat = GL_RGB; static GLenum ReadType = GL_UNSIGNED_SHORT_5_6_5; -#endif -#if 0 +#elif COMBO == 4 static GLenum ReadFormat = GL_RGBA; static GLenum ReadType = GL_UNSIGNED_SHORT_1_5_5_5_REV; -#endif -#if 0 +#elif COMBO == 5 static GLenum ReadFormat = GL_BGRA; static GLenum ReadType = GL_UNSIGNED_SHORT_5_5_5_1; -#endif -#if 0 +#elif COMBO == 6 static GLenum ReadFormat = GL_BGRA; static GLenum ReadType = GL_UNSIGNED_SHORT_4_4_4_4_REV; +#elif COMBO == 7 +static GLenum ReadFormat = GL_RGBA; +static GLenum ReadType = GL_HALF_FLOAT_ARB; +#undef GL_OES_read_format #endif @@ -95,6 +99,45 @@ SetupPixelTransfer(GLboolean invert) } +/** + * Exercise Pixel Pack parameters by reading the image in four pieces. + */ +static void +ComplexReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, + GLenum format, GLenum type, GLvoid *pixels) +{ + const GLsizei width0 = width / 2; + const GLsizei width1 = width - width0; + const GLsizei height0 = height / 2; + const GLsizei height1 = height - height0; + + glPixelStorei(GL_PACK_ROW_LENGTH, width); + + /* lower-left quadrant */ + glReadPixels(x, y, width0, height0, format, type, pixels); + + /* lower-right quadrant */ + glPixelStorei(GL_PACK_SKIP_PIXELS, width0); + glReadPixels(x + width0, y, width1, height0, format, type, pixels); + + /* upper-left quadrant */ + glPixelStorei(GL_PACK_SKIP_PIXELS, 0); + glPixelStorei(GL_PACK_SKIP_ROWS, height0); + glReadPixels(x, y + height0, width0, height1, format, type, pixels); + + /* upper-right quadrant */ + glPixelStorei(GL_PACK_SKIP_PIXELS, width0); + glPixelStorei(GL_PACK_SKIP_ROWS, height0); + glReadPixels(x + width0, y + height0, width1, height1, format, type, pixels); + + /* restore defaults */ + glPixelStorei(GL_PACK_SKIP_PIXELS, 0); + glPixelStorei(GL_PACK_SKIP_ROWS, 0); + glPixelStorei(GL_PACK_ROW_LENGTH, ImgWidth); +} + + + static void Display( void ) { @@ -110,8 +153,13 @@ Display( void ) glRasterPos2i(APosX, APosY); glEnable(GL_DITHER); SetupPixelTransfer(GL_FALSE); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glDrawPixels(ImgWidth, ImgHeight, ImgFormat, GL_UNSIGNED_BYTE, Image); + /* might try alignment=4 here for testing */ + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + /* do readpixels, drawpixels */ glRasterPos2i(BPosX, 5); PrintString("Read/DrawPixels"); @@ -137,8 +185,15 @@ Display( void ) else { /* clear the temporary image to white (helpful for debugging */ memset(TempImage, 255, ImgWidth * ImgHeight * 4); +#if 1 glReadPixels(APosX, APosY, ImgWidth, ImgHeight, ReadFormat, ReadType, TempImage); + (void) ComplexReadPixels; +#else + /* you might use this when debugging */ + ComplexReadPixels(APosX, APosY, ImgWidth, ImgHeight, + ReadFormat, ReadType, TempImage); +#endif } glRasterPos2i(BPosX, BPosY); glDisable(GL_DITHER); @@ -252,14 +307,16 @@ Init( GLboolean ciMode ) printf("Loaded %d by %d image\n", ImgWidth, ImgHeight ); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ROW_LENGTH, ImgWidth); - glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_PACK_ROW_LENGTH, ImgWidth); Reset(); - TempImage = (GLubyte *) malloc(ImgWidth * ImgHeight * 4 * sizeof(GLubyte)); + /* allocate large TempImage to store and image data type, plus an + * extra 1KB in case we're tinkering with pack alignment. + */ + TempImage = (GLubyte *) malloc(ImgWidth * ImgHeight * 4 * 4 + + 1000); assert(TempImage); }