diff options
author | Dave Airlie <[email protected]> | 2011-09-19 15:06:13 +0100 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2011-10-08 17:44:58 +0100 |
commit | 8f9edbad6f972792a51234715aad83c406e1845d (patch) | |
tree | f828adb2402c15583136e706e50b9b940ecfb09d /src/mesa/main | |
parent | 61285c6cfa9ce6086d62fa08bc9e3813f0b30d3d (diff) |
mesa: add packing for int/uint
This just adds a simple packing for GL_UNSIGNED_INT/GL_INT destination formats.
This is enough for at least the gallium drivers to pack both unsigned and signed types for read pixels.
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/mesa/main')
-rw-r--r-- | src/mesa/main/pack.c | 63 | ||||
-rw-r--r-- | src/mesa/main/pack.h | 5 |
2 files changed, 68 insertions, 0 deletions
diff --git a/src/mesa/main/pack.c b/src/mesa/main/pack.c index 62e352f3fc9..092e541c5db 100644 --- a/src/mesa/main/pack.c +++ b/src/mesa/main/pack.c @@ -467,6 +467,69 @@ get_type_min_max(GLenum type, GLfloat *min, GLfloat *max) } } +/* + * integer packing , no transfer operations only packs + * to dst of GL_UNSIGNED_INT or GL_INT + */ +void +_mesa_pack_rgba_span_int(struct gl_context *ctx, GLuint n, GLuint rgba[][4], + GLenum dstFormat, GLenum dstType, + GLvoid *dstAddr) +{ + int i; + + switch(dstType) { + case GL_UNSIGNED_INT: { + GLuint *dst = (GLuint *) dstAddr; + switch (dstFormat) { + case GL_RED_INTEGER_EXT: + case GL_GREEN_INTEGER_EXT: + case GL_BLUE_INTEGER_EXT: + case GL_ALPHA_INTEGER_EXT: + case GL_RGB_INTEGER_EXT: + case GL_RGBA_INTEGER_EXT: + case GL_BGR_INTEGER_EXT: + case GL_BGRA_INTEGER_EXT: + case GL_LUMINANCE_INTEGER_EXT: + case GL_LUMINANCE_ALPHA_INTEGER_EXT: + for (i=0;i<n;i++) { + dst[i*4+0] = (GLuint) rgba[i][RCOMP]; + dst[i*4+1] = (GLuint) rgba[i][GCOMP]; + dst[i*4+2] = (GLuint) rgba[i][BCOMP]; + dst[i*4+3] = (GLuint) rgba[i][ACOMP]; + } + break; + } + } + break; + case GL_INT: { + GLint *dst = (GLint *) dstAddr; + switch (dstFormat) { + case GL_RED_INTEGER_EXT: + case GL_GREEN_INTEGER_EXT: + case GL_BLUE_INTEGER_EXT: + case GL_ALPHA_INTEGER_EXT: + case GL_RGB_INTEGER_EXT: + case GL_RGBA_INTEGER_EXT: + case GL_BGR_INTEGER_EXT: + case GL_BGRA_INTEGER_EXT: + case GL_LUMINANCE_INTEGER_EXT: + case GL_LUMINANCE_ALPHA_INTEGER_EXT: + for (i=0;i<n;i++) { + dst[i*4+0] = (GLint) rgba[i][RCOMP]; + dst[i*4+1] = (GLint) rgba[i][GCOMP]; + dst[i*4+2] = (GLint) rgba[i][BCOMP]; + dst[i*4+3] = (GLint) rgba[i][ACOMP]; + } + break; + } + } + break; + default: + assert(0); + return; + } +} /** diff --git a/src/mesa/main/pack.h b/src/mesa/main/pack.h index 7c76baae4d6..7a0089c2f2c 100644 --- a/src/mesa/main/pack.h +++ b/src/mesa/main/pack.h @@ -144,4 +144,9 @@ _mesa_unpack_image(GLuint dimensions, const struct gl_pixelstore_attrib *unpack); +void +_mesa_pack_rgba_span_int(struct gl_context *ctx, GLuint n, GLuint rgba[][4], + GLenum dstFormat, GLenum dstType, + GLvoid *dstAddr); + #endif |