[Mesa-dev] [PATCH] st/mesa: try the app's texture format first before using the internal format.
Brian Paul
brianp at vmware.com
Fri Jun 17 12:21:57 PDT 2011
On 06/17/2011 12:34 PM, Stéphane Marchesin wrote:
> If we can find it, that means we don't need to do texture format conversion
> and therefore we get fast texture uploads for natively supported formats.
> ---
> src/mesa/state_tracker/st_format.c | 25 +++++++++++++++++--------
> 1 files changed, 17 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
> index 3583571..e39d835 100644
> --- a/src/mesa/state_tracker/st_format.c
> +++ b/src/mesa/state_tracker/st_format.c
> @@ -615,16 +615,16 @@ static struct format_mapping format_map[] = {
> { PIPE_FORMAT_B10G10R10A2_UNORM, DEFAULT_RGBA_FORMATS }
> },
> {
> - { 4, GL_RGBA, GL_RGBA8, 0 },
> - { DEFAULT_RGBA_FORMATS, 0 }
> - },
> - {
> { GL_BGRA, 0 },
> { PIPE_FORMAT_B8G8R8A8_UNORM, DEFAULT_RGBA_FORMATS }
> },
> {
> + { 4, GL_RGBA, GL_RGBA8, 0 },
> + { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
> + },
> + {
> { 3, GL_RGB, GL_RGB8, 0 },
> - { DEFAULT_RGB_FORMATS, 0 }
> + { PIPE_FORMAT_R8G8B8X8_UNORM, DEFAULT_RGB_FORMATS }
> },
We should just add PIPE_FORMAT_R8G8B8A8_UNORM to DEFAULT_RGBA_FORMATS.
There's no mesa format that matches PIPE_FORMAT_R8G8B8X8_UNORM at this
time.
> {
> { GL_RGB12, GL_RGB16, GL_RGBA12, GL_RGBA16, 0 },
> @@ -1108,7 +1108,7 @@ static struct format_mapping format_map[] = {
> * Return first supported format from the given list.
> */
> static enum pipe_format
> -find_supported_format(struct pipe_screen *screen,
> +find_supported_format(struct pipe_screen *screen,
> const enum pipe_format formats[],
> enum pipe_texture_target target,
> unsigned sample_count,
> @@ -1210,14 +1210,23 @@ st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
> if (_mesa_is_depth_format(internalFormat) ||
> _mesa_is_depth_or_stencil_format(internalFormat))
> bindings |= PIPE_BIND_DEPTH_STENCIL;
> - else
> + else
> bindings |= PIPE_BIND_RENDER_TARGET;
> }
I'll take care of the trailing whitespace in a separate commit.
> - pFormat = st_choose_format(screen, internalFormat,
> + /* First try a format which matches the format provided by the app
> + * This heuristic avoids potentially costly texture format conversions
> + * and gets us much faster texture transfers. */
> + pFormat = st_choose_format(screen, format,
> PIPE_TEXTURE_2D, 0, bindings);
>
> if (pFormat == PIPE_FORMAT_NONE) {
> + /* Now try the internal format */
> + pFormat = st_choose_format(screen, internalFormat,
> + PIPE_TEXTURE_2D, 0, bindings);
> + }
> +
> + if (pFormat == PIPE_FORMAT_NONE) {
> /* try choosing format again, this time without render target bindings */
> pFormat = st_choose_format(screen, internalFormat,
> PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
I don't think this is right. The internalFormat is more important the
format parameter.
Suppose the user called glTexImage(internalFormat=GL_RGBA32F_ARB,
format=GL_RGBA, type=GL_FLOAT). We can't choose the hw format based
on format=GL_RGBA since we won't get the float format the user wants.
-Brian
More information about the mesa-dev
mailing list