[Mesa-dev] [PATCH v3 11/28] mesa: Use _mesa_format_convert to implement texstore_rgba.
Jason Ekstrand
jason at jlekstrand.net
Fri Dec 12 11:41:56 PST 2014
On Tue, Dec 9, 2014 at 4:07 AM, Iago Toral Quiroga <itoral at igalia.com>
wrote:
>
> Notice that _mesa_format_convert does not handle byte-swapping scenarios,
> GL_COLOR_INDEX or MESA_FORMAT_YCBCR(_REV), so these must be handled
> separately.
>
> Also, remove all the code that goes unused after using
> _mesa_format_convert.
> ---
> src/mesa/main/texstore.c | 684
> +++++------------------------------------------
> 1 file changed, 71 insertions(+), 613 deletions(-)
>
> diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
> index de9f4df..999a009 100644
> --- a/src/mesa/main/texstore.c
> +++ b/src/mesa/main/texstore.c
> @@ -221,116 +221,6 @@ _mesa_make_temp_float_image(struct gl_context *ctx,
> GLuint dims,
>
>
> /**
> - * Make temporary image with uint pixel values. Used for unsigned
> - * integer-valued textures.
> - */
> -static GLuint *
> -make_temp_uint_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 *tempImage;
> - const GLint components = _mesa_components_in_format(logicalBaseFormat);
> - const GLint srcStride =
> - _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
> - GLuint *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_INTENSITY ||
> - logicalBaseFormat == GL_ALPHA);
> -
> - ASSERT(textureBaseFormat == GL_RGBA ||
> - textureBaseFormat == GL_RGB ||
> - textureBaseFormat == GL_RG ||
> - textureBaseFormat == GL_RED ||
> - textureBaseFormat == GL_LUMINANCE_ALPHA ||
> - textureBaseFormat == GL_LUMINANCE ||
> - textureBaseFormat == GL_INTENSITY ||
> - textureBaseFormat == GL_ALPHA);
> -
> - tempImage = malloc(srcWidth * srcHeight * srcDepth
> - * components * sizeof(GLuint));
> - 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_uint(ctx, srcWidth, logicalBaseFormat,
> - dst, srcFormat, srcType, src,
> - srcPacking);
> - dst += srcWidth * components;
> - src += srcStride;
> - }
> - }
> -
> - if (logicalBaseFormat != textureBaseFormat) {
> - /* more work */
> - GLint texComponents = _mesa_components_in_format(textureBaseFormat);
> - GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
> - GLuint *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(GLuint));
> - 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] = 1;
> - else
> - newImage[i * texComponents + k] = tempImage[i *
> logComponents + j];
> - }
> - }
> -
> - free(tempImage);
> - tempImage = newImage;
> - }
> -
> - return tempImage;
> -}
> -
> -
> -
> -/**
> * 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.
> @@ -518,46 +408,6 @@ memcpy_texture(struct gl_context *ctx,
>
>
> /**
> - * General-case function for storing a color texture images with
> - * components that can be represented with ubytes. Example destination
> - * texture formats are MESA_FORMAT_ARGB888, ARGB4444, RGB565.
> - */
> -static GLboolean
> -store_ubyte_texture(TEXSTORE_PARAMS)
> -{
> - const GLint srcRowStride = srcWidth * 4 * sizeof(GLubyte);
> - GLubyte *tempImage, *src;
> - GLint img;
> -
> - tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
> - baseInternalFormat,
> - GL_RGBA,
> - srcWidth, srcHeight, srcDepth,
> - srcFormat, srcType, srcAddr,
> - srcPacking);
> - if (!tempImage)
> - return GL_FALSE;
> -
> - /* This way we will use the RGB versions of the packing functions and
> it
> - * will work for both RGB and sRGB textures*/
> - dstFormat = _mesa_get_srgb_format_linear(dstFormat);
> -
> - src = tempImage;
> - for (img = 0; img < srcDepth; img++) {
> - _mesa_pack_ubyte_rgba_rect(dstFormat, srcWidth, srcHeight,
> - src, srcRowStride,
> - dstSlices[img], dstRowStride);
> - src += srcHeight * srcRowStride;
> - }
> - free(tempImage);
> -
> - return GL_TRUE;
> -}
> -
> -
> -
> -
> -/**
> * Store a 32-bit integer or float depth component texture image.
> */
> static GLboolean
> @@ -690,56 +540,6 @@ _mesa_texstore_z16(TEXSTORE_PARAMS)
>
>
> /**
> - * Store an rgb565 or rgb565_rev texture image.
> - */
> -static GLboolean
> -_mesa_texstore_rgb565(TEXSTORE_PARAMS)
> -{
> - ASSERT(dstFormat == MESA_FORMAT_B5G6R5_UNORM ||
> - dstFormat == MESA_FORMAT_R5G6B5_UNORM);
> - ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
> -
> - if (!ctx->_ImageTransferState &&
> - !srcPacking->SwapBytes &&
> - baseInternalFormat == GL_RGB &&
> - srcFormat == GL_RGB &&
> - srcType == GL_UNSIGNED_BYTE &&
> - dims == 2) {
> - /* do optimized tex store */
> - const GLint srcRowStride =
> - _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
> - const GLubyte *src = (const GLubyte *)
> - _mesa_image_address(dims, srcPacking, srcAddr, srcWidth,
> srcHeight,
> - srcFormat, srcType, 0, 0, 0);
> - GLubyte *dst = dstSlices[0];
> - GLint row, col;
> - for (row = 0; row < srcHeight; row++) {
> - const GLubyte *srcUB = (const GLubyte *) src;
> - GLushort *dstUS = (GLushort *) dst;
> - /* check for byteswapped format */
> - if (dstFormat == MESA_FORMAT_B5G6R5_UNORM) {
> - for (col = 0; col < srcWidth; col++) {
> - dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2]
> );
> - srcUB += 3;
> - }
> - }
> - else {
> - for (col = 0; col < srcWidth; col++) {
> - dstUS[col] = PACK_COLOR_565( srcUB[2], srcUB[1], srcUB[0]
> );
> - srcUB += 3;
> - }
> - }
> - dst += dstRowStride;
> - src += srcRowStride;
> - }
> - return GL_TRUE;
> - } else {
> - return GL_FALSE;
> - }
> -}
> -
> -
> -/**
> * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
> */
> static GLboolean
> @@ -1047,119 +847,6 @@ _mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS)
> }
>
> static GLboolean
> -_mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS)
> -{
> - const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
> -
> - ASSERT(dstFormat == MESA_FORMAT_B10G10R10A2_UINT);
> - ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
> -
> - {
> - /* general path */
> - const GLuint *tempImage = make_temp_uint_image(ctx, dims,
> - baseInternalFormat,
> - baseFormat,
> - srcWidth, srcHeight,
> - srcDepth, srcFormat,
> - srcType, srcAddr,
> - srcPacking);
> - const GLuint *src = tempImage;
> - GLint img, row, col;
> - GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
> - if (!tempImage)
> - return GL_FALSE;
> - for (img = 0; img < srcDepth; img++) {
> - GLubyte *dstRow = dstSlices[img];
> -
> - for (row = 0; row < srcHeight; row++) {
> - GLuint *dstUI = (GLuint *) dstRow;
> - if (is_unsigned) {
> - for (col = 0; col < srcWidth; col++) {
> - GLushort a,r,g,b;
> - r = MIN2(src[RCOMP], 0x3ff);
> - g = MIN2(src[GCOMP], 0x3ff);
> - b = MIN2(src[BCOMP], 0x3ff);
> - a = MIN2(src[ACOMP], 0x003);
> - dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
> - src += 4;
> - }
> - } else {
> - for (col = 0; col < srcWidth; col++) {
> - GLushort a,r,g,b;
> - r = CLAMP((GLint) src[RCOMP], 0, 0x3ff);
> - g = CLAMP((GLint) src[GCOMP], 0, 0x3ff);
> - b = CLAMP((GLint) src[BCOMP], 0, 0x3ff);
> - a = CLAMP((GLint) src[ACOMP], 0, 0x003);
> - dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
> - src += 4;
> - }
> - }
> - dstRow += dstRowStride;
> - }
> - }
> - free((void *) tempImage);
> - }
> - return GL_TRUE;
> -}
> -
> -static GLboolean
> -_mesa_texstore_abgr2101010_uint(TEXSTORE_PARAMS)
> -{
> - const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
> -
> - ASSERT(dstFormat == MESA_FORMAT_R10G10B10A2_UINT);
> - ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
> -
> - {
> - /* general path */
> - const GLuint *tempImage = make_temp_uint_image(ctx, dims,
> - baseInternalFormat,
> - baseFormat,
> - srcWidth, srcHeight,
> - srcDepth, srcFormat,
> - srcType, srcAddr,
> - srcPacking);
> - const GLuint *src = tempImage;
> - GLint img, row, col;
> - GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
> - if (!tempImage)
> - return GL_FALSE;
> - for (img = 0; img < srcDepth; img++) {
> - GLubyte *dstRow = dstSlices[img];
> -
> - for (row = 0; row < srcHeight; row++) {
> - GLuint *dstUI = (GLuint *) dstRow;
> - if (is_unsigned) {
> - for (col = 0; col < srcWidth; col++) {
> - GLushort a,r,g,b;
> - r = MIN2(src[RCOMP], 0x3ff);
> - g = MIN2(src[GCOMP], 0x3ff);
> - b = MIN2(src[BCOMP], 0x3ff);
> - a = MIN2(src[ACOMP], 0x003);
> - dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r);
> - src += 4;
> - }
> - } else {
> - for (col = 0; col < srcWidth; col++) {
> - GLushort a,r,g,b;
> - r = CLAMP((GLint) src[RCOMP], 0, 0x3ff);
> - g = CLAMP((GLint) src[GCOMP], 0, 0x3ff);
> - b = CLAMP((GLint) src[BCOMP], 0, 0x3ff);
> - a = CLAMP((GLint) src[ACOMP], 0, 0x003);
> - dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r);
> - src += 4;
> - }
> - }
> - dstRow += dstRowStride;
> - }
> - }
> - free((void *) tempImage);
> - }
> - return GL_TRUE;
> -}
> -
> -
> -static GLboolean
> texstore_depth_stencil(TEXSTORE_PARAMS)
> {
> static StoreTexImageFunc table[MESA_FORMAT_COUNT];
> @@ -1248,329 +935,100 @@ texstore_compressed(TEXSTORE_PARAMS)
> srcFormat, srcType, srcAddr, srcPacking);
> }
>
> -static void
> -invert_swizzle(uint8_t dst[4], const uint8_t src[4])
> -{
> - int i, j;
> -
> - dst[0] = MESA_FORMAT_SWIZZLE_NONE;
> - dst[1] = MESA_FORMAT_SWIZZLE_NONE;
> - dst[2] = MESA_FORMAT_SWIZZLE_NONE;
> - dst[3] = MESA_FORMAT_SWIZZLE_NONE;
> -
> - for (i = 0; i < 4; ++i)
> - for (j = 0; j < 4; ++j)
> - if (src[j] == i && dst[i] == MESA_FORMAT_SWIZZLE_NONE)
> - dst[i] = j;
> -}
> -
> -/** Store a texture by per-channel conversions and swizzling.
> - *
> - * This function attempts to perform a texstore operation by doing simple
> - * per-channel conversions and swizzling. This covers a huge chunk of the
> - * texture storage operations that anyone cares about. If this function
> is
> - * incapable of performing the operation, it bails and returns GL_FALSE.
> - */
> static GLboolean
> -texstore_swizzle(TEXSTORE_PARAMS)
> +texstore_rgba(TEXSTORE_PARAMS)
> {
> - const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
> - srcFormat, srcType);
> - const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
> - srcWidth, srcHeight, srcFormat,
> srcType);
> - const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dims,
> - srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0,
> 0, 0);
> - const int src_components = _mesa_components_in_format(srcFormat);
> -
> - GLubyte swizzle[4], rgba2base[6], base2src[6], rgba2dst[4],
> dst2rgba[4];
> - const GLubyte *swap;
> - GLenum dst_type;
> - int dst_components;
> - bool is_array, normalized, need_swap;
> - GLint i, img, row;
> - const GLubyte *src_row;
> - GLubyte *dst_row;
> -
> - is_array = _mesa_format_to_array(dstFormat, &dst_type, &dst_components,
> - rgba2dst, &normalized);
> -
> - if (!is_array)
> - return GL_FALSE;
> -
> - if (srcFormat == GL_COLOR_INDEX)
> - return GL_FALSE;
> -
> - if (_mesa_texstore_needs_transfer_ops(ctx, baseInternalFormat,
> dstFormat))
> - return GL_FALSE;
> -
> - switch (srcType) {
> - case GL_FLOAT:
> - case GL_UNSIGNED_BYTE:
> - case GL_BYTE:
> - case GL_UNSIGNED_SHORT:
> - case GL_SHORT:
> - case GL_UNSIGNED_INT:
> - case GL_INT:
> - /* If wa have to swap bytes in a multi-byte datatype, that means
> - * we're not doing an array conversion anymore */
> - if (srcPacking->SwapBytes)
> - return GL_FALSE;
> - need_swap = false;
> - break;
> - case GL_UNSIGNED_INT_8_8_8_8:
> - need_swap = srcPacking->SwapBytes;
> - if (_mesa_little_endian())
> - need_swap = !need_swap;
> - srcType = GL_UNSIGNED_BYTE;
> - break;
> - case GL_UNSIGNED_INT_8_8_8_8_REV:
> - need_swap = srcPacking->SwapBytes;
> - if (!_mesa_little_endian())
> - need_swap = !need_swap;
> - srcType = GL_UNSIGNED_BYTE;
> - break;
> - default:
> - return GL_FALSE;
> - }
> - swap = need_swap ? map_3210 : map_identity;
> -
> - _mesa_compute_component_mapping(srcFormat, baseInternalFormat,
> base2src);
> - _mesa_compute_component_mapping(baseInternalFormat, GL_RGBA,
> rgba2base);
> - invert_swizzle(dst2rgba, rgba2dst);
> -
> - for (i = 0; i < 4; i++) {
> - if (dst2rgba[i] == MESA_FORMAT_SWIZZLE_NONE)
> - swizzle[i] = MESA_FORMAT_SWIZZLE_NONE;
> - else
> - swizzle[i] = swap[base2src[rgba2base[dst2rgba[i]]]];
> - }
> -
> - /* Is it normalized? */
> - normalized |= !_mesa_is_enum_format_integer(srcFormat);
> -
> - for (img = 0; img < srcDepth; img++) {
> - if (dstRowStride == srcWidth * dst_components &&
> - srcRowStride == srcWidth * src_components) {
> - _mesa_swizzle_and_convert(dstSlices[img], dst_type,
> dst_components,
> - srcImage, srcType, src_components,
> - swizzle, normalized, srcWidth *
> srcHeight);
> - } else {
> - src_row = srcImage;
> - dst_row = dstSlices[img];
> - for (row = 0; row < srcHeight; row++) {
> - _mesa_swizzle_and_convert(dst_row, dst_type, dst_components,
> - src_row, srcType, src_components,
> - swizzle, normalized, srcWidth);
> - dst_row += dstRowStride;
> - src_row += srcRowStride;
> - }
> - }
> - srcImage += srcImageStride;
> + void *tempImage = NULL;
> + int srcRowStride, img;
> + GLubyte *src;
> + uint32_t srcMesaFormat;
> + uint8_t rebaseSwizzle[4];
> + bool needRebase;
> +
> + /* We have to handle MESA_FORMAT_YCBCR manually because it is a
> special case
> + * and _mesa_format_convert does not support it. In this case the we
> only
> + * allow conversions between YCBCR formats and it is mostly a memcpy.
> + */
> + if (dstFormat == MESA_FORMAT_YCBCR || dstFormat ==
> MESA_FORMAT_YCBCR_REV) {
> + return _mesa_texstore_ycbcr(ctx, dims, baseInternalFormat,
> + dstFormat, dstRowStride, dstSlices,
> + srcWidth, srcHeight, srcDepth,
> + srcFormat, srcType, srcAddr,
> + srcPacking);
> }
>
> - return GL_TRUE;
> -}
> -
> -
> -/** Stores a texture by converting float and then to the texture format
> - *
> - * This function performs a texstore operation by converting to float,
> - * applying pixel transfer ops, and then converting to the texture's
> - * internal format using pixel store functions. This function will work
> - * for any rgb or srgb textore format.
> - */
> -static GLboolean
> -texstore_via_float(TEXSTORE_PARAMS)
> -{
> - GLuint i, img, row;
> - const GLint src_stride =
> - _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
> - float *tmp_row;
> - bool need_convert;
> - uint8_t *src_row, *dst_row, map[4], rgba2base[6], base2rgba[6];
> -
> - tmp_row = malloc(srcWidth * 4 * sizeof(*tmp_row));
> - if (!tmp_row)
> - return GL_FALSE;
> -
> - /* The GL spec (4.0, compatibility profile) only specifies srgb
> - * conversion as something that is done in the sampler during the
> - * filtering process before the colors are handed to the shader.
> - * Furthermore, the flowchart (Figure 3.7 in the 4.0 compatibility
> spec)
> - * does not list RGB <-> sRGB conversions anywhere. Therefore, we just
> - * treat sRGB formats the same as RGB formats for the purposes of
> - * texture upload and transfer ops.
> + /* We have to deal with GL_COLOR_INDEX manually because
> + * _mesa_format_convert does not handle this format. So what we do
> here is
> + * convert it to RGBA ubyte first and then convert from that to dst as
> usual.
> */
> - dstFormat = _mesa_get_srgb_format_linear(dstFormat);
> -
> - need_convert = false;
> - if (baseInternalFormat != _mesa_get_format_base_format(dstFormat)) {
> - _mesa_compute_component_mapping(GL_RGBA, baseInternalFormat,
> base2rgba);
> - _mesa_compute_component_mapping(baseInternalFormat, GL_RGBA,
> rgba2base);
> - for (i = 0; i < 4; ++i) {
> - map[i] = base2rgba[rgba2base[i]];
> - if (map[i] != i)
> - need_convert = true;
> - }
> - }
> + 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);
> + if (!tempImage)
> + return GL_FALSE;
>
> - for (img = 0; img < srcDepth; img++) {
> - dst_row = dstSlices[img];
> - src_row = _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, GL_RGBA, tmp_row,
> - srcFormat, srcType, src_row,
> - srcPacking,
> ctx->_ImageTransferState);
> - if (need_convert)
> - _mesa_swizzle_and_convert(tmp_row, GL_FLOAT, 4,
> - tmp_row, GL_FLOAT, 4,
> - map, false, srcWidth);
> - _mesa_pack_float_rgba_row(dstFormat, srcWidth,
> - (const GLfloat (*)[4])tmp_row,
> - dst_row);
> - dst_row += dstRowStride;
> - src_row += src_stride;
> + /* Now we only have to adjust our src info for a conversion from
> + * the RGBA ubyte and then we continue as usual.
> + */
> + srcAddr = tempImage;
> + srcFormat = GL_RGBA;
> + srcType = GL_UNSIGNED_BYTE;
> + } else if (srcPacking->SwapBytes) {
> + /* We have to handle byte-swapping scenarios before calling
> + * _mesa_format_convert
> + */
> + GLint swapSize = _mesa_sizeof_packed_type(srcType);
> + if (swapSize == 2 || swapSize == 4) {
> + int components = _mesa_components_in_format(srcFormat);
> + int elementCount = srcWidth * srcHeight * components;
> + tempImage = malloc(elementCount * swapSize);
> + if (!tempImage)
> + return GL_FALSE;
> + if (swapSize == 2)
> + _mesa_swap2_copy(tempImage, (GLushort *) srcAddr,
> elementCount);
> + else
> + _mesa_swap4_copy(tempImage, (GLuint *) srcAddr, elementCount);
> + srcAddr = tempImage;
> }
> }
>
> - free(tmp_row);
> -
> - return GL_TRUE;
> -}
> -
> -/** Stores an integer rgba texture
> - *
> - * This function performs an integer texture storage operation by
> unpacking
> - * the texture to 32-bit integers, and repacking it into the internal
> - * format of the texture. This will work for any integer rgb texture
> - * storage operation.
> - */
> -static GLboolean
> -texstore_rgba_integer(TEXSTORE_PARAMS)
> -{
> - GLuint i, img, row, *tmp_row;
> - GLenum dst_type, tmp_type;
> - const GLint src_stride =
> + srcRowStride =
> _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
> - int num_dst_components;
> - bool is_array, normalized;
> - uint8_t *src_row, *dst_row;
> - uint8_t swizzle[4], rgba2base[6], base2rgba[6], rgba2dst[4],
> dst2rgba[4];
> -
> - tmp_row = malloc(srcWidth * 4 * sizeof(*tmp_row));
> - if (!tmp_row)
> - return GL_FALSE;
> -
> - is_array = _mesa_format_to_array(dstFormat, &dst_type,
> &num_dst_components,
> - rgba2dst, &normalized);
> -
> - assert(is_array && !normalized);
>
> - if (!is_array) {
> - free(tmp_row);
> - return GL_FALSE;
> - }
> -
> - invert_swizzle(dst2rgba, rgba2dst);
> - _mesa_compute_component_mapping(GL_RGBA, baseInternalFormat,
> base2rgba);
> - _mesa_compute_component_mapping(baseInternalFormat, GL_RGBA,
> rgba2base);
> + src = (GLubyte *)
> + _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
> + srcFormat, srcType, 0, 0, 0);
>
> - for (i = 0; i < 4; ++i) {
> - if (dst2rgba[i] == MESA_FORMAT_SWIZZLE_NONE)
> - swizzle[i] = MESA_FORMAT_SWIZZLE_NONE;
> - else
> - swizzle[i] = base2rgba[rgba2base[dst2rgba[i]]];
> - }
> + srcMesaFormat = _mesa_format_from_format_and_type(srcFormat, srcType);
> + dstFormat = _mesa_get_srgb_format_linear(dstFormat);
>
> - if (_mesa_is_type_unsigned(srcType)) {
> - tmp_type = GL_UNSIGNED_INT;
> + if (_mesa_get_format_base_format(dstFormat) != baseInternalFormat) {
> + needRebase =
> +
> _mesa_compute_rgba2base2rgba_component_mapping(baseInternalFormat,
> + rebaseSwizzle);
> } else {
> - tmp_type = GL_INT;
> + needRebase = false;
> }
>
> for (img = 0; img < srcDepth; img++) {
> - dst_row = dstSlices[img];
> - src_row = _mesa_image_address(dims, srcPacking, srcAddr,
> - srcWidth, srcHeight,
> - srcFormat, srcType,
> - img, 0, 0);
> - for (row = 0; row < srcHeight; row++) {
> - _mesa_unpack_color_span_uint(ctx, srcWidth, GL_RGBA, tmp_row,
> - srcFormat, srcType, src_row,
> srcPacking);
> - _mesa_swizzle_and_convert(dst_row, dst_type, num_dst_components,
> - tmp_row, tmp_type, 4,
> - swizzle, false, srcWidth);
> - dst_row += dstRowStride;
> - src_row += src_stride;
> - }
> + _mesa_format_convert(dstSlices[img], dstFormat, dstRowStride,
> + src, srcMesaFormat, srcRowStride,
> + srcWidth, srcHeight,
> + needRebase ? rebaseSwizzle : NULL);
> + src += srcHeight * srcRowStride;
> }
>
> - free(tmp_row);
> + if (tempImage)
> + free(tempImage);
>
Don't need the if check here. Otherwise,
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
> return GL_TRUE;
> }
>
> -static GLboolean
> -texstore_rgba(TEXSTORE_PARAMS)
> -{
> - static StoreTexImageFunc table[MESA_FORMAT_COUNT];
> - static GLboolean initialized = GL_FALSE;
> -
> - if (!initialized) {
> - memset(table, 0, sizeof table);
> -
> - table[MESA_FORMAT_B5G6R5_UNORM] = _mesa_texstore_rgb565;
> - table[MESA_FORMAT_R5G6B5_UNORM] = _mesa_texstore_rgb565;
> - table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr;
> - table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr;
> -
> - table[MESA_FORMAT_B10G10R10A2_UINT] =
> _mesa_texstore_argb2101010_uint;
> - table[MESA_FORMAT_R10G10B10A2_UINT] =
> _mesa_texstore_abgr2101010_uint;
> -
> - initialized = GL_TRUE;
> - }
> -
> - if (table[dstFormat] && table[dstFormat](ctx, dims, baseInternalFormat,
> - dstFormat, dstRowStride,
> dstSlices,
> - srcWidth, srcHeight, srcDepth,
> - srcFormat, srcType, srcAddr,
> - srcPacking)) {
> - return GL_TRUE;
> - }
> -
> - if (texstore_swizzle(ctx, dims, baseInternalFormat,
> - dstFormat,
> - dstRowStride, dstSlices,
> - srcWidth, srcHeight, srcDepth,
> - srcFormat, srcType, srcAddr, srcPacking)) {
> - return GL_TRUE;
> - }
> -
> - if (_mesa_is_format_integer(dstFormat)) {
> - return texstore_rgba_integer(ctx, dims, baseInternalFormat,
> - dstFormat, dstRowStride, dstSlices,
> - srcWidth, srcHeight, srcDepth,
> - srcFormat, srcType, srcAddr,
> - srcPacking);
> - } else if (_mesa_get_format_max_bits(dstFormat) <= 8 &&
> - !_mesa_is_format_signed(dstFormat)) {
> - return store_ubyte_texture(ctx, dims, baseInternalFormat,
> - dstFormat,
> - dstRowStride, dstSlices,
> - srcWidth, srcHeight, srcDepth,
> - srcFormat, srcType, srcAddr, srcPacking);
> - } else {
> - return texstore_via_float(ctx, dims, baseInternalFormat,
> - dstFormat, dstRowStride, dstSlices,
> - srcWidth, srcHeight, srcDepth,
> - srcFormat, srcType, srcAddr,
> - srcPacking);
> - }
> -}
> -
> GLboolean
> _mesa_texstore_needs_transfer_ops(struct gl_context *ctx,
> GLenum baseInternalFormat,
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141212/22503730/attachment-0001.html>
More information about the mesa-dev
mailing list