st/mesa: honour sized internal formats in st_choose_format (v2)
The bitcasting which is possible with shader images (and texture views?) requires that when the user specifies a sized internal format for a texture, we really allocate that format. To this end: (1) find_exact_format should ignore sized internal formats and (2) some of the entries in the mapping table corresponding to sized internal formats are reordered to use an RGBA format instead of a BGRA one. This fixes arb_shader_image_load_store-bitcast in the (work in progress) ARB_shader_image_load_store implementation for radeonsi. v2: don't change the mapping of GL_RGB10: the change caused a regression because it preferred a format with an alpha channel, and GL_RGB10 is not among the supported formats for shader images Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
49eb5e75bd
commit
a8eea696b8
|
@ -1114,12 +1114,12 @@ static const struct format_mapping format_map[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ GL_RGB10_A2, 0 },
|
{ GL_RGB10_A2, 0 },
|
||||||
{ PIPE_FORMAT_B10G10R10A2_UNORM, PIPE_FORMAT_R10G10B10A2_UNORM,
|
{ PIPE_FORMAT_R10G10B10A2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
|
||||||
DEFAULT_RGBA_FORMATS }
|
DEFAULT_RGBA_FORMATS }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 4, GL_RGBA, GL_RGBA8, 0 },
|
{ 4, GL_RGBA, GL_RGBA8, 0 },
|
||||||
{ DEFAULT_RGBA_FORMATS }
|
{ PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ GL_BGRA, 0 },
|
{ GL_BGRA, 0 },
|
||||||
|
@ -1127,7 +1127,7 @@ static const struct format_mapping format_map[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ 3, GL_RGB, GL_RGB8, 0 },
|
{ 3, GL_RGB, GL_RGB8, 0 },
|
||||||
{ DEFAULT_RGB_FORMATS }
|
{ PIPE_FORMAT_R8G8B8X8_UNORM, DEFAULT_RGB_FORMATS }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
{ GL_RGB12, GL_RGB16, 0 },
|
{ GL_RGB12, GL_RGB16, 0 },
|
||||||
|
@ -2022,20 +2022,10 @@ static const struct exact_format_mapping rgbx8888_tbl[] =
|
||||||
{ 0, 0, 0 }
|
{ 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct exact_format_mapping rgba1010102_tbl[] =
|
|
||||||
{
|
|
||||||
{ GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_B10G10R10A2_UNORM },
|
|
||||||
/* No Mesa formats for these Gallium formats:
|
|
||||||
{ GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_R10G10B10A2_UNORM },
|
|
||||||
{ GL_ABGR_EXT, GL_UNSIGNED_INT_10_10_10_2, PIPE_FORMAT_R10G10B10A2_UNORM },
|
|
||||||
{ GL_ABGR_EXT, GL_UNSIGNED_INT, PIPE_FORMAT_R10G10B10A2_UNORM },
|
|
||||||
*/
|
|
||||||
{ 0, 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If there is an exact pipe_format match for {internalFormat, format, type}
|
* For unsized/base internal formats, we may choose a convenient effective
|
||||||
* return that, otherwise return PIPE_FORMAT_NONE so we can do fuzzy matching.
|
* internal format for {format, type}. If one exists, return that, otherwise
|
||||||
|
* return PIPE_FORMAT_NONE.
|
||||||
*/
|
*/
|
||||||
static enum pipe_format
|
static enum pipe_format
|
||||||
find_exact_format(GLint internalFormat, GLenum format, GLenum type)
|
find_exact_format(GLint internalFormat, GLenum format, GLenum type)
|
||||||
|
@ -2049,17 +2039,12 @@ find_exact_format(GLint internalFormat, GLenum format, GLenum type)
|
||||||
switch (internalFormat) {
|
switch (internalFormat) {
|
||||||
case 4:
|
case 4:
|
||||||
case GL_RGBA:
|
case GL_RGBA:
|
||||||
case GL_RGBA8:
|
|
||||||
tbl = rgba8888_tbl;
|
tbl = rgba8888_tbl;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
case GL_RGB:
|
case GL_RGB:
|
||||||
case GL_RGB8:
|
|
||||||
tbl = rgbx8888_tbl;
|
tbl = rgbx8888_tbl;
|
||||||
break;
|
break;
|
||||||
case GL_RGB10_A2:
|
|
||||||
tbl = rgba1010102_tbl;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return PIPE_FORMAT_NONE;
|
return PIPE_FORMAT_NONE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue