mesa: Remove _mesa_make_temp_ubyte_image
Now that we have _mesa_format_convert we don't need this. texstore_rgba will use the GL_COLOR_INDEX to RGBA conversion helpers instead and compressed formats that used _mesa_make_temp_ubyte_image to create an ubyte RGBA temporary image can call _mesa_texstore with a RGBA/ubyte dst to achieve the same goal. Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
+6
-135
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user