mesa: Remove _mesa_make_temp_float_image
Now that we have _mesa_format_convert we don't need this. This was only used to create temporary RGBA float images in the process of storing some compressed formats. These can call _mesa_texstore with a RGBA/float dst to achieve the same goal. Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
parent
4468386a3c
commit
c540800aa5
|
@ -1587,7 +1587,6 @@ texstore_bptc_rgb_float(TEXSTORE_PARAMS,
|
||||||
{
|
{
|
||||||
const float *pixels;
|
const float *pixels;
|
||||||
const float *tempImage = NULL;
|
const float *tempImage = NULL;
|
||||||
GLenum baseFormat;
|
|
||||||
int rowstride;
|
int rowstride;
|
||||||
|
|
||||||
if (srcFormat != GL_RGB ||
|
if (srcFormat != GL_RGB ||
|
||||||
|
@ -1595,16 +1594,19 @@ texstore_bptc_rgb_float(TEXSTORE_PARAMS,
|
||||||
ctx->_ImageTransferState ||
|
ctx->_ImageTransferState ||
|
||||||
srcPacking->SwapBytes) {
|
srcPacking->SwapBytes) {
|
||||||
/* convert image to RGB/float */
|
/* convert image to RGB/float */
|
||||||
baseFormat = _mesa_get_format_base_format(dstFormat);
|
GLfloat *tempImageSlices[1];
|
||||||
tempImage = _mesa_make_temp_float_image(ctx, dims,
|
int rgbRowStride = 3 * srcWidth * sizeof(GLfloat);
|
||||||
baseInternalFormat,
|
tempImage = malloc(srcWidth * srcHeight * 3 * sizeof(GLfloat));
|
||||||
baseFormat,
|
|
||||||
srcWidth, srcHeight, srcDepth,
|
|
||||||
srcFormat, srcType, srcAddr,
|
|
||||||
srcPacking,
|
|
||||||
ctx->_ImageTransferState);
|
|
||||||
if (!tempImage)
|
if (!tempImage)
|
||||||
return GL_FALSE; /* out of memory */
|
return GL_FALSE; /* out of memory */
|
||||||
|
tempImageSlices[0] = (GLfloat *) tempImage;
|
||||||
|
_mesa_texstore(ctx, dims,
|
||||||
|
baseInternalFormat,
|
||||||
|
MESA_FORMAT_RGB_FLOAT32,
|
||||||
|
rgbRowStride, (GLubyte **)tempImageSlices,
|
||||||
|
srcWidth, srcHeight, srcDepth,
|
||||||
|
srcFormat, srcType, srcAddr,
|
||||||
|
srcPacking);
|
||||||
|
|
||||||
pixels = tempImage;
|
pixels = tempImage;
|
||||||
rowstride = srcWidth * sizeof(float) * 3;
|
rowstride = srcWidth * sizeof(float) * 3;
|
||||||
|
|
|
@ -136,18 +136,24 @@ _mesa_texstore_signed_red_rgtc1(TEXSTORE_PARAMS)
|
||||||
const GLfloat *srcaddr;
|
const GLfloat *srcaddr;
|
||||||
GLbyte srcpixels[4][4];
|
GLbyte srcpixels[4][4];
|
||||||
GLbyte *blkaddr;
|
GLbyte *blkaddr;
|
||||||
GLint dstRowDiff;
|
GLint dstRowDiff, redRowStride;
|
||||||
|
GLfloat *tempImageSlices[1];
|
||||||
|
|
||||||
ASSERT(dstFormat == MESA_FORMAT_R_RGTC1_SNORM ||
|
ASSERT(dstFormat == MESA_FORMAT_R_RGTC1_SNORM ||
|
||||||
dstFormat == MESA_FORMAT_L_LATC1_SNORM);
|
dstFormat == MESA_FORMAT_L_LATC1_SNORM);
|
||||||
|
|
||||||
tempImage = _mesa_make_temp_float_image(ctx, dims,
|
redRowStride = 1 * srcWidth * sizeof(GLfloat);
|
||||||
baseInternalFormat,
|
tempImage = malloc(srcWidth * srcHeight * 1 * sizeof(GLfloat));
|
||||||
_mesa_get_format_base_format(dstFormat),
|
|
||||||
srcWidth, srcHeight, srcDepth,
|
|
||||||
srcFormat, srcType, srcAddr,
|
|
||||||
srcPacking, 0x0);
|
|
||||||
if (!tempImage)
|
if (!tempImage)
|
||||||
return GL_FALSE; /* out of memory */
|
return GL_FALSE; /* out of memory */
|
||||||
|
tempImageSlices[0] = (GLfloat *) tempImage;
|
||||||
|
_mesa_texstore(ctx, dims,
|
||||||
|
baseInternalFormat,
|
||||||
|
MESA_FORMAT_R_FLOAT32,
|
||||||
|
redRowStride, (GLubyte **)tempImageSlices,
|
||||||
|
srcWidth, srcHeight, srcDepth,
|
||||||
|
srcFormat, srcType, srcAddr,
|
||||||
|
srcPacking);
|
||||||
|
|
||||||
dst = (GLbyte *) dstSlices[0];
|
dst = (GLbyte *) dstSlices[0];
|
||||||
|
|
||||||
|
@ -248,19 +254,30 @@ _mesa_texstore_signed_rg_rgtc2(TEXSTORE_PARAMS)
|
||||||
const GLfloat *srcaddr;
|
const GLfloat *srcaddr;
|
||||||
GLbyte srcpixels[4][4];
|
GLbyte srcpixels[4][4];
|
||||||
GLbyte *blkaddr;
|
GLbyte *blkaddr;
|
||||||
GLint dstRowDiff;
|
GLint dstRowDiff, rgRowStride;
|
||||||
|
mesa_format tempFormat;
|
||||||
|
GLfloat *tempImageSlices[1];
|
||||||
|
|
||||||
ASSERT(dstFormat == MESA_FORMAT_RG_RGTC2_SNORM ||
|
ASSERT(dstFormat == MESA_FORMAT_RG_RGTC2_SNORM ||
|
||||||
dstFormat == MESA_FORMAT_LA_LATC2_SNORM);
|
dstFormat == MESA_FORMAT_LA_LATC2_SNORM);
|
||||||
|
|
||||||
tempImage = _mesa_make_temp_float_image(ctx, dims,
|
if (baseInternalFormat == GL_RG)
|
||||||
baseInternalFormat,
|
tempFormat = MESA_FORMAT_RG_FLOAT32;
|
||||||
_mesa_get_format_base_format(dstFormat),
|
else
|
||||||
srcWidth, srcHeight, srcDepth,
|
tempFormat = MESA_FORMAT_LA_FLOAT32;
|
||||||
srcFormat, srcType, srcAddr,
|
|
||||||
srcPacking, 0x0);
|
rgRowStride = 2 * srcWidth * sizeof(GLfloat);
|
||||||
|
tempImage = malloc(srcWidth * srcHeight * 2 * sizeof(GLfloat));
|
||||||
if (!tempImage)
|
if (!tempImage)
|
||||||
return GL_FALSE; /* out of memory */
|
return GL_FALSE; /* out of memory */
|
||||||
|
tempImageSlices[0] = (GLfloat *) tempImage;
|
||||||
|
_mesa_texstore(ctx, dims,
|
||||||
|
baseInternalFormat,
|
||||||
|
tempFormat,
|
||||||
|
rgRowStride, (GLubyte **)tempImageSlices,
|
||||||
|
srcWidth, srcHeight, srcDepth,
|
||||||
|
srcFormat, srcType, srcAddr,
|
||||||
|
srcPacking);
|
||||||
|
|
||||||
dst = (GLbyte *) dstSlices[0];
|
dst = (GLbyte *) dstSlices[0];
|
||||||
|
|
||||||
|
|
|
@ -87,140 +87,6 @@ enum {
|
||||||
* Texture image storage function.
|
* Texture image storage function.
|
||||||
*/
|
*/
|
||||||
typedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
|
typedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make a temporary (color) texture image with GLfloat 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 = GLfloat.
|
|
||||||
*/
|
|
||||||
GLfloat *
|
|
||||||
_mesa_make_temp_float_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,
|
|
||||||
GLbitfield transferOps)
|
|
||||||
{
|
|
||||||
GLfloat *tempImage;
|
|
||||||
const GLint components = _mesa_components_in_format(logicalBaseFormat);
|
|
||||||
const GLint srcStride =
|
|
||||||
_mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
|
|
||||||
GLfloat *dst;
|
|
||||||
GLint img, row;
|
|
||||||
|
|
||||||
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 ||
|
|
||||||
logicalBaseFormat == GL_DEPTH_COMPONENT);
|
|
||||||
|
|
||||||
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 ||
|
|
||||||
textureBaseFormat == GL_DEPTH_COMPONENT);
|
|
||||||
|
|
||||||
tempImage = malloc(srcWidth * srcHeight * srcDepth
|
|
||||||
* components * sizeof(GLfloat));
|
|
||||||
if (!tempImage)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
dst = tempImage;
|
|
||||||
for (img = 0; img < srcDepth; img++) {
|
|
||||||
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_float(ctx, srcWidth, logicalBaseFormat,
|
|
||||||
dst, srcFormat, srcType, src,
|
|
||||||
srcPacking, transferOps);
|
|
||||||
dst += srcWidth * components;
|
|
||||||
src += srcStride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (logicalBaseFormat != textureBaseFormat) {
|
|
||||||
/* more work */
|
|
||||||
GLint texComponents = _mesa_components_in_format(textureBaseFormat);
|
|
||||||
GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
|
|
||||||
GLfloat *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(GLfloat));
|
|
||||||
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.0F;
|
|
||||||
else if (j == ONE)
|
|
||||||
newImage[i * texComponents + k] = 1.0F;
|
|
||||||
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_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
|
||||||
static const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
|
static const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
|
||||||
static const GLubyte map_1032[6] = { 1, 0, 3, 2, ZERO, ONE };
|
static const GLubyte map_1032[6] = { 1, 0, 3, 2, ZERO, ONE };
|
||||||
|
|
|
@ -81,16 +81,6 @@ _mesa_texstore_can_use_memcpy(struct gl_context *ctx,
|
||||||
const struct gl_pixelstore_attrib *srcPacking);
|
const struct gl_pixelstore_attrib *srcPacking);
|
||||||
|
|
||||||
|
|
||||||
GLfloat *
|
|
||||||
_mesa_make_temp_float_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,
|
|
||||||
GLbitfield transferOps);
|
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
_mesa_store_teximage(struct gl_context *ctx,
|
_mesa_store_teximage(struct gl_context *ctx,
|
||||||
GLuint dims,
|
GLuint dims,
|
||||||
|
|
Loading…
Reference in New Issue