#include "main/enums.h"
#include "main/formats.h"
#include "main/glformats.h"
+#include "main/texcompress.h"
#include "main/texgetimage.h"
#include "main/teximage.h"
#include "main/texstore.h"
* Translate Mesa format to Gallium format.
*/
enum pipe_format
-st_mesa_format_to_pipe_format(struct st_context *st, mesa_format mesaFormat)
+st_mesa_format_to_pipe_format(const struct st_context *st, mesa_format mesaFormat)
{
switch (mesaFormat) {
case MESA_FORMAT_A8B8G8R8_UNORM:
pf = st_mesa_format_to_pipe_format(st, i);
if (pf != PIPE_FORMAT_NONE) {
- mesa_format mf = st_pipe_format_to_mesa_format(pf);
+ mesa_format MAYBE_UNUSED mf = st_pipe_format_to_mesa_format(pf);
assert(mf == i);
}
}
/* Test all Gallium formats */
for (i = 1; i < PIPE_FORMAT_COUNT; i++) {
- mesa_format mf = st_pipe_format_to_mesa_format(i);
-
/* ETC formats are translated differently, skip them. */
if (i == PIPE_FORMAT_ETC1_RGB8 && !st->has_etc1)
continue;
+ mesa_format mf = st_pipe_format_to_mesa_format(i);
if (_mesa_is_format_etc2(mf) && !st->has_etc2)
continue;
if (mf != MESA_FORMAT_NONE) {
- enum pipe_format pf = st_mesa_format_to_pipe_format(st, mf);
+ enum pipe_format MAYBE_UNUSED pf =
+ st_mesa_format_to_pipe_format(st, mf);
assert(pf == i);
}
}
#define DEFAULT_RGBA_FORMATS \
- PIPE_FORMAT_B8G8R8A8_UNORM, \
PIPE_FORMAT_R8G8B8A8_UNORM, \
+ PIPE_FORMAT_B8G8R8A8_UNORM, \
PIPE_FORMAT_A8R8G8B8_UNORM, \
PIPE_FORMAT_A8B8G8R8_UNORM, \
0
#define DEFAULT_RGB_FORMATS \
- PIPE_FORMAT_B8G8R8X8_UNORM, \
PIPE_FORMAT_R8G8B8X8_UNORM, \
+ PIPE_FORMAT_B8G8R8X8_UNORM, \
PIPE_FORMAT_X8R8G8B8_UNORM, \
PIPE_FORMAT_X8B8G8R8_UNORM, \
PIPE_FORMAT_B5G6R5_UNORM, \
DEFAULT_RGBA_FORMATS
#define DEFAULT_SRGBA_FORMATS \
- PIPE_FORMAT_B8G8R8A8_SRGB, \
PIPE_FORMAT_R8G8B8A8_SRGB, \
+ PIPE_FORMAT_B8G8R8A8_SRGB, \
PIPE_FORMAT_A8R8G8B8_SRGB, \
PIPE_FORMAT_A8B8G8R8_SRGB, \
0
/* basic Alpha formats */
{
{ GL_ALPHA12, GL_ALPHA16, 0 },
- { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_A8_UNORM,
- DEFAULT_RGBA_FORMATS }
+ { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
+ PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
},
{
{ GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
/* basic Luminance formats */
{
{ GL_LUMINANCE12, GL_LUMINANCE16, 0 },
- { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
+ { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
+ PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
},
{
{ 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
- { PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
+ { PIPE_FORMAT_L8_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGB_FORMATS }
},
/* basic Luminance/Alpha formats */
{
{ GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
GL_LUMINANCE16_ALPHA16, 0},
- { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_L8A8_UNORM,
- DEFAULT_RGBA_FORMATS }
+ { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
+ PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
},
{
{ 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
/* basic Intensity formats */
{
{ GL_INTENSITY12, GL_INTENSITY16, 0 },
- { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
+ { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
+ PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
},
{
{ GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
{
{ GL_ALPHA_INTEGER_EXT,
GL_ALPHA8I_EXT, 0 },
- { PIPE_FORMAT_A8_SINT, 0 }
+ { PIPE_FORMAT_A8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
},
{
{ GL_ALPHA16I_EXT, 0 },
- { PIPE_FORMAT_A16_SINT, 0 }
+ { PIPE_FORMAT_A16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
},
{
{ GL_ALPHA32I_EXT, 0 },
- { PIPE_FORMAT_A32_SINT, 0 }
+ { PIPE_FORMAT_A32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
},
{
{ GL_ALPHA8UI_EXT, 0 },
- { PIPE_FORMAT_A8_UINT, 0 }
+ { PIPE_FORMAT_A8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
},
{
{ GL_ALPHA16UI_EXT, 0 },
- { PIPE_FORMAT_A16_UINT, 0 }
+ { PIPE_FORMAT_A16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
},
{
{ GL_ALPHA32UI_EXT, 0 },
- { PIPE_FORMAT_A32_UINT, 0 }
+ { PIPE_FORMAT_A32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
},
{
{ GL_INTENSITY8I_EXT, 0 },
- { PIPE_FORMAT_I8_SINT, 0 }
+ { PIPE_FORMAT_I8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
},
{
{ GL_INTENSITY16I_EXT, 0 },
- { PIPE_FORMAT_I16_SINT, 0 }
+ { PIPE_FORMAT_I16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
},
{
{ GL_INTENSITY32I_EXT, 0 },
- { PIPE_FORMAT_I32_SINT, 0 }
+ { PIPE_FORMAT_I32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
},
{
{ GL_INTENSITY8UI_EXT, 0 },
- { PIPE_FORMAT_I8_UINT, 0 }
+ { PIPE_FORMAT_I8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
},
{
{ GL_INTENSITY16UI_EXT, 0 },
- { PIPE_FORMAT_I16_UINT, 0 }
+ { PIPE_FORMAT_I16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
},
{
{ GL_INTENSITY32UI_EXT, 0 },
- { PIPE_FORMAT_I32_UINT, 0 }
+ { PIPE_FORMAT_I32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
},
{
{ GL_LUMINANCE8I_EXT, 0 },
- { PIPE_FORMAT_L8_SINT, 0 }
+ { PIPE_FORMAT_L8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
},
{
{ GL_LUMINANCE16I_EXT, 0 },
- { PIPE_FORMAT_L16_SINT, 0 }
+ { PIPE_FORMAT_L16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
},
{
{ GL_LUMINANCE32I_EXT, 0 },
- { PIPE_FORMAT_L32_SINT, 0 }
+ { PIPE_FORMAT_L32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
},
{
{ GL_LUMINANCE_INTEGER_EXT,
GL_LUMINANCE8UI_EXT, 0 },
- { PIPE_FORMAT_L8_UINT, 0 }
+ { PIPE_FORMAT_L8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
},
{
{ GL_LUMINANCE16UI_EXT, 0 },
- { PIPE_FORMAT_L16_UINT, 0 }
+ { PIPE_FORMAT_L16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
},
{
{ GL_LUMINANCE32UI_EXT, 0 },
- { PIPE_FORMAT_L32_UINT, 0 }
+ { PIPE_FORMAT_L32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
},
{
{ GL_LUMINANCE_ALPHA_INTEGER_EXT,
GL_LUMINANCE_ALPHA8I_EXT, 0 },
- { PIPE_FORMAT_L8A8_SINT, 0 }
+ { PIPE_FORMAT_L8A8_SINT, PIPE_FORMAT_R8G8B8A8_SINT, 0 }
},
{
{ GL_LUMINANCE_ALPHA16I_EXT, 0 },
- { PIPE_FORMAT_L16A16_SINT, 0 }
+ { PIPE_FORMAT_L16A16_SINT, PIPE_FORMAT_R16G16B16A16_SINT, 0 }
},
{
{ GL_LUMINANCE_ALPHA32I_EXT, 0 },
- { PIPE_FORMAT_L32A32_SINT, 0 }
+ { PIPE_FORMAT_L32A32_SINT, PIPE_FORMAT_R32G32B32A32_SINT, 0 }
},
{
{ GL_LUMINANCE_ALPHA8UI_EXT, 0 },
- { PIPE_FORMAT_L8A8_UINT, 0 }
+ { PIPE_FORMAT_L8A8_UINT, PIPE_FORMAT_R8G8B8A8_UINT, 0 }
},
{
{ GL_LUMINANCE_ALPHA16UI_EXT, 0 },
- { PIPE_FORMAT_L16A16_UINT, 0 }
+ { PIPE_FORMAT_L16A16_UINT, PIPE_FORMAT_R16G16B16A16_UINT, 0 }
},
{
{ GL_LUMINANCE_ALPHA32UI_EXT, 0 },
- { PIPE_FORMAT_L32A32_UINT, 0 }
+ { PIPE_FORMAT_L32A32_UINT, PIPE_FORMAT_R32G32B32A32_UINT, 0 }
},
{
{ GL_RGB16I_EXT, 0 },
}
if (pFormat == PIPE_FORMAT_NONE) {
+ /* lie about using etc1/etc2 natively if we do decoding tricks */
+ mFormat = _mesa_glenum_to_compressed_format(internalFormat);
+ if ((mFormat == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1) ||
+ (_mesa_is_format_etc2(mFormat) && !st->has_etc2))
+ return mFormat;
+
/* no luck at all */
return MESA_FORMAT_NONE;
}