aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/main/texcompress_bptc.c19
-rw-r--r--src/mesa/main/texcompress_fxt1.c34
-rw-r--r--src/mesa/main/texcompress_rgtc.c45
-rw-r--r--src/mesa/main/texcompress_s3tc.c68
-rw-r--r--src/mesa/main/texstore.c141
-rw-r--r--src/mesa/main/texstore.h9
6 files changed, 114 insertions, 202 deletions
diff --git a/src/mesa/main/texcompress_bptc.c b/src/mesa/main/texcompress_bptc.c
index 9204f123e25..3225d9620f6 100644
--- a/src/mesa/main/texcompress_bptc.c
+++ b/src/mesa/main/texcompress_bptc.c
@@ -1276,7 +1276,6 @@ _mesa_texstore_bptc_rgba_unorm(TEXSTORE_PARAMS)
{
const GLubyte *pixels;
const GLubyte *tempImage = NULL;
- GLenum baseFormat;
int rowstride;
if (srcFormat != GL_RGBA ||
@@ -1284,15 +1283,19 @@ _mesa_texstore_bptc_rgba_unorm(TEXSTORE_PARAMS)
ctx->_ImageTransferState ||
srcPacking->SwapBytes) {
/* convert image to RGBA/ubyte */
- baseFormat = _mesa_get_format_base_format(dstFormat);
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- baseFormat,
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ GLubyte *tempImageSlices[1];
+ int rgbaRowStride = 4 * srcWidth * sizeof(GLubyte);
+ tempImage = malloc(srcWidth * srcHeight * 4 * sizeof(GLubyte));
if (!tempImage)
return GL_FALSE; /* out of memory */
+ tempImageSlices[0] = (GLubyte *) tempImage;
+ _mesa_texstore(ctx, dims,
+ baseInternalFormat,
+ MESA_FORMAT_R8G8B8A8_UNORM,
+ rgbaRowStride, tempImageSlices,
+ srcWidth, srcHeight, srcDepth,
+ srcFormat, srcType, srcAddr,
+ srcPacking);
pixels = tempImage;
rowstride = srcWidth * 4;
diff --git a/src/mesa/main/texcompress_fxt1.c b/src/mesa/main/texcompress_fxt1.c
index 61b01c6b445..7b25e103905 100644
--- a/src/mesa/main/texcompress_fxt1.c
+++ b/src/mesa/main/texcompress_fxt1.c
@@ -69,14 +69,19 @@ _mesa_texstore_rgb_fxt1(TEXSTORE_PARAMS)
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGB/GLubyte */
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- _mesa_get_format_base_format(dstFormat),
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ GLubyte *tempImageSlices[1];
+ int rgbRowStride = 3 * srcWidth * sizeof(GLubyte);
+ tempImage = malloc(srcWidth * srcHeight * 3 * sizeof(GLubyte));
if (!tempImage)
return GL_FALSE; /* out of memory */
+ tempImageSlices[0] = (GLubyte *) tempImage;
+ _mesa_texstore(ctx, dims,
+ baseInternalFormat,
+ MESA_FORMAT_RGB_UNORM8,
+ rgbRowStride, tempImageSlices,
+ srcWidth, srcHeight, srcDepth,
+ srcFormat, srcType, srcAddr,
+ srcPacking);
pixels = tempImage;
srcRowStride = 3 * srcWidth;
srcFormat = GL_RGB;
@@ -118,14 +123,19 @@ _mesa_texstore_rgba_fxt1(TEXSTORE_PARAMS)
ctx->_ImageTransferState ||
srcPacking->SwapBytes) {
/* convert image to RGBA/GLubyte */
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- _mesa_get_format_base_format(dstFormat),
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ GLubyte *tempImageSlices[1];
+ int rgbaRowStride = 4 * srcWidth * sizeof(GLubyte);
+ tempImage = malloc(srcWidth * srcHeight * 4 * sizeof(GLubyte));
if (!tempImage)
return GL_FALSE; /* out of memory */
+ tempImageSlices[0] = (GLubyte *) tempImage;
+ _mesa_texstore(ctx, dims,
+ baseInternalFormat,
+ MESA_FORMAT_R8G8B8A8_UNORM,
+ rgbaRowStride, tempImageSlices,
+ srcWidth, srcHeight, srcDepth,
+ srcFormat, srcType, srcAddr,
+ srcPacking);
pixels = tempImage;
srcRowStride = 4 * srcWidth;
srcFormat = GL_RGBA;
diff --git a/src/mesa/main/texcompress_rgtc.c b/src/mesa/main/texcompress_rgtc.c
index f7ee24d47fe..e96af4eb5a6 100644
--- a/src/mesa/main/texcompress_rgtc.c
+++ b/src/mesa/main/texcompress_rgtc.c
@@ -83,18 +83,24 @@ _mesa_texstore_red_rgtc1(TEXSTORE_PARAMS)
const GLubyte *srcaddr;
GLubyte srcpixels[4][4];
GLubyte *blkaddr;
- GLint dstRowDiff;
+ GLint dstRowDiff, redRowStride;
+ GLubyte *tempImageSlices[1];
+
ASSERT(dstFormat == MESA_FORMAT_R_RGTC1_UNORM ||
dstFormat == MESA_FORMAT_L_LATC1_UNORM);
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- _mesa_get_format_base_format(dstFormat),
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ tempImage = malloc(srcWidth * srcHeight * 1 * sizeof(GLubyte));
if (!tempImage)
return GL_FALSE; /* out of memory */
+ redRowStride = 1 * srcWidth * sizeof(GLubyte);
+ tempImageSlices[0] = (GLubyte *) tempImage;
+ _mesa_texstore(ctx, dims,
+ baseInternalFormat,
+ MESA_FORMAT_R_UNORM8,
+ redRowStride, tempImageSlices,
+ srcWidth, srcHeight, srcDepth,
+ srcFormat, srcType, srcAddr,
+ srcPacking);
dst = dstSlices[0];
@@ -177,19 +183,30 @@ _mesa_texstore_rg_rgtc2(TEXSTORE_PARAMS)
const GLubyte *srcaddr;
GLubyte srcpixels[4][4];
GLubyte *blkaddr;
- GLint dstRowDiff;
+ GLint dstRowDiff, rgRowStride;
+ mesa_format tempFormat;
+ GLubyte *tempImageSlices[1];
ASSERT(dstFormat == MESA_FORMAT_RG_RGTC2_UNORM ||
dstFormat == MESA_FORMAT_LA_LATC2_UNORM);
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- _mesa_get_format_base_format(dstFormat),
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ if (baseInternalFormat == GL_RG)
+ tempFormat = MESA_FORMAT_R8G8_UNORM;
+ else
+ tempFormat = MESA_FORMAT_L8A8_UNORM;
+
+ rgRowStride = 2 * srcWidth * sizeof(GLubyte);
+ tempImage = malloc(srcWidth * srcHeight * 2 * sizeof(GLubyte));
if (!tempImage)
return GL_FALSE; /* out of memory */
+ tempImageSlices[0] = (GLubyte *) tempImage;
+ _mesa_texstore(ctx, dims,
+ baseInternalFormat,
+ tempFormat,
+ rgRowStride, tempImageSlices,
+ srcWidth, srcHeight, srcDepth,
+ srcFormat, srcType, srcAddr,
+ srcPacking);
dst = dstSlices[0];
diff --git a/src/mesa/main/texcompress_s3tc.c b/src/mesa/main/texcompress_s3tc.c
index 254f84ef728..bfb53dce48d 100644
--- a/src/mesa/main/texcompress_s3tc.c
+++ b/src/mesa/main/texcompress_s3tc.c
@@ -142,14 +142,19 @@ _mesa_texstore_rgb_dxt1(TEXSTORE_PARAMS)
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGB/GLubyte */
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- _mesa_get_format_base_format(dstFormat),
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ GLubyte *tempImageSlices[1];
+ int rgbRowStride = 3 * srcWidth * sizeof(GLubyte);
+ tempImage = malloc(srcWidth * srcHeight * 3 * sizeof(GLubyte));
if (!tempImage)
return GL_FALSE; /* out of memory */
+ tempImageSlices[0] = (GLubyte *) tempImage;
+ _mesa_texstore(ctx, dims,
+ baseInternalFormat,
+ MESA_FORMAT_RGB_UNORM8,
+ rgbRowStride, tempImageSlices,
+ srcWidth, srcHeight, srcDepth,
+ srcFormat, srcType, srcAddr,
+ srcPacking);
pixels = tempImage;
srcFormat = GL_RGB;
}
@@ -194,14 +199,19 @@ _mesa_texstore_rgba_dxt1(TEXSTORE_PARAMS)
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGBA/GLubyte */
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- _mesa_get_format_base_format(dstFormat),
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ GLubyte *tempImageSlices[1];
+ int rgbaRowStride = 4 * srcWidth * sizeof(GLubyte);
+ tempImage = malloc(srcWidth * srcHeight * 4 * sizeof(GLubyte));
if (!tempImage)
return GL_FALSE; /* out of memory */
+ tempImageSlices[0] = (GLubyte *) tempImage;
+ _mesa_texstore(ctx, dims,
+ baseInternalFormat,
+ MESA_FORMAT_R8G8B8A8_UNORM,
+ rgbaRowStride, tempImageSlices,
+ srcWidth, srcHeight, srcDepth,
+ srcFormat, srcType, srcAddr,
+ srcPacking);
pixels = tempImage;
srcFormat = GL_RGBA;
}
@@ -246,14 +256,19 @@ _mesa_texstore_rgba_dxt3(TEXSTORE_PARAMS)
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGBA/GLubyte */
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- _mesa_get_format_base_format(dstFormat),
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ GLubyte *tempImageSlices[1];
+ int rgbaRowStride = 4 * srcWidth * sizeof(GLubyte);
+ tempImage = malloc(srcWidth * srcHeight * 4 * sizeof(GLubyte));
if (!tempImage)
return GL_FALSE; /* out of memory */
+ tempImageSlices[0] = (GLubyte *) tempImage;
+ _mesa_texstore(ctx, dims,
+ baseInternalFormat,
+ MESA_FORMAT_R8G8B8A8_UNORM,
+ rgbaRowStride, tempImageSlices,
+ srcWidth, srcHeight, srcDepth,
+ srcFormat, srcType, srcAddr,
+ srcPacking);
pixels = tempImage;
}
else {
@@ -297,14 +312,19 @@ _mesa_texstore_rgba_dxt5(TEXSTORE_PARAMS)
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGBA/GLubyte */
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- _mesa_get_format_base_format(dstFormat),
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ GLubyte *tempImageSlices[1];
+ int rgbaRowStride = 4 * srcWidth * sizeof(GLubyte);
+ tempImage = malloc(srcWidth * srcHeight * 4 * sizeof(GLubyte));
if (!tempImage)
return GL_FALSE; /* out of memory */
+ tempImageSlices[0] = (GLubyte *) tempImage;
+ _mesa_texstore(ctx, dims,
+ baseInternalFormat,
+ MESA_FORMAT_R8G8B8A8_UNORM,
+ rgbaRowStride, tempImageSlices,
+ srcWidth, srcHeight, srcDepth,
+ srcFormat, srcType, srcAddr,
+ srcPacking);
pixels = tempImage;
}
else {
diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
index 42088bbb59a..470c5393e9e 100644
--- a/src/mesa/main/texstore.c
+++ b/src/mesa/main/texstore.c
@@ -220,135 +220,6 @@ _mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
}
-/**
- * Make a temporary (color) texture image with GLubyte components.
- * Apply all needed pixel unpacking and pixel transfer operations.
- * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
- * Suppose the user specifies GL_LUMINANCE as the internal texture format
- * but the graphics hardware doesn't support luminance textures. So, we might
- * use an RGB hardware format instead.
- * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
- *
- * \param ctx the rendering context
- * \param dims image dimensions: 1, 2 or 3
- * \param logicalBaseFormat basic texture derived from the user's
- * internal texture format value
- * \param textureBaseFormat the actual basic format of the texture
- * \param srcWidth source image width
- * \param srcHeight source image height
- * \param srcDepth source image depth
- * \param srcFormat source image format
- * \param srcType source image type
- * \param srcAddr source image address
- * \param srcPacking source image pixel packing
- * \return resulting image with format = textureBaseFormat and type = GLubyte.
- */
-GLubyte *
-_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims,
- GLenum logicalBaseFormat,
- GLenum textureBaseFormat,
- GLint srcWidth, GLint srcHeight, GLint srcDepth,
- GLenum srcFormat, GLenum srcType,
- const GLvoid *srcAddr,
- const struct gl_pixelstore_attrib *srcPacking)
-{
- GLuint transferOps = ctx->_ImageTransferState;
- const GLint components = _mesa_components_in_format(logicalBaseFormat);
- GLint img, row;
- GLubyte *tempImage, *dst;
-
- ASSERT(dims >= 1 && dims <= 3);
-
- ASSERT(logicalBaseFormat == GL_RGBA ||
- logicalBaseFormat == GL_RGB ||
- logicalBaseFormat == GL_RG ||
- logicalBaseFormat == GL_RED ||
- logicalBaseFormat == GL_LUMINANCE_ALPHA ||
- logicalBaseFormat == GL_LUMINANCE ||
- logicalBaseFormat == GL_ALPHA ||
- logicalBaseFormat == GL_INTENSITY);
-
- ASSERT(textureBaseFormat == GL_RGBA ||
- textureBaseFormat == GL_RGB ||
- textureBaseFormat == GL_RG ||
- textureBaseFormat == GL_RED ||
- textureBaseFormat == GL_LUMINANCE_ALPHA ||
- textureBaseFormat == GL_LUMINANCE ||
- textureBaseFormat == GL_ALPHA ||
- textureBaseFormat == GL_INTENSITY);
-
- /* unpack and transfer the source image */
- tempImage = malloc(srcWidth * srcHeight * srcDepth
- * components * sizeof(GLubyte));
- if (!tempImage) {
- return NULL;
- }
-
- dst = tempImage;
- for (img = 0; img < srcDepth; img++) {
- const GLint srcStride =
- _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
- const GLubyte *src =
- (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
- srcWidth, srcHeight,
- srcFormat, srcType,
- img, 0, 0);
- for (row = 0; row < srcHeight; row++) {
- _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst,
- srcFormat, srcType, src, srcPacking,
- transferOps);
- dst += srcWidth * components;
- src += srcStride;
- }
- }
-
- if (logicalBaseFormat != textureBaseFormat) {
- /* one more conversion step */
- GLint texComponents = _mesa_components_in_format(textureBaseFormat);
- GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
- GLubyte *newImage;
- GLint i, n;
- GLubyte map[6];
-
- /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
- ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
- textureBaseFormat == GL_LUMINANCE_ALPHA);
-
- /* The actual texture format should have at least as many components
- * as the logical texture format.
- */
- ASSERT(texComponents >= logComponents);
-
- newImage = malloc(srcWidth * srcHeight * srcDepth
- * texComponents * sizeof(GLubyte));
- if (!newImage) {
- free(tempImage);
- return NULL;
- }
-
- _mesa_compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
-
- n = srcWidth * srcHeight * srcDepth;
- for (i = 0; i < n; i++) {
- GLint k;
- for (k = 0; k < texComponents; k++) {
- GLint j = map[k];
- if (j == ZERO)
- newImage[i * texComponents + k] = 0;
- else if (j == ONE)
- newImage[i * texComponents + k] = 255;
- else
- newImage[i * texComponents + k] = tempImage[i * logComponents + j];
- }
- }
-
- free(tempImage);
- tempImage = newImage;
- }
-
- return tempImage;
-}
-
static const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
static const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
@@ -963,12 +834,12 @@ texstore_rgba(TEXSTORE_PARAMS)
*/
if (srcFormat == GL_COLOR_INDEX) {
/* Notice that this will already handle byte swapping if necessary */
- tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
- baseInternalFormat,
- GL_RGBA,
- srcWidth, srcHeight, srcDepth,
- srcFormat, srcType, srcAddr,
- srcPacking);
+ tempImage =
+ _mesa_unpack_color_index_to_rgba_ubyte(ctx, dims,
+ srcAddr, srcFormat, srcType,
+ srcWidth, srcHeight, srcDepth,
+ srcPacking,
+ ctx->_ImageTransferState);
if (!tempImage)
return GL_FALSE;
diff --git a/src/mesa/main/texstore.h b/src/mesa/main/texstore.h
index 4c41d1fcd9a..6fb2cb7a345 100644
--- a/src/mesa/main/texstore.h
+++ b/src/mesa/main/texstore.h
@@ -81,15 +81,6 @@ _mesa_texstore_can_use_memcpy(struct gl_context *ctx,
const struct gl_pixelstore_attrib *srcPacking);
-extern GLubyte *
-_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims,
- GLenum logicalBaseFormat,
- GLenum textureBaseFormat,
- GLint srcWidth, GLint srcHeight, GLint srcDepth,
- GLenum srcFormat, GLenum srcType,
- const GLvoid *srcAddr,
- const struct gl_pixelstore_attrib *srcPacking);
-
GLfloat *
_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
GLenum logicalBaseFormat,