mesa: Add the remaining from/to types for GL_EXT_texture_integer (and R/RG).
This aborts and crashes in intel oglconform's int-textures into being just rendering failures. Clamping isn't handled yet. v2: Add missing "break". v3: Drop the int/uint distinction, since they don't need different clamping. NOTE: This is a candidate for the 8.0 branch. Reviewed-by: Brian Paul <brianp@vmware.com> (v2)
This commit is contained in:
+61
-51
@@ -448,65 +448,75 @@ 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
|
||||
/* Customization of integer packing. We always treat src as uint, and can pack dst
|
||||
* as any integer type/format combo.
|
||||
*/
|
||||
#define SRC_TYPE GLuint
|
||||
|
||||
#define DST_TYPE GLuint
|
||||
#define SRC_CONVERT(x) (x)
|
||||
#define FN_NAME pack_uint_from_uint_rgba
|
||||
#include "pack_tmp.h"
|
||||
#undef DST_TYPE
|
||||
#undef SRC_CONVERT
|
||||
#undef FN_NAME
|
||||
|
||||
#define DST_TYPE GLushort
|
||||
#define SRC_CONVERT(x) (x)
|
||||
#define FN_NAME pack_ushort_from_uint_rgba
|
||||
#include "pack_tmp.h"
|
||||
#undef DST_TYPE
|
||||
#undef SRC_CONVERT
|
||||
#undef FN_NAME
|
||||
|
||||
#define DST_TYPE GLshort
|
||||
#define SRC_CONVERT(x) (x)
|
||||
#define FN_NAME pack_short_from_uint_rgba
|
||||
#include "pack_tmp.h"
|
||||
#undef DST_TYPE
|
||||
#undef SRC_CONVERT
|
||||
#undef FN_NAME
|
||||
|
||||
#define DST_TYPE GLubyte
|
||||
#define SRC_CONVERT(x) (x)
|
||||
#define FN_NAME pack_ubyte_from_uint_rgba
|
||||
#include "pack_tmp.h"
|
||||
#undef DST_TYPE
|
||||
#undef SRC_CONVERT
|
||||
#undef FN_NAME
|
||||
|
||||
#define DST_TYPE GLbyte
|
||||
#define SRC_CONVERT(x) (x)
|
||||
#define FN_NAME pack_byte_from_uint_rgba
|
||||
#include "pack_tmp.h"
|
||||
#undef DST_TYPE
|
||||
#undef SRC_CONVERT
|
||||
#undef FN_NAME
|
||||
|
||||
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_RG_INTEGER:
|
||||
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;
|
||||
}
|
||||
}
|
||||
case GL_UNSIGNED_INT:
|
||||
pack_uint_from_uint_rgba(dstAddr, dstFormat, rgba, n);
|
||||
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_RG_INTEGER:
|
||||
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;
|
||||
}
|
||||
}
|
||||
case GL_INT:
|
||||
/* No conversion necessary. */
|
||||
pack_uint_from_uint_rgba(dstAddr, dstFormat, rgba, n);
|
||||
break;
|
||||
case GL_UNSIGNED_SHORT:
|
||||
pack_ushort_from_uint_rgba(dstAddr, dstFormat, rgba, n);
|
||||
break;
|
||||
case GL_SHORT:
|
||||
pack_short_from_uint_rgba(dstAddr, dstFormat, rgba, n);
|
||||
break;
|
||||
case GL_UNSIGNED_BYTE:
|
||||
pack_ubyte_from_uint_rgba(dstAddr, dstFormat, rgba, n);
|
||||
break;
|
||||
case GL_BYTE:
|
||||
pack_byte_from_uint_rgba(dstAddr, dstFormat, rgba, n);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright © 2012 Intel Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
static void
|
||||
FN_NAME(DST_TYPE *dst,
|
||||
GLenum dstFormat,
|
||||
SRC_TYPE rgba[][4],
|
||||
int n)
|
||||
{
|
||||
int i;
|
||||
|
||||
switch (dstFormat) {
|
||||
case GL_RED_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i] = SRC_CONVERT(rgba[i][RCOMP]);
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_GREEN_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i] = SRC_CONVERT(rgba[i][GCOMP]);
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_BLUE_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i] = SRC_CONVERT(rgba[i][BCOMP]);
|
||||
};
|
||||
break;
|
||||
|
||||
case GL_ALPHA_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i] = SRC_CONVERT(rgba[i][ACOMP]);
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_RG_INTEGER:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i*2+0] = SRC_CONVERT(rgba[i][RCOMP]);
|
||||
dst[i*2+1] = SRC_CONVERT(rgba[i][GCOMP]);
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_RGB_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i*3+0] = SRC_CONVERT(rgba[i][RCOMP]);
|
||||
dst[i*3+1] = SRC_CONVERT(rgba[i][GCOMP]);
|
||||
dst[i*3+2] = SRC_CONVERT(rgba[i][BCOMP]);
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_RGBA_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i*4+0] = SRC_CONVERT(rgba[i][RCOMP]);
|
||||
dst[i*4+1] = SRC_CONVERT(rgba[i][GCOMP]);
|
||||
dst[i*4+2] = SRC_CONVERT(rgba[i][BCOMP]);
|
||||
dst[i*4+3] = SRC_CONVERT(rgba[i][ACOMP]);
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_BGR_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i*3+0] = SRC_CONVERT(rgba[i][BCOMP]);
|
||||
dst[i*3+1] = SRC_CONVERT(rgba[i][GCOMP]);
|
||||
dst[i*3+2] = SRC_CONVERT(rgba[i][RCOMP]);
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_BGRA_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i*4+0] = SRC_CONVERT(rgba[i][BCOMP]);
|
||||
dst[i*4+1] = SRC_CONVERT(rgba[i][GCOMP]);
|
||||
dst[i*4+2] = SRC_CONVERT(rgba[i][RCOMP]);
|
||||
dst[i*4+3] = SRC_CONVERT(rgba[i][ACOMP]);
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_LUMINANCE_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i] = SRC_CONVERT(rgba[i][RCOMP] +
|
||||
rgba[i][GCOMP] +
|
||||
rgba[i][BCOMP]);
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_LUMINANCE_ALPHA_INTEGER_EXT:
|
||||
for (i=0;i<n;i++) {
|
||||
dst[i*2+0] = SRC_CONVERT(rgba[i][RCOMP] +
|
||||
rgba[i][GCOMP] +
|
||||
rgba[i][BCOMP]);
|
||||
dst[i*2+1] = SRC_CONVERT(rgba[i][ACOMP]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user