[Mesa-dev] [PATCH] virgl: Allow RGB32* textures only as buffer objects

Ilia Mirkin imirkin at alum.mit.edu
Fri Jul 20 16:31:23 UTC 2018


On Thu, Jul 12, 2018 at 6:55 AM, Gert Wollny <gert.wollny at collabora.com> wrote:
> When requesting a texture of the internal format GL_RGB32F Gallium will
> try to allocate a renderable texture and returns RGBA32F or RGBX32F, but
> when one requests GL_RGB32I or GL_RGB32UI the according 3-component
> texture will be returned. This leads to problems later, when one wants
> to use glCopyImageSubData to copy data between these textures that should
> be compatible, but given the way virgl and Gallium  handle this the latter
> fails with an assertion, because the per-texel bit size is different.
>
> By allowing the GL_RGB32* only for texture buffers these problems are avoided
> without losing the ARB_tbo_rgb32 extension (thanks Ilia Mirkin).
>
> Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
> ---
>  src/gallium/drivers/virgl/virgl_screen.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
> index 2a340b004f..1dbd88dee8 100644
> --- a/src/gallium/drivers/virgl/virgl_screen.c
> +++ b/src/gallium/drivers/virgl/virgl_screen.c
> @@ -496,6 +496,13 @@ virgl_is_format_supported( struct pipe_screen *screen,
>        return virgl_is_vertex_format_supported(screen, format);
>     }
>
> +   /* Allow 3-comp 32 bit texturs only for TBOs (needed for ARB_tbo_rgb32) */
> +   if ((format == PIPE_FORMAT_R32G32B32_FLOAT ||
> +       format == PIPE_FORMAT_R32G32B32_SINT ||
> +       format == PIPE_FORMAT_R32G32B32_UINT) &&
> +       target != PIPE_BUFFER)
> +      return FALSE;

My personal recommendation would be to disallow *all* packed RGB
formats unless target == PIPE_BUFFER. (And even then -- questionable,
except for RGB32, which is required.)

Your call - that's a larger change (in behavior).

  -ilia


More information about the mesa-dev mailing list