mesa/formats: remove compressed formats from matching function
All compressed formats return GL_FALSE and there isn't any evidence to support that this behaviour would change. Remove all switch cases for compressed formats. v2. Since the exhaustive switch is removed, add a gtest to ensure all formats are handled. v3. Ensure that GL_NO_ERROR is set before returning. v4. Fix an arg to _mesa_uncompressed_format_to_type_and_comps(); fix formatting and misc improvements (Chad). Reviewed-by: Chad Versace <chad.versace@intel.com> Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
This commit is contained in:
parent
8e581747d2
commit
26c549e69d
|
@ -91,7 +91,7 @@ do_blit_readpixels(struct gl_context * ctx,
|
|||
|
||||
if (ctx->_ImageTransferState ||
|
||||
!_mesa_format_matches_format_and_type(irb->mt->format, format, type,
|
||||
false)) {
|
||||
false, NULL)) {
|
||||
DBG("%s - bad format for blit\n", __func__);
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -134,7 +134,7 @@ try_pbo_upload(struct gl_context *ctx,
|
|||
}
|
||||
|
||||
if (!_mesa_format_matches_format_and_type(intelImage->mt->format,
|
||||
format, type, false)) {
|
||||
format, type, false, NULL)) {
|
||||
DBG("%s: format mismatch (upload to %s with format 0x%x, type 0x%x)\n",
|
||||
__func__, _mesa_get_format_name(intelImage->mt->format),
|
||||
format, type);
|
||||
|
|
|
@ -1420,20 +1420,26 @@ _mesa_uncompressed_format_to_type_and_comps(mesa_format format,
|
|||
* \param format the user-specified image format
|
||||
* \param type the user-specified image datatype
|
||||
* \param swapBytes typically the current pixel pack/unpack byteswap state
|
||||
* \param[out] error GL_NO_ERROR if format is an expected input.
|
||||
* GL_INVALID_ENUM if format is an unexpected input.
|
||||
* \return GL_TRUE if the formats match, GL_FALSE otherwise.
|
||||
*/
|
||||
GLboolean
|
||||
_mesa_format_matches_format_and_type(mesa_format mesa_format,
|
||||
GLenum format, GLenum type,
|
||||
GLboolean swapBytes)
|
||||
GLboolean swapBytes, GLenum *error)
|
||||
{
|
||||
const GLboolean littleEndian = _mesa_little_endian();
|
||||
if (error)
|
||||
*error = GL_NO_ERROR;
|
||||
|
||||
/* Note: When reading a GL format/type combination, the format lists channel
|
||||
* assignments from most significant channel in the type to least
|
||||
* significant. A type with _REV indicates that the assignments are
|
||||
* swapped, so they are listed from least significant to most significant.
|
||||
*
|
||||
* Compressed formats will fall through and return GL_FALSE.
|
||||
*
|
||||
* For sanity, please keep this switch statement ordered the same as the
|
||||
* enums in formats.h.
|
||||
*/
|
||||
|
@ -1694,26 +1700,6 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format,
|
|||
case MESA_FORMAT_S_UINT8:
|
||||
return format == GL_STENCIL_INDEX && type == GL_UNSIGNED_BYTE;
|
||||
|
||||
case MESA_FORMAT_SRGB_DXT1:
|
||||
case MESA_FORMAT_SRGBA_DXT1:
|
||||
case MESA_FORMAT_SRGBA_DXT3:
|
||||
case MESA_FORMAT_SRGBA_DXT5:
|
||||
return GL_FALSE;
|
||||
|
||||
case MESA_FORMAT_RGB_FXT1:
|
||||
case MESA_FORMAT_RGBA_FXT1:
|
||||
case MESA_FORMAT_RGB_DXT1:
|
||||
case MESA_FORMAT_RGBA_DXT1:
|
||||
case MESA_FORMAT_RGBA_DXT3:
|
||||
case MESA_FORMAT_RGBA_DXT5:
|
||||
return GL_FALSE;
|
||||
|
||||
case MESA_FORMAT_BPTC_RGBA_UNORM:
|
||||
case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
|
||||
case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT:
|
||||
case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
|
||||
return GL_FALSE;
|
||||
|
||||
case MESA_FORMAT_RGBA_FLOAT32:
|
||||
return format == GL_RGBA && type == GL_FLOAT && !swapBytes;
|
||||
case MESA_FORMAT_RGBA_FLOAT16:
|
||||
|
@ -1910,31 +1896,6 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format,
|
|||
return format == GL_RGBA && type == GL_UNSIGNED_SHORT &&
|
||||
!swapBytes;
|
||||
|
||||
case MESA_FORMAT_R_RGTC1_UNORM:
|
||||
case MESA_FORMAT_R_RGTC1_SNORM:
|
||||
case MESA_FORMAT_RG_RGTC2_UNORM:
|
||||
case MESA_FORMAT_RG_RGTC2_SNORM:
|
||||
return GL_FALSE;
|
||||
|
||||
case MESA_FORMAT_L_LATC1_UNORM:
|
||||
case MESA_FORMAT_L_LATC1_SNORM:
|
||||
case MESA_FORMAT_LA_LATC2_UNORM:
|
||||
case MESA_FORMAT_LA_LATC2_SNORM:
|
||||
return GL_FALSE;
|
||||
|
||||
case MESA_FORMAT_ETC1_RGB8:
|
||||
case MESA_FORMAT_ETC2_RGB8:
|
||||
case MESA_FORMAT_ETC2_SRGB8:
|
||||
case MESA_FORMAT_ETC2_RGBA8_EAC:
|
||||
case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
|
||||
case MESA_FORMAT_ETC2_R11_EAC:
|
||||
case MESA_FORMAT_ETC2_RG11_EAC:
|
||||
case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
|
||||
case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
|
||||
case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
|
||||
case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
|
||||
return GL_FALSE;
|
||||
|
||||
case MESA_FORMAT_A_SNORM8:
|
||||
return format == GL_ALPHA && type == GL_BYTE;
|
||||
case MESA_FORMAT_L_SNORM8:
|
||||
|
@ -2017,8 +1978,11 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format,
|
|||
case MESA_FORMAT_B8G8R8X8_SRGB:
|
||||
case MESA_FORMAT_X8R8G8B8_SRGB:
|
||||
return GL_FALSE;
|
||||
default:
|
||||
assert(_mesa_is_format_compressed(format));
|
||||
if (error)
|
||||
*error = GL_INVALID_ENUM;
|
||||
}
|
||||
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -686,7 +686,7 @@ _mesa_format_has_color_component(mesa_format format, int component);
|
|||
GLboolean
|
||||
_mesa_format_matches_format_and_type(mesa_format mesa_format,
|
||||
GLenum format, GLenum type,
|
||||
GLboolean swapBytes);
|
||||
GLboolean swapBytes, GLenum *error);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -201,7 +201,7 @@ readpixels_can_use_memcpy(const struct gl_context *ctx, GLenum format, GLenum ty
|
|||
|
||||
/* The Mesa format must match the input format and type. */
|
||||
if (!_mesa_format_matches_format_and_type(rb->Format, format, type,
|
||||
packing->SwapBytes)) {
|
||||
packing->SwapBytes, NULL)) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -50,11 +50,18 @@ TEST(MesaFormatsTest, FormatTypeAndComps)
|
|||
*/
|
||||
if (!_mesa_is_format_compressed(f)) {
|
||||
GLenum datatype = 0;
|
||||
GLenum error = 0;
|
||||
GLuint comps = 0;
|
||||
_mesa_uncompressed_format_to_type_and_comps(f, &datatype, &comps);
|
||||
|
||||
/* If the datatype is zero, the format was not handled */
|
||||
_mesa_uncompressed_format_to_type_and_comps(f, &datatype, &comps);
|
||||
EXPECT_NE(datatype, (GLenum)0);
|
||||
|
||||
/* If the error isn't NO_ERROR, the format was not handled.
|
||||
* Use an arbitrary GLenum format. */
|
||||
_mesa_format_matches_format_and_type(f, GL_RG, datatype,
|
||||
GL_FALSE, &error);
|
||||
EXPECT_EQ((GLenum)GL_NO_ERROR, error);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -651,7 +651,7 @@ get_tex_memcpy(struct gl_context *ctx,
|
|||
texBaseFormat == texImage->_BaseFormat) {
|
||||
memCopy = _mesa_format_matches_format_and_type(texImage->TexFormat,
|
||||
format, type,
|
||||
ctx->Pack.SwapBytes);
|
||||
ctx->Pack.SwapBytes, NULL);
|
||||
}
|
||||
|
||||
if (depth > 1) {
|
||||
|
|
|
@ -863,7 +863,7 @@ _mesa_texstore_can_use_memcpy(struct gl_context *ctx,
|
|||
|
||||
/* The Mesa format must match the input format and type. */
|
||||
if (!_mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType,
|
||||
srcPacking->SwapBytes)) {
|
||||
srcPacking->SwapBytes, NULL)) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@ st_readpixels(struct gl_context *ctx, GLint x, GLint y,
|
|||
* in which case the memcpy-based fast path will likely be used and
|
||||
* we don't have to blit. */
|
||||
if (_mesa_format_matches_format_and_type(rb->Format, format,
|
||||
type, pack->SwapBytes)) {
|
||||
type, pack->SwapBytes, NULL)) {
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
|
|
|
@ -695,7 +695,7 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
* in which case the memcpy-based fast path will likely be used and
|
||||
* we don't have to blit. */
|
||||
if (_mesa_format_matches_format_and_type(texImage->TexFormat, format,
|
||||
type, unpack->SwapBytes)) {
|
||||
type, unpack->SwapBytes, NULL)) {
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
|
@ -963,7 +963,7 @@ st_GetTexSubImage(struct gl_context * ctx,
|
|||
/* See if the texture format already matches the format and type,
|
||||
* in which case the memcpy-based fast path will be used. */
|
||||
if (_mesa_format_matches_format_and_type(texImage->TexFormat, format,
|
||||
type, ctx->Pack.SwapBytes)) {
|
||||
type, ctx->Pack.SwapBytes, NULL)) {
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
|
@ -1116,7 +1116,7 @@ st_GetTexSubImage(struct gl_context * ctx,
|
|||
|
||||
/* copy/pack data into user buffer */
|
||||
if (_mesa_format_matches_format_and_type(mesa_format, format, type,
|
||||
ctx->Pack.SwapBytes)) {
|
||||
ctx->Pack.SwapBytes, NULL)) {
|
||||
/* memcpy */
|
||||
const uint bytesPerRow = width * util_format_get_blocksize(dst_format);
|
||||
GLuint row, slice;
|
||||
|
|
|
@ -1917,7 +1917,7 @@ st_choose_matching_format(struct st_context *st, unsigned bind,
|
|||
}
|
||||
|
||||
if (_mesa_format_matches_format_and_type(mesa_format, format, type,
|
||||
swapBytes)) {
|
||||
swapBytes, NULL)) {
|
||||
enum pipe_format format =
|
||||
st_mesa_format_to_pipe_format(st, mesa_format);
|
||||
|
||||
|
|
|
@ -242,7 +242,7 @@ fast_draw_rgba_pixels(struct gl_context *ctx, GLint x, GLint y,
|
|||
}
|
||||
|
||||
if (_mesa_format_matches_format_and_type(rb->Format, format, type,
|
||||
ctx->Unpack.SwapBytes)) {
|
||||
ctx->Unpack.SwapBytes, NULL)) {
|
||||
fast_draw_generic_pixels(ctx, rb, x, y, width, height,
|
||||
format, type, &unpack, pixels);
|
||||
return GL_TRUE;
|
||||
|
|
Loading…
Reference in New Issue