X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fformats.c;h=df23af1dd0efe66ff2ae6e9c736b4a39a46b4424;hb=d012e6d8fe2f4f1139af9e47a684960e8cde103e;hp=c0fcf9cd4d78861c45f1de9d59f44ac0842a70aa;hpb=82fff5f3edfd2f6396a872a12d753b2ab90edd7b;p=mesa.git diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c index c0fcf9cd4d7..df23af1dd0e 100644 --- a/src/mesa/main/formats.c +++ b/src/mesa/main/formats.c @@ -27,6 +27,8 @@ #include "imports.h" #include "formats.h" #include "mfeatures.h" +#include "macros.h" +#include "glformats.h" /** @@ -122,6 +124,24 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 0, 0, 0, 0, 0, /* Lum/Int/Index/Depth/StencilBits */ 1, 1, 4 /* BlockWidth/Height,Bytes */ }, + { + MESA_FORMAT_RGBX8888, /* Name */ + "MESA_FORMAT_RGBX8888", /* StrName */ + GL_RGB, /* BaseFormat */ + GL_UNSIGNED_NORMALIZED, /* DataType */ + 8, 8, 8, 0, /* Red/Green/Blue/AlphaBits */ + 0, 0, 0, 0, 0, /* Lum/Int/Index/Depth/StencilBits */ + 1, 1, 4 /* BlockWidth/Height,Bytes */ + }, + { + MESA_FORMAT_RGBX8888_REV, /* Name */ + "MESA_FORMAT_RGBX8888_REV", /* StrName */ + GL_RGB, /* BaseFormat */ + GL_UNSIGNED_NORMALIZED, /* DataType */ + 8, 8, 8, 0, /* Red/Green/Blue/AlphaBits */ + 0, 0, 0, 0, 0, /* Lum/Int/Index/Depth/StencilBits */ + 1, 1, 4 /* BlockWidth/Height,Bytes */ + }, { MESA_FORMAT_XRGB8888, /* Name */ "MESA_FORMAT_XRGB8888", /* StrName */ @@ -357,8 +377,8 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 1 }, { - MESA_FORMAT_RG88, - "MESA_FORMAT_RG88", + MESA_FORMAT_GR88, + "MESA_FORMAT_GR88", GL_RG, GL_UNSIGNED_NORMALIZED, 8, 8, 0, 0, @@ -366,8 +386,8 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 1, 1, 2 }, { - MESA_FORMAT_RG88_REV, - "MESA_FORMAT_RG88_REV", + MESA_FORMAT_RG88, + "MESA_FORMAT_RG88", GL_RG, GL_UNSIGNED_NORMALIZED, 8, 8, 0, 0, @@ -414,7 +434,7 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = MESA_FORMAT_Z24_S8, /* Name */ "MESA_FORMAT_Z24_S8", /* StrName */ GL_DEPTH_STENCIL, /* BaseFormat */ - GL_UNSIGNED_INT, /* DataType */ + GL_UNSIGNED_NORMALIZED, /* DataType */ 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ 0, 0, 0, 24, 8, /* Lum/Int/Index/Depth/StencilBits */ 1, 1, 4 /* BlockWidth/Height,Bytes */ @@ -423,7 +443,7 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = MESA_FORMAT_S8_Z24, /* Name */ "MESA_FORMAT_S8_Z24", /* StrName */ GL_DEPTH_STENCIL, /* BaseFormat */ - GL_UNSIGNED_INT, /* DataType */ + GL_UNSIGNED_NORMALIZED, /* DataType */ 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ 0, 0, 0, 24, 8, /* Lum/Int/Index/Depth/StencilBits */ 1, 1, 4 /* BlockWidth/Height,Bytes */ @@ -432,7 +452,7 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = MESA_FORMAT_Z16, /* Name */ "MESA_FORMAT_Z16", /* StrName */ GL_DEPTH_COMPONENT, /* BaseFormat */ - GL_UNSIGNED_INT, /* DataType */ + GL_UNSIGNED_NORMALIZED, /* DataType */ 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ 0, 0, 0, 16, 0, /* Lum/Int/Index/Depth/StencilBits */ 1, 1, 2 /* BlockWidth/Height,Bytes */ @@ -441,7 +461,7 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = MESA_FORMAT_X8_Z24, /* Name */ "MESA_FORMAT_X8_Z24", /* StrName */ GL_DEPTH_COMPONENT, /* BaseFormat */ - GL_UNSIGNED_INT, /* DataType */ + GL_UNSIGNED_NORMALIZED, /* DataType */ 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ 0, 0, 0, 24, 0, /* Lum/Int/Index/Depth/StencilBits */ 1, 1, 4 /* BlockWidth/Height,Bytes */ @@ -450,7 +470,7 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = MESA_FORMAT_Z24_X8, /* Name */ "MESA_FORMAT_Z24_X8", /* StrName */ GL_DEPTH_COMPONENT, /* BaseFormat */ - GL_UNSIGNED_INT, /* DataType */ + GL_UNSIGNED_NORMALIZED, /* DataType */ 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ 0, 0, 0, 24, 0, /* Lum/Int/Index/Depth/StencilBits */ 1, 1, 4 /* BlockWidth/Height,Bytes */ @@ -459,7 +479,7 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = MESA_FORMAT_Z32, /* Name */ "MESA_FORMAT_Z32", /* StrName */ GL_DEPTH_COMPONENT, /* BaseFormat */ - GL_UNSIGNED_INT, /* DataType */ + GL_UNSIGNED_NORMALIZED, /* DataType */ 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ 0, 0, 0, 32, 0, /* Lum/Int/Index/Depth/StencilBits */ 1, 1, 4 /* BlockWidth/Height,Bytes */ @@ -756,191 +776,569 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = }, /* unnormalized signed int formats */ + /* unnormalized unsigned int formats */ { - MESA_FORMAT_RGBA_INT8, - "MESA_FORMAT_RGBA_INT8", - GL_RGBA, - GL_INT, - 8, 8, 8, 8, + MESA_FORMAT_ALPHA_UINT8, + "MESA_FORMAT_ALPHA_UINT8", + GL_ALPHA, + GL_UNSIGNED_INT, + 0, 0, 0, 8, + 0, 0, 0, 0, 0, + 1, 1, 1 + }, + { + MESA_FORMAT_ALPHA_UINT16, + "MESA_FORMAT_ALPHA_UINT16", + GL_ALPHA, + GL_UNSIGNED_INT, + 0, 0, 0, 16, + 0, 0, 0, 0, 0, + 1, 1, 2 + }, + { + MESA_FORMAT_ALPHA_UINT32, + "MESA_FORMAT_ALPHA_UINT32", + GL_ALPHA, + GL_UNSIGNED_INT, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 1, 1, 4 }, { - MESA_FORMAT_RGBA_INT16, - "MESA_FORMAT_RGBA_INT16", - GL_RGBA, + MESA_FORMAT_ALPHA_INT8, + "MESA_FORMAT_ALPHA_INT8", + GL_ALPHA, GL_INT, - 16, 16, 16, 16, + 0, 0, 0, 8, 0, 0, 0, 0, 0, - 1, 1, 8 + 1, 1, 1 }, { - MESA_FORMAT_RGBA_INT32, - "MESA_FORMAT_RGBA_INT32", - GL_RGBA, + MESA_FORMAT_ALPHA_INT16, + "MESA_FORMAT_ALPHA_INT16", + GL_ALPHA, GL_INT, - 32, 32, 32, 32, + 0, 0, 0, 16, 0, 0, 0, 0, 0, - 1, 1, 16 + 1, 1, 2 }, - - /* unnormalized unsigned int formats */ { - MESA_FORMAT_RGBA_UINT8, - "MESA_FORMAT_RGBA_UINT8", - GL_RGBA, - GL_UNSIGNED_INT, - 8, 8, 8, 8, + MESA_FORMAT_ALPHA_INT32, + "MESA_FORMAT_ALPHA_INT32", + GL_ALPHA, + GL_INT, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 1, 1, 4 }, { - MESA_FORMAT_RGBA_UINT16, - "MESA_FORMAT_RGBA_UINT16", - GL_RGBA, + MESA_FORMAT_INTENSITY_UINT8, + "MESA_FORMAT_INTENSITY_UINT8", + GL_INTENSITY, GL_UNSIGNED_INT, - 16, 16, 16, 16, - 0, 0, 0, 0, 0, - 1, 1, 8 + 0, 0, 0, 0, + 0, 8, 0, 0, 0, + 1, 1, 1 }, { - MESA_FORMAT_RGBA_UINT32, - "MESA_FORMAT_RGBA_UINT32", - GL_RGBA, + MESA_FORMAT_INTENSITY_UINT16, + "MESA_FORMAT_INTENSITY_UINT16", + GL_INTENSITY, GL_UNSIGNED_INT, - 32, 32, 32, 32, - 0, 0, 0, 0, 0, - 1, 1, 16 + 0, 0, 0, 0, + 0, 16, 0, 0, 0, + 1, 1, 2 }, - - { - MESA_FORMAT_DUDV8, - "MESA_FORMAT_DUDV8", - GL_DUDV_ATI, - GL_SIGNED_NORMALIZED, + MESA_FORMAT_INTENSITY_UINT32, + "MESA_FORMAT_INTENSITY_UINT32", + GL_INTENSITY, + GL_UNSIGNED_INT, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 1, 1, 2 + 0, 32, 0, 0, 0, + 1, 1, 4 }, - - /* Signed 8 bits / channel */ { - MESA_FORMAT_SIGNED_R8, /* Name */ - "MESA_FORMAT_SIGNED_R8", /* StrName */ - GL_RED, /* BaseFormat */ - GL_SIGNED_NORMALIZED, /* DataType */ - 8, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ - 0, 0, 0, 0, 0, /* Lum/Int/Index/Depth/StencilBits */ - 1, 1, 1 /* BlockWidth/Height,Bytes */ + MESA_FORMAT_INTENSITY_INT8, + "MESA_FORMAT_INTENSITY_INT8", + GL_INTENSITY, + GL_INT, + 0, 0, 0, 0, + 0, 8, 0, 0, 0, + 1, 1, 1 }, { - MESA_FORMAT_SIGNED_RG88_REV, - "MESA_FORMAT_SIGNED_RG88_REV", - GL_RG, - GL_SIGNED_NORMALIZED, - 8, 8, 0, 0, - 0, 0, 0, 0, 0, + MESA_FORMAT_INTENSITY_INT16, + "MESA_FORMAT_INTENSITY_INT16", + GL_INTENSITY, + GL_INT, + 0, 0, 0, 0, + 0, 16, 0, 0, 0, 1, 1, 2 }, { - MESA_FORMAT_SIGNED_RGBX8888, - "MESA_FORMAT_SIGNED_RGBX8888", - GL_RGB, - GL_SIGNED_NORMALIZED, - 8, 8, 8, 0, - 0, 0, 0, 0, 0, - 1, 1, 4 /* 4 bpp, but no alpha */ + MESA_FORMAT_INTENSITY_INT32, + "MESA_FORMAT_INTENSITY_INT32", + GL_INTENSITY, + GL_INT, + 0, 0, 0, 0, + 0, 32, 0, 0, 0, + 1, 1, 4 }, { - MESA_FORMAT_SIGNED_RGBA8888, - "MESA_FORMAT_SIGNED_RGBA8888", - GL_RGBA, - GL_SIGNED_NORMALIZED, - 8, 8, 8, 8, - 0, 0, 0, 0, 0, - 1, 1, 4 + MESA_FORMAT_LUMINANCE_UINT8, + "MESA_FORMAT_LUMINANCE_UINT8", + GL_LUMINANCE, + GL_UNSIGNED_INT, + 0, 0, 0, 0, + 8, 0, 0, 0, 0, + 1, 1, 1 }, { - MESA_FORMAT_SIGNED_RGBA8888_REV, - "MESA_FORMAT_SIGNED_RGBA8888_REV", - GL_RGBA, - GL_SIGNED_NORMALIZED, - 8, 8, 8, 8, - 0, 0, 0, 0, 0, + MESA_FORMAT_LUMINANCE_UINT16, + "MESA_FORMAT_LUMINANCE_UINT16", + GL_LUMINANCE, + GL_UNSIGNED_INT, + 0, 0, 0, 0, + 16, 0, 0, 0, 0, + 1, 1, 2 + }, + { + MESA_FORMAT_LUMINANCE_UINT32, + "MESA_FORMAT_LUMINANCE_UINT32", + GL_LUMINANCE, + GL_UNSIGNED_INT, + 0, 0, 0, 0, + 32, 0, 0, 0, 0, 1, 1, 4 }, - - /* Signed 16 bits / channel */ { - MESA_FORMAT_SIGNED_R16, - "MESA_FORMAT_SIGNED_R16", - GL_RED, - GL_SIGNED_NORMALIZED, - 16, 0, 0, 0, - 0, 0, 0, 0, 0, + MESA_FORMAT_LUMINANCE_INT8, + "MESA_FORMAT_LUMINANCE_INT8", + GL_LUMINANCE, + GL_INT, + 0, 0, 0, 0, + 8, 0, 0, 0, 0, + 1, 1, 1 + }, + { + MESA_FORMAT_LUMINANCE_INT16, + "MESA_FORMAT_LUMINANCE_INT16", + GL_LUMINANCE, + GL_INT, + 0, 0, 0, 0, + 16, 0, 0, 0, 0, 1, 1, 2 }, { - MESA_FORMAT_SIGNED_GR1616, - "MESA_FORMAT_SIGNED_GR1616", - GL_RG, - GL_SIGNED_NORMALIZED, - 16, 16, 0, 0, - 0, 0, 0, 0, 0, + MESA_FORMAT_LUMINANCE_INT32, + "MESA_FORMAT_LUMINANCE_INT32", + GL_LUMINANCE, + GL_INT, + 0, 0, 0, 0, + 32, 0, 0, 0, 0, 1, 1, 4 }, { - MESA_FORMAT_SIGNED_RGB_16, - "MESA_FORMAT_SIGNED_RGB_16", - GL_RGB, - GL_SIGNED_NORMALIZED, - 16, 16, 16, 0, - 0, 0, 0, 0, 0, - 1, 1, 6 + MESA_FORMAT_LUMINANCE_ALPHA_UINT8, + "MESA_FORMAT_LUMINANCE_ALPHA_UINT8", + GL_LUMINANCE_ALPHA, + GL_UNSIGNED_INT, + 0, 0, 0, 8, + 8, 0, 0, 0, 0, + 1, 1, 2 }, { - MESA_FORMAT_SIGNED_RGBA_16, - "MESA_FORMAT_SIGNED_RGBA_16", - GL_RGBA, - GL_SIGNED_NORMALIZED, - 16, 16, 16, 16, - 0, 0, 0, 0, 0, - 1, 1, 8 + MESA_FORMAT_LUMINANCE_ALPHA_UINT16, + "MESA_FORMAT_LUMINANCE_ALPHA_UINT16", + GL_LUMINANCE_ALPHA, + GL_UNSIGNED_INT, + 0, 0, 0, 16, + 16, 0, 0, 0, 0, + 1, 1, 4 }, { - MESA_FORMAT_RGBA_16, - "MESA_FORMAT_RGBA_16", - GL_RGBA, - GL_UNSIGNED_NORMALIZED, - 16, 16, 16, 16, - 0, 0, 0, 0, 0, + MESA_FORMAT_LUMINANCE_ALPHA_UINT32, + "MESA_FORMAT_LUMINANCE_ALPHA_UINT32", + GL_LUMINANCE_ALPHA, + GL_UNSIGNED_INT, + 0, 0, 0, 32, + 32, 0, 0, 0, 0, 1, 1, 8 }, { - MESA_FORMAT_RED_RGTC1, - "MESA_FORMAT_RED_RGTC1", - GL_RED, - GL_UNSIGNED_NORMALIZED, - 4, 0, 0, 0, - 0, 0, 0, 0, 0, - 4, 4, 8 /* 8 bytes per 4x4 block */ + MESA_FORMAT_LUMINANCE_ALPHA_INT8, + "MESA_FORMAT_LUMINANCE_ALPHA_INT8", + GL_LUMINANCE_ALPHA, + GL_INT, + 0, 0, 0, 8, + 8, 0, 0, 0, 0, + 1, 1, 2 }, { - MESA_FORMAT_SIGNED_RED_RGTC1, - "MESA_FORMAT_SIGNED_RED_RGTC1", - GL_RED, - GL_SIGNED_NORMALIZED, - 4, 0, 0, 0, - 0, 0, 0, 0, 0, - 4, 4, 8 /* 8 bytes per 4x4 block */ + MESA_FORMAT_LUMINANCE_ALPHA_INT16, + "MESA_FORMAT_LUMINANCE_ALPHA_INT16", + GL_LUMINANCE_ALPHA, + GL_INT, + 0, 0, 0, 16, + 16, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_LUMINANCE_ALPHA_INT32, + "MESA_FORMAT_LUMINANCE_ALPHA_INT32", + GL_LUMINANCE_ALPHA, + GL_INT, + 0, 0, 0, 32, + 32, 0, 0, 0, 0, + 1, 1, 8 + }, + + { + MESA_FORMAT_R_INT8, + "MESA_FORMAT_R_INT8", + GL_RED, + GL_INT, + 8, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 1 + }, + { + MESA_FORMAT_RG_INT8, + "MESA_FORMAT_RG_INT8", + GL_RG, + GL_INT, + 8, 8, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 2 + }, + { + MESA_FORMAT_RGB_INT8, + "MESA_FORMAT_RGB_INT8", + GL_RGB, + GL_INT, + 8, 8, 8, 0, + 0, 0, 0, 0, 0, + 1, 1, 3 + }, + { + MESA_FORMAT_RGBA_INT8, + "MESA_FORMAT_RGBA_INT8", + GL_RGBA, + GL_INT, + 8, 8, 8, 8, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_R_INT16, + "MESA_FORMAT_R_INT16", + GL_RED, + GL_INT, + 16, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 2 + }, + { + MESA_FORMAT_RG_INT16, + "MESA_FORMAT_RG_INT16", + GL_RG, + GL_INT, + 16, 16, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_RGB_INT16, + "MESA_FORMAT_RGB_INT16", + GL_RGB, + GL_INT, + 16, 16, 16, 0, + 0, 0, 0, 0, 0, + 1, 1, 6 + }, + { + MESA_FORMAT_RGBA_INT16, + "MESA_FORMAT_RGBA_INT16", + GL_RGBA, + GL_INT, + 16, 16, 16, 16, + 0, 0, 0, 0, 0, + 1, 1, 8 + }, + { + MESA_FORMAT_R_INT32, + "MESA_FORMAT_R_INT32", + GL_RED, + GL_INT, + 32, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_RG_INT32, + "MESA_FORMAT_RG_INT32", + GL_RG, + GL_INT, + 32, 32, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 8 + }, + { + MESA_FORMAT_RGB_INT32, + "MESA_FORMAT_RGB_INT32", + GL_RGB, + GL_INT, + 32, 32, 32, 0, + 0, 0, 0, 0, 0, + 1, 1, 12 + }, + { + MESA_FORMAT_RGBA_INT32, + "MESA_FORMAT_RGBA_INT32", + GL_RGBA, + GL_INT, + 32, 32, 32, 32, + 0, 0, 0, 0, 0, + 1, 1, 16 + }, + { + MESA_FORMAT_R_UINT8, + "MESA_FORMAT_R_UINT8", + GL_RED, + GL_UNSIGNED_INT, + 8, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 1 + }, + { + MESA_FORMAT_RG_UINT8, + "MESA_FORMAT_RG_UINT8", + GL_RG, + GL_UNSIGNED_INT, + 8, 8, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 2 + }, + { + MESA_FORMAT_RGB_UINT8, + "MESA_FORMAT_RGB_UINT8", + GL_RGB, + GL_UNSIGNED_INT, + 8, 8, 8, 0, + 0, 0, 0, 0, 0, + 1, 1, 3 + }, + { + MESA_FORMAT_RGBA_UINT8, + "MESA_FORMAT_RGBA_UINT8", + GL_RGBA, + GL_UNSIGNED_INT, + 8, 8, 8, 8, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_R_UINT16, + "MESA_FORMAT_R_UINT16", + GL_RED, + GL_UNSIGNED_INT, + 16, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 2 + }, + { + MESA_FORMAT_RG_UINT16, + "MESA_FORMAT_RG_UINT16", + GL_RG, + GL_UNSIGNED_INT, + 16, 16, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_RGB_UINT16, + "MESA_FORMAT_RGB_UINT16", + GL_RGB, + GL_UNSIGNED_INT, + 16, 16, 16, 0, + 0, 0, 0, 0, 0, + 1, 1, 6 + }, + { + MESA_FORMAT_RGBA_UINT16, + "MESA_FORMAT_RGBA_UINT16", + GL_RGBA, + GL_UNSIGNED_INT, + 16, 16, 16, 16, + 0, 0, 0, 0, 0, + 1, 1, 8 + }, + { + MESA_FORMAT_R_UINT32, + "MESA_FORMAT_R_UINT32", + GL_RED, + GL_UNSIGNED_INT, + 32, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_RG_UINT32, + "MESA_FORMAT_RG_UINT32", + GL_RG, + GL_UNSIGNED_INT, + 32, 32, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 8 + }, + { + MESA_FORMAT_RGB_UINT32, + "MESA_FORMAT_RGB_UINT32", + GL_RGB, + GL_UNSIGNED_INT, + 32, 32, 32, 0, + 0, 0, 0, 0, 0, + 1, 1, 12 + }, + { + MESA_FORMAT_RGBA_UINT32, + "MESA_FORMAT_RGBA_UINT32", + GL_RGBA, + GL_UNSIGNED_INT, + 32, 32, 32, 32, + 0, 0, 0, 0, 0, + 1, 1, 16 + }, + + + { + MESA_FORMAT_DUDV8, + "MESA_FORMAT_DUDV8", + GL_DUDV_ATI, + GL_SIGNED_NORMALIZED, + 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 2 + }, + + /* Signed 8 bits / channel */ + { + MESA_FORMAT_SIGNED_R8, /* Name */ + "MESA_FORMAT_SIGNED_R8", /* StrName */ + GL_RED, /* BaseFormat */ + GL_SIGNED_NORMALIZED, /* DataType */ + 8, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ + 0, 0, 0, 0, 0, /* Lum/Int/Index/Depth/StencilBits */ + 1, 1, 1 /* BlockWidth/Height,Bytes */ + }, + { + MESA_FORMAT_SIGNED_RG88_REV, + "MESA_FORMAT_SIGNED_RG88_REV", + GL_RG, + GL_SIGNED_NORMALIZED, + 8, 8, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 2 + }, + { + MESA_FORMAT_SIGNED_RGBX8888, + "MESA_FORMAT_SIGNED_RGBX8888", + GL_RGB, + GL_SIGNED_NORMALIZED, + 8, 8, 8, 0, + 0, 0, 0, 0, 0, + 1, 1, 4 /* 4 bpp, but no alpha */ + }, + { + MESA_FORMAT_SIGNED_RGBA8888, + "MESA_FORMAT_SIGNED_RGBA8888", + GL_RGBA, + GL_SIGNED_NORMALIZED, + 8, 8, 8, 8, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_SIGNED_RGBA8888_REV, + "MESA_FORMAT_SIGNED_RGBA8888_REV", + GL_RGBA, + GL_SIGNED_NORMALIZED, + 8, 8, 8, 8, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + + /* Signed 16 bits / channel */ + { + MESA_FORMAT_SIGNED_R16, + "MESA_FORMAT_SIGNED_R16", + GL_RED, + GL_SIGNED_NORMALIZED, + 16, 0, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 2 + }, + { + MESA_FORMAT_SIGNED_GR1616, + "MESA_FORMAT_SIGNED_GR1616", + GL_RG, + GL_SIGNED_NORMALIZED, + 16, 16, 0, 0, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_SIGNED_RGB_16, + "MESA_FORMAT_SIGNED_RGB_16", + GL_RGB, + GL_SIGNED_NORMALIZED, + 16, 16, 16, 0, + 0, 0, 0, 0, 0, + 1, 1, 6 + }, + { + MESA_FORMAT_SIGNED_RGBA_16, + "MESA_FORMAT_SIGNED_RGBA_16", + GL_RGBA, + GL_SIGNED_NORMALIZED, + 16, 16, 16, 16, + 0, 0, 0, 0, 0, + 1, 1, 8 + }, + { + MESA_FORMAT_RGBA_16, + "MESA_FORMAT_RGBA_16", + GL_RGBA, + GL_UNSIGNED_NORMALIZED, + 16, 16, 16, 16, + 0, 0, 0, 0, 0, + 1, 1, 8 + }, + { + MESA_FORMAT_RED_RGTC1, + "MESA_FORMAT_RED_RGTC1", + GL_RED, + GL_UNSIGNED_NORMALIZED, + 8, 0, 0, 0, + 0, 0, 0, 0, 0, + 4, 4, 8 /* 8 bytes per 4x4 block */ + }, + { + MESA_FORMAT_SIGNED_RED_RGTC1, + "MESA_FORMAT_SIGNED_RED_RGTC1", + GL_RED, + GL_SIGNED_NORMALIZED, + 8, 0, 0, 0, + 0, 0, 0, 0, 0, + 4, 4, 8 /* 8 bytes per 4x4 block */ }, { MESA_FORMAT_RG_RGTC2, "MESA_FORMAT_RG_RGTC2", GL_RG, GL_UNSIGNED_NORMALIZED, - 4, 4, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 4, 4, 16 /* 16 bytes per 4x4 block */ }, @@ -949,7 +1347,7 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = "MESA_FORMAT_SIGNED_RG_RGTC2", GL_RG, GL_SIGNED_NORMALIZED, - 4, 4, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 4, 4, 16 /* 16 bytes per 4x4 block */ }, @@ -990,6 +1388,16 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = 4, 4, 16 /* 16 bytes per 4x4 block */ }, + { + MESA_FORMAT_ETC1_RGB8, + "MESA_FORMAT_ETC1_RGB8", + GL_RGB, + GL_UNSIGNED_NORMALIZED, + 8, 8, 8, 0, + 0, 0, 0, 0, 0, + 4, 4, 8 /* 8 bytes per 4x4 block */ + }, + /* Signed formats from EXT_texture_snorm that are not in GL3.1 */ { MESA_FORMAT_SIGNED_A8, @@ -1095,11 +1503,32 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] = MESA_FORMAT_Z32_FLOAT_X24S8, /* Name */ "MESA_FORMAT_Z32_FLOAT_X24S8", /* StrName */ GL_DEPTH_STENCIL, /* BaseFormat */ - GL_NONE /* XXX */, /* DataType */ + /* DataType here is used to answer GL_TEXTURE_DEPTH_TYPE queries, and is + * never used for stencil because stencil is always GL_UNSIGNED_INT. + */ + GL_FLOAT, /* DataType */ 0, 0, 0, 0, /* Red/Green/Blue/AlphaBits */ 0, 0, 0, 32, 8, /* Lum/Int/Index/Depth/StencilBits */ 1, 1, 8 /* BlockWidth/Height,Bytes */ }, + { + MESA_FORMAT_ARGB2101010_UINT, + "MESA_FORMAT_ARGB2101010_UINT", + GL_RGBA, + GL_UNSIGNED_INT, + 10, 10, 10, 2, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, + { + MESA_FORMAT_ABGR2101010_UINT, + "MESA_FORMAT_ABGR2101010_UINT", + GL_RGBA, + GL_UNSIGNED_INT, + 10, 10, 10, 2, + 0, 0, 0, 0, 0, + 1, 1, 4 + }, }; @@ -1135,6 +1564,8 @@ _mesa_get_format_bytes(gl_format format) { const struct gl_format_info *info = _mesa_get_format_info(format); ASSERT(info->BytesPerBlock); + ASSERT(info->BytesPerBlock <= MAX_PIXEL_BYTES || + _mesa_is_format_compressed(format)); return info->BytesPerBlock; } @@ -1175,7 +1606,6 @@ _mesa_get_format_bits(gl_format format, GLenum pname) case GL_TEXTURE_LUMINANCE_SIZE: return info->LuminanceBits; case GL_INDEX_BITS: - case GL_TEXTURE_INDEX_SIZE_EXT: return info->IndexBits; case GL_DEPTH_BITS: case GL_TEXTURE_DEPTH_SIZE_ARB: @@ -1194,6 +1624,21 @@ _mesa_get_format_bits(gl_format format, GLenum pname) } +GLuint +_mesa_get_format_max_bits(gl_format format) +{ + const struct gl_format_info *info = _mesa_get_format_info(format); + GLuint max = MAX2(info->RedBits, info->GreenBits); + max = MAX2(max, info->BlueBits); + max = MAX2(max, info->AlphaBits); + max = MAX2(max, info->LuminanceBits); + max = MAX2(max, info->IntensityBits); + max = MAX2(max, info->DepthBits); + max = MAX2(max, info->StencilBits); + return max; +} + + /** * Return the data type (or more specifically, the data representation) * for the given format. @@ -1276,6 +1721,17 @@ _mesa_is_format_integer_color(gl_format format) } +/** + * Is the given format an unsigned integer format? + */ +GLboolean +_mesa_is_format_unsigned(gl_format format) +{ + const struct gl_format_info *info = _mesa_get_format_info(format); + return _mesa_is_type_unsigned(info->DataType); +} + + /** * Return color encoding for given format. * \return GL_LINEAR or GL_SRGB @@ -1343,6 +1799,72 @@ _mesa_get_srgb_format_linear(gl_format format) } +/** + * If the given format is a compressed format, return a corresponding + * uncompressed format. + */ +gl_format +_mesa_get_uncompressed_format(gl_format format) +{ + switch (format) { + case MESA_FORMAT_RGB_FXT1: + return MESA_FORMAT_RGB888; + case MESA_FORMAT_RGBA_FXT1: + return MESA_FORMAT_RGBA8888; + case MESA_FORMAT_RGB_DXT1: + case MESA_FORMAT_SRGB_DXT1: + return MESA_FORMAT_RGB888; + case MESA_FORMAT_RGBA_DXT1: + case MESA_FORMAT_SRGBA_DXT1: + return MESA_FORMAT_RGBA8888; + case MESA_FORMAT_RGBA_DXT3: + case MESA_FORMAT_SRGBA_DXT3: + return MESA_FORMAT_RGBA8888; + case MESA_FORMAT_RGBA_DXT5: + case MESA_FORMAT_SRGBA_DXT5: + return MESA_FORMAT_RGBA8888; + case MESA_FORMAT_RED_RGTC1: + return MESA_FORMAT_R8; + case MESA_FORMAT_SIGNED_RED_RGTC1: + return MESA_FORMAT_SIGNED_R8; + case MESA_FORMAT_RG_RGTC2: + return MESA_FORMAT_GR88; + case MESA_FORMAT_SIGNED_RG_RGTC2: + return MESA_FORMAT_SIGNED_RG88_REV; + case MESA_FORMAT_L_LATC1: + return MESA_FORMAT_L8; + case MESA_FORMAT_SIGNED_L_LATC1: + return MESA_FORMAT_SIGNED_L8; + case MESA_FORMAT_LA_LATC2: + return MESA_FORMAT_AL88; + case MESA_FORMAT_SIGNED_LA_LATC2: + return MESA_FORMAT_SIGNED_AL88; + case MESA_FORMAT_ETC1_RGB8: + return MESA_FORMAT_RGB888; + default: +#ifdef DEBUG + assert(!_mesa_is_format_compressed(format)); +#endif + return format; + } +} + + +GLuint +_mesa_format_num_components(gl_format format) +{ + const struct gl_format_info *info = _mesa_get_format_info(format); + return ((info->RedBits > 0) + + (info->GreenBits > 0) + + (info->BlueBits > 0) + + (info->AlphaBits > 0) + + (info->LuminanceBits > 0) + + (info->IntensityBits > 0) + + (info->DepthBits > 0) + + (info->StencilBits > 0)); +} + + /** * Return number of bytes needed to store an image of the given size * in the given format. @@ -1359,8 +1881,7 @@ _mesa_format_image_size(gl_format format, GLsizei width, const GLuint wblocks = (width + bw - 1) / bw; const GLuint hblocks = (height + bh - 1) / bh; const GLuint sz = wblocks * hblocks * info->BytesPerBlock; - assert(depth == 1); - return sz; + return sz * depth; } else { /* non-compressed */ @@ -1386,8 +1907,7 @@ _mesa_format_image_size64(gl_format format, GLsizei width, const uint64_t wblocks = (width + bw - 1) / bw; const uint64_t hblocks = (height + bh - 1) / bh; const uint64_t sz = wblocks * hblocks * info->BytesPerBlock; - assert(depth == 1); - return sz; + return sz * depth; } else { /* non-compressed */ @@ -1450,7 +1970,7 @@ _mesa_test_formats(void) { GLuint i; - assert(Elements(format_info) == MESA_FORMAT_COUNT); + STATIC_ASSERT(Elements(format_info) == MESA_FORMAT_COUNT); for (i = 0; i < MESA_FORMAT_COUNT; i++) { const struct gl_format_info *info = _mesa_get_format_info(i); @@ -1546,6 +2066,8 @@ _mesa_format_to_type_and_comps(gl_format format, case MESA_FORMAT_RGBA8888_REV: case MESA_FORMAT_ARGB8888: case MESA_FORMAT_ARGB8888_REV: + case MESA_FORMAT_RGBX8888: + case MESA_FORMAT_RGBX8888_REV: case MESA_FORMAT_XRGB8888: case MESA_FORMAT_XRGB8888_REV: *datatype = GL_UNSIGNED_BYTE; @@ -1591,8 +2113,8 @@ _mesa_format_to_type_and_comps(gl_format format, case MESA_FORMAT_AL88: case MESA_FORMAT_AL88_REV: + case MESA_FORMAT_GR88: case MESA_FORMAT_RG88: - case MESA_FORMAT_RG88_REV: *datatype = GL_UNSIGNED_BYTE; *comps = 2; return; @@ -1634,13 +2156,13 @@ _mesa_format_to_type_and_comps(gl_format format, return; case MESA_FORMAT_Z24_S8: - *datatype = GL_UNSIGNED_INT; - *comps = 1; /* XXX OK? */ + *datatype = GL_UNSIGNED_INT_24_8_MESA; + *comps = 2; return; case MESA_FORMAT_S8_Z24: - *datatype = GL_UNSIGNED_INT; - *comps = 1; /* XXX OK? */ + *datatype = GL_UNSIGNED_INT_8_24_REV_MESA; + *comps = 2; return; case MESA_FORMAT_Z16: @@ -1723,7 +2245,6 @@ _mesa_format_to_type_and_comps(gl_format format, *comps = 4; return; -#if FEATURE_EXT_texture_sRGB case MESA_FORMAT_SRGB8: *datatype = GL_UNSIGNED_BYTE; *comps = 3; @@ -1741,24 +2262,17 @@ _mesa_format_to_type_and_comps(gl_format format, *datatype = GL_UNSIGNED_BYTE; *comps = 2; return; -#endif -#if FEATURE_texture_fxt1 case MESA_FORMAT_RGB_FXT1: case MESA_FORMAT_RGBA_FXT1: -#endif -#if FEATURE_texture_s3tc case MESA_FORMAT_RGB_DXT1: case MESA_FORMAT_RGBA_DXT1: case MESA_FORMAT_RGBA_DXT3: case MESA_FORMAT_RGBA_DXT5: -#if FEATURE_EXT_texture_sRGB case MESA_FORMAT_SRGB_DXT1: case MESA_FORMAT_SRGBA_DXT1: case MESA_FORMAT_SRGBA_DXT3: case MESA_FORMAT_SRGBA_DXT5: -#endif -#endif case MESA_FORMAT_RED_RGTC1: case MESA_FORMAT_SIGNED_RED_RGTC1: case MESA_FORMAT_RG_RGTC2: @@ -1767,6 +2281,7 @@ _mesa_format_to_type_and_comps(gl_format format, case MESA_FORMAT_SIGNED_L_LATC1: case MESA_FORMAT_LA_LATC2: case MESA_FORMAT_SIGNED_LA_LATC2: + case MESA_FORMAT_ETC1_RGB8: /* XXX generate error instead? */ *datatype = GL_UNSIGNED_BYTE; *comps = 0; @@ -1812,15 +2327,115 @@ _mesa_format_to_type_and_comps(gl_format format, *datatype = GL_HALF_FLOAT_ARB; *comps = 1; return; - + + case MESA_FORMAT_ALPHA_UINT8: + case MESA_FORMAT_LUMINANCE_UINT8: + case MESA_FORMAT_INTENSITY_UINT8: + *datatype = GL_UNSIGNED_BYTE; + *comps = 1; + return; + case MESA_FORMAT_LUMINANCE_ALPHA_UINT8: + *datatype = GL_UNSIGNED_BYTE; + *comps = 2; + return; + + case MESA_FORMAT_ALPHA_UINT16: + case MESA_FORMAT_LUMINANCE_UINT16: + case MESA_FORMAT_INTENSITY_UINT16: + *datatype = GL_UNSIGNED_SHORT; + *comps = 1; + return; + case MESA_FORMAT_LUMINANCE_ALPHA_UINT16: + *datatype = GL_UNSIGNED_SHORT; + *comps = 2; + return; + case MESA_FORMAT_ALPHA_UINT32: + case MESA_FORMAT_LUMINANCE_UINT32: + case MESA_FORMAT_INTENSITY_UINT32: + *datatype = GL_UNSIGNED_INT; + *comps = 1; + return; + case MESA_FORMAT_LUMINANCE_ALPHA_UINT32: + *datatype = GL_UNSIGNED_INT; + *comps = 2; + return; + case MESA_FORMAT_ALPHA_INT8: + case MESA_FORMAT_LUMINANCE_INT8: + case MESA_FORMAT_INTENSITY_INT8: + *datatype = GL_BYTE; + *comps = 1; + return; + case MESA_FORMAT_LUMINANCE_ALPHA_INT8: + *datatype = GL_BYTE; + *comps = 2; + return; + + case MESA_FORMAT_ALPHA_INT16: + case MESA_FORMAT_LUMINANCE_INT16: + case MESA_FORMAT_INTENSITY_INT16: + *datatype = GL_SHORT; + *comps = 1; + return; + case MESA_FORMAT_LUMINANCE_ALPHA_INT16: + *datatype = GL_SHORT; + *comps = 2; + return; + + case MESA_FORMAT_ALPHA_INT32: + case MESA_FORMAT_LUMINANCE_INT32: + case MESA_FORMAT_INTENSITY_INT32: + *datatype = GL_INT; + *comps = 1; + return; + case MESA_FORMAT_LUMINANCE_ALPHA_INT32: + *datatype = GL_INT; + *comps = 2; + return; + + case MESA_FORMAT_R_INT8: + *datatype = GL_BYTE; + *comps = 1; + return; + case MESA_FORMAT_RG_INT8: + *datatype = GL_BYTE; + *comps = 2; + return; + case MESA_FORMAT_RGB_INT8: + *datatype = GL_BYTE; + *comps = 3; + return; case MESA_FORMAT_RGBA_INT8: *datatype = GL_BYTE; *comps = 4; return; + case MESA_FORMAT_R_INT16: + *datatype = GL_SHORT; + *comps = 1; + return; + case MESA_FORMAT_RG_INT16: + *datatype = GL_SHORT; + *comps = 2; + return; + case MESA_FORMAT_RGB_INT16: + *datatype = GL_SHORT; + *comps = 3; + return; case MESA_FORMAT_RGBA_INT16: *datatype = GL_SHORT; *comps = 4; return; + case MESA_FORMAT_R_INT32: + *datatype = GL_INT; + *comps = 1; + return; + case MESA_FORMAT_RG_INT32: + *datatype = GL_INT; + *comps = 2; + return; + case MESA_FORMAT_RGB_INT32: + *datatype = GL_INT; + *comps = 3; + return; case MESA_FORMAT_RGBA_INT32: *datatype = GL_INT; *comps = 4; @@ -1829,14 +2444,50 @@ _mesa_format_to_type_and_comps(gl_format format, /** * \name Non-normalized unsigned integer formats. */ + case MESA_FORMAT_R_UINT8: + *datatype = GL_UNSIGNED_BYTE; + *comps = 1; + return; + case MESA_FORMAT_RG_UINT8: + *datatype = GL_UNSIGNED_BYTE; + *comps = 2; + return; + case MESA_FORMAT_RGB_UINT8: + *datatype = GL_UNSIGNED_BYTE; + *comps = 3; + return; case MESA_FORMAT_RGBA_UINT8: *datatype = GL_UNSIGNED_BYTE; *comps = 4; return; + case MESA_FORMAT_R_UINT16: + *datatype = GL_UNSIGNED_SHORT; + *comps = 1; + return; + case MESA_FORMAT_RG_UINT16: + *datatype = GL_UNSIGNED_SHORT; + *comps = 2; + return; + case MESA_FORMAT_RGB_UINT16: + *datatype = GL_UNSIGNED_SHORT; + *comps = 3; + return; case MESA_FORMAT_RGBA_UINT16: *datatype = GL_UNSIGNED_SHORT; *comps = 4; return; + case MESA_FORMAT_R_UINT32: + *datatype = GL_UNSIGNED_INT; + *comps = 1; + return; + case MESA_FORMAT_RG_UINT32: + *datatype = GL_UNSIGNED_INT; + *comps = 2; + return; + case MESA_FORMAT_RGB_UINT32: + *datatype = GL_UNSIGNED_INT; + *comps = 3; + return; case MESA_FORMAT_RGBA_UINT32: *datatype = GL_UNSIGNED_INT; *comps = 4; @@ -1852,6 +2503,12 @@ _mesa_format_to_type_and_comps(gl_format format, *comps = 3; return; + case MESA_FORMAT_ARGB2101010_UINT: + case MESA_FORMAT_ABGR2101010_UINT: + *datatype = GL_UNSIGNED_INT_2_10_10_10_REV; + *comps = 4; + return; + case MESA_FORMAT_COUNT: assert(0); return; @@ -1867,3 +2524,432 @@ _mesa_format_to_type_and_comps(gl_format format, *comps = 1; } } + +/** + * Check if a gl_format exactly matches a GL formaat/type combination + * such that we can use memcpy() from one to the other. + * \param gl_format a MESA_FORMAT_x value + * \param format the user-specified image format + * \param type the user-specified image datatype + * \param swapBytes typically the current pixel pack/unpack byteswap state + * \return GL_TRUE if the formats match, GL_FALSE otherwise. + */ +GLboolean +_mesa_format_matches_format_and_type(gl_format gl_format, + GLenum format, GLenum type, + GLboolean swapBytes) +{ + const GLboolean littleEndian = _mesa_little_endian(); + + /* 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. + * + * For sanity, please keep this switch statement ordered the same as the + * enums in formats.h. + */ + + switch (gl_format) { + + case MESA_FORMAT_NONE: + case MESA_FORMAT_COUNT: + return GL_FALSE; + + case MESA_FORMAT_RGBA8888: + if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes) + return GL_TRUE; + + if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV && swapBytes) + return GL_TRUE; + + if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && !littleEndian) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV + && !swapBytes) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8 + && swapBytes) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && littleEndian) + return GL_TRUE; + + return GL_FALSE; + + case MESA_FORMAT_RGBA8888_REV: + if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV && + !swapBytes) + return GL_TRUE; + + if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes) + return GL_TRUE; + + if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && littleEndian) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8 && + !swapBytes) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV && + swapBytes) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && !littleEndian) + return GL_TRUE; + + return GL_FALSE; + + case MESA_FORMAT_ARGB8888: + if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV && + !swapBytes) + return GL_TRUE; + + if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes) + return GL_TRUE; + + if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && littleEndian) + return GL_TRUE; + + return GL_FALSE; + + case MESA_FORMAT_ARGB8888_REV: + if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes) + return GL_TRUE; + + if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV && + swapBytes) + return GL_TRUE; + + if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && !littleEndian) + return GL_TRUE; + + return GL_FALSE; + + case MESA_FORMAT_RGBX8888: + case MESA_FORMAT_RGBX8888_REV: + return GL_FALSE; + + case MESA_FORMAT_XRGB8888: + case MESA_FORMAT_XRGB8888_REV: + return GL_FALSE; + + case MESA_FORMAT_RGB888: + return format == GL_BGR && type == GL_UNSIGNED_BYTE && littleEndian; + + case MESA_FORMAT_BGR888: + return format == GL_RGB && type == GL_UNSIGNED_BYTE && littleEndian; + + case MESA_FORMAT_RGB565: + return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 && !swapBytes; + + case MESA_FORMAT_RGB565_REV: + /* Some of the 16-bit MESA_FORMATs that would seem to correspond to + * GL_UNSIGNED_SHORT_* are byte-swapped instead of channel-reversed, + * according to formats.h, so they can't be matched. + */ + return GL_FALSE; + + case MESA_FORMAT_ARGB4444: + return format == GL_BGRA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && + !swapBytes; + + case MESA_FORMAT_ARGB4444_REV: + return GL_FALSE; + + case MESA_FORMAT_RGBA5551: + return format == GL_RGBA && type == GL_UNSIGNED_SHORT_5_5_5_1 && + !swapBytes; + + case MESA_FORMAT_ARGB1555: + return format == GL_BGRA && type == GL_UNSIGNED_SHORT_1_5_5_5_REV && + !swapBytes; + + case MESA_FORMAT_ARGB1555_REV: + return GL_FALSE; + + case MESA_FORMAT_AL44: + return GL_FALSE; + case MESA_FORMAT_AL88: + return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_BYTE && littleEndian; + case MESA_FORMAT_AL88_REV: + return GL_FALSE; + + case MESA_FORMAT_AL1616: + return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_SHORT && littleEndian && !swapBytes; + case MESA_FORMAT_AL1616_REV: + return GL_FALSE; + + case MESA_FORMAT_RGB332: + return format == GL_RGB && type == GL_UNSIGNED_BYTE_3_3_2; + + case MESA_FORMAT_A8: + return format == GL_ALPHA && type == GL_UNSIGNED_BYTE; + case MESA_FORMAT_A16: + return format == GL_ALPHA && type == GL_UNSIGNED_SHORT && + littleEndian && !swapBytes; + case MESA_FORMAT_L8: + return format == GL_LUMINANCE && type == GL_UNSIGNED_BYTE; + case MESA_FORMAT_L16: + return format == GL_LUMINANCE && type == GL_UNSIGNED_SHORT && + littleEndian && !swapBytes; + case MESA_FORMAT_I8: + return format == GL_INTENSITY && type == GL_UNSIGNED_BYTE; + case MESA_FORMAT_I16: + return format == GL_INTENSITY && type == GL_UNSIGNED_SHORT && + littleEndian && !swapBytes; + + case MESA_FORMAT_YCBCR: + case MESA_FORMAT_YCBCR_REV: + return GL_FALSE; + + case MESA_FORMAT_R8: + return format == GL_RED && type == GL_UNSIGNED_BYTE; + case MESA_FORMAT_GR88: + return format == GL_RG && type == GL_UNSIGNED_BYTE && littleEndian; + case MESA_FORMAT_RG88: + return GL_FALSE; + + case MESA_FORMAT_R16: + return format == GL_RED && type == GL_UNSIGNED_SHORT && littleEndian && + !swapBytes; + case MESA_FORMAT_RG1616: + return format == GL_RG && type == GL_UNSIGNED_SHORT && littleEndian && + !swapBytes; + case MESA_FORMAT_RG1616_REV: + return GL_FALSE; + + case MESA_FORMAT_ARGB2101010: + return format == GL_BGRA && type == GL_UNSIGNED_INT_2_10_10_10_REV && + !swapBytes; + + case MESA_FORMAT_Z24_S8: + return format == GL_DEPTH_STENCIL && type == GL_UNSIGNED_INT_24_8 && + !swapBytes; + case MESA_FORMAT_Z24_X8: + case MESA_FORMAT_S8_Z24: + return GL_FALSE; + + case MESA_FORMAT_Z16: + return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_SHORT && + !swapBytes; + + case MESA_FORMAT_X8_Z24: + return GL_FALSE; + + case MESA_FORMAT_Z32: + return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_INT && + !swapBytes; + + case MESA_FORMAT_S8: + return format == GL_STENCIL_INDEX && type == GL_UNSIGNED_BYTE; + + case MESA_FORMAT_SRGB8: + case MESA_FORMAT_SRGBA8: + case MESA_FORMAT_SARGB8: + case MESA_FORMAT_SL8: + case MESA_FORMAT_SLA8: + 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_RGBA_FLOAT32: + return format == GL_RGBA && type == GL_FLOAT && !swapBytes; + case MESA_FORMAT_RGBA_FLOAT16: + return format == GL_RGBA && type == GL_HALF_FLOAT && !swapBytes; + + case MESA_FORMAT_RGB_FLOAT32: + return format == GL_RGB && type == GL_FLOAT && !swapBytes; + case MESA_FORMAT_RGB_FLOAT16: + return format == GL_RGB && type == GL_HALF_FLOAT && !swapBytes; + + case MESA_FORMAT_ALPHA_FLOAT32: + return format == GL_ALPHA && type == GL_FLOAT && !swapBytes; + case MESA_FORMAT_ALPHA_FLOAT16: + return format == GL_ALPHA && type == GL_HALF_FLOAT && !swapBytes; + + case MESA_FORMAT_LUMINANCE_FLOAT32: + return format == GL_LUMINANCE && type == GL_FLOAT && !swapBytes; + case MESA_FORMAT_LUMINANCE_FLOAT16: + return format == GL_LUMINANCE && type == GL_HALF_FLOAT && !swapBytes; + + case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32: + return format == GL_LUMINANCE_ALPHA && type == GL_FLOAT && !swapBytes; + case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16: + return format == GL_LUMINANCE_ALPHA && type == GL_HALF_FLOAT && !swapBytes; + + case MESA_FORMAT_INTENSITY_FLOAT32: + return format == GL_INTENSITY && type == GL_FLOAT && !swapBytes; + case MESA_FORMAT_INTENSITY_FLOAT16: + return format == GL_INTENSITY && type == GL_HALF_FLOAT && !swapBytes; + + case MESA_FORMAT_R_FLOAT32: + return format == GL_RED && type == GL_FLOAT && !swapBytes; + case MESA_FORMAT_R_FLOAT16: + return format == GL_RED && type == GL_HALF_FLOAT && !swapBytes; + + case MESA_FORMAT_RG_FLOAT32: + return format == GL_RG && type == GL_FLOAT && !swapBytes; + case MESA_FORMAT_RG_FLOAT16: + return format == GL_RG && type == GL_HALF_FLOAT && !swapBytes; + + /* FINISHME: What do we want to do for GL_EXT_texture_integer? */ + case MESA_FORMAT_ALPHA_UINT8: + case MESA_FORMAT_ALPHA_UINT16: + case MESA_FORMAT_ALPHA_UINT32: + case MESA_FORMAT_ALPHA_INT8: + case MESA_FORMAT_ALPHA_INT16: + case MESA_FORMAT_ALPHA_INT32: + return GL_FALSE; + + case MESA_FORMAT_INTENSITY_UINT8: + case MESA_FORMAT_INTENSITY_UINT16: + case MESA_FORMAT_INTENSITY_UINT32: + case MESA_FORMAT_INTENSITY_INT8: + case MESA_FORMAT_INTENSITY_INT16: + case MESA_FORMAT_INTENSITY_INT32: + return GL_FALSE; + + case MESA_FORMAT_LUMINANCE_UINT8: + case MESA_FORMAT_LUMINANCE_UINT16: + case MESA_FORMAT_LUMINANCE_UINT32: + case MESA_FORMAT_LUMINANCE_INT8: + case MESA_FORMAT_LUMINANCE_INT16: + case MESA_FORMAT_LUMINANCE_INT32: + return GL_FALSE; + + case MESA_FORMAT_LUMINANCE_ALPHA_UINT8: + case MESA_FORMAT_LUMINANCE_ALPHA_UINT16: + case MESA_FORMAT_LUMINANCE_ALPHA_UINT32: + case MESA_FORMAT_LUMINANCE_ALPHA_INT8: + case MESA_FORMAT_LUMINANCE_ALPHA_INT16: + case MESA_FORMAT_LUMINANCE_ALPHA_INT32: + return GL_FALSE; + + case MESA_FORMAT_R_INT8: + case MESA_FORMAT_RG_INT8: + case MESA_FORMAT_RGB_INT8: + case MESA_FORMAT_RGBA_INT8: + case MESA_FORMAT_R_INT16: + case MESA_FORMAT_RG_INT16: + case MESA_FORMAT_RGB_INT16: + case MESA_FORMAT_RGBA_INT16: + case MESA_FORMAT_R_INT32: + case MESA_FORMAT_RG_INT32: + case MESA_FORMAT_RGB_INT32: + case MESA_FORMAT_RGBA_INT32: + return GL_FALSE; + + case MESA_FORMAT_R_UINT8: + case MESA_FORMAT_RG_UINT8: + case MESA_FORMAT_RGB_UINT8: + case MESA_FORMAT_RGBA_UINT8: + case MESA_FORMAT_R_UINT16: + case MESA_FORMAT_RG_UINT16: + case MESA_FORMAT_RGB_UINT16: + case MESA_FORMAT_RGBA_UINT16: + case MESA_FORMAT_R_UINT32: + case MESA_FORMAT_RG_UINT32: + case MESA_FORMAT_RGB_UINT32: + case MESA_FORMAT_RGBA_UINT32: + return GL_FALSE; + + case MESA_FORMAT_DUDV8: + case MESA_FORMAT_SIGNED_R8: + case MESA_FORMAT_SIGNED_RG88_REV: + case MESA_FORMAT_SIGNED_RGBX8888: + return GL_FALSE; + + case MESA_FORMAT_SIGNED_RGBA8888: + if (format == GL_RGBA && type == GL_BYTE && !littleEndian) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_BYTE && littleEndian) + return GL_TRUE; + + return GL_FALSE; + + case MESA_FORMAT_SIGNED_RGBA8888_REV: + if (format == GL_RGBA && type == GL_BYTE && littleEndian) + return GL_TRUE; + + if (format == GL_ABGR_EXT && type == GL_BYTE && !littleEndian) + return GL_TRUE; + + return GL_FALSE; + + case MESA_FORMAT_SIGNED_R16: + case MESA_FORMAT_SIGNED_GR1616: + case MESA_FORMAT_SIGNED_RGB_16: + case MESA_FORMAT_SIGNED_RGBA_16: + case MESA_FORMAT_RGBA_16: + /* FINISHME: SNORM */ + return GL_FALSE; + + case MESA_FORMAT_RED_RGTC1: + case MESA_FORMAT_SIGNED_RED_RGTC1: + case MESA_FORMAT_RG_RGTC2: + case MESA_FORMAT_SIGNED_RG_RGTC2: + return GL_FALSE; + + case MESA_FORMAT_L_LATC1: + case MESA_FORMAT_SIGNED_L_LATC1: + case MESA_FORMAT_LA_LATC2: + case MESA_FORMAT_SIGNED_LA_LATC2: + return GL_FALSE; + + case MESA_FORMAT_ETC1_RGB8: + return GL_FALSE; + + case MESA_FORMAT_SIGNED_A8: + case MESA_FORMAT_SIGNED_L8: + case MESA_FORMAT_SIGNED_AL88: + case MESA_FORMAT_SIGNED_I8: + case MESA_FORMAT_SIGNED_A16: + case MESA_FORMAT_SIGNED_L16: + case MESA_FORMAT_SIGNED_AL1616: + case MESA_FORMAT_SIGNED_I16: + /* FINISHME: SNORM */ + return GL_FALSE; + + case MESA_FORMAT_ARGB2101010_UINT: + return (format == GL_BGRA_INTEGER_EXT && + type == GL_UNSIGNED_INT_2_10_10_10_REV && + !swapBytes); + + case MESA_FORMAT_ABGR2101010_UINT: + return (format == GL_RGBA_INTEGER_EXT && + type == GL_UNSIGNED_INT_2_10_10_10_REV && + !swapBytes); + + case MESA_FORMAT_RGB9_E5_FLOAT: + return format == GL_RGB && type == GL_UNSIGNED_INT_5_9_9_9_REV && + !swapBytes; + + case MESA_FORMAT_R11_G11_B10_FLOAT: + return format == GL_RGB && type == GL_UNSIGNED_INT_10F_11F_11F_REV && + !swapBytes; + + case MESA_FORMAT_Z32_FLOAT: + return format == GL_DEPTH_COMPONENT && type == GL_FLOAT && !swapBytes; + + case MESA_FORMAT_Z32_FLOAT_X24S8: + return GL_FALSE; + } + + return GL_FALSE; +} +