diff options
author | Brian Paul <[email protected]> | 2015-07-28 15:59:36 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2016-06-10 15:50:04 -0600 |
commit | d8fe6332d8e0a0051c0bc76e5085a928a6fd10cd (patch) | |
tree | d50a63019d09155b85b79e7bd068b9f4f971a641 /src/gallium | |
parent | e295b4e800a0595f96d775ebd383b8a358f8fdbc (diff) |
softpipe: don't use 3-component formats
Mesa and gallium don't have a complete set of matching 3-component
texture formats. For example, 8-bit sRGB unorm. To fully support
the GL_ARB_copy_image extension we need to have support for all of
these formats: RGB8_UNORM, RGB8_SNORM, RGB8_SRGB, RGB8_UINT, and
RGB8_SINT using the same component order. Since we don't have that,
disable the 3-component formats for now.
v2: Simplify 3-component format check, per Marek.
Also check that target != PIPE_BUFFER.
Reviewed-by: Marek Olšák <[email protected]>
Reviewed-by: Charmaine Lee <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/softpipe/sp_screen.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c index 0c87f6902cf..e74f2d2f127 100644 --- a/src/gallium/drivers/softpipe/sp_screen.c +++ b/src/gallium/drivers/softpipe/sp_screen.c @@ -396,6 +396,24 @@ softpipe_is_format_supported( struct pipe_screen *screen, return FALSE; } + if ((bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) && + ((bind & PIPE_BIND_DISPLAY_TARGET) == 0) && + target != PIPE_BUFFER) { + const struct util_format_description *desc = + util_format_description(format); + if (desc->nr_channels == 3 && desc->is_array) { + /* Don't support any 3-component formats for rendering/texturing + * since we don't support the corresponding 8-bit 3 channel UNORM + * formats. This allows us to support GL_ARB_copy_image between + * GL_RGB8 and GL_RGB8UI, for example. Otherwise, we may be asked to + * do a resource copy between PIPE_FORMAT_R8G8B8_UINT and + * PIPE_FORMAT_R8G8B8X8_UNORM, for example, which will not work + * (different bpp). + */ + return FALSE; + } + } + if (format_desc->layout == UTIL_FORMAT_LAYOUT_ETC && format != PIPE_FORMAT_ETC1_RGB8) return FALSE; |