From df4d6003dc75395f8ded57fdf59046f0d008eea3 Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Tue, 30 May 2017 15:51:06 +0200 Subject: [PATCH] svga: Fix imported surface view creation When deciding to create a view with or without an alpha channel we need to look at the SVGA3D format and not the PIPE format. This fixes the glx-tfp piglit test for dri3/xa. Signed-off-by: Thomas Hellstrom Reviewed-by: Charmaine Lee --- .../drivers/svga/svga_resource_texture.c | 22 +++++++++++++++++++ .../drivers/svga/svga_resource_texture.h | 3 +++ src/gallium/drivers/svga/svga_shader.c | 13 +++++------ src/gallium/drivers/svga/svga_state_sampler.c | 6 ++--- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/gallium/drivers/svga/svga_resource_texture.c b/src/gallium/drivers/svga/svga_resource_texture.c index 356e7c54d9d..39e11d3a616 100644 --- a/src/gallium/drivers/svga/svga_resource_texture.c +++ b/src/gallium/drivers/svga/svga_resource_texture.c @@ -1488,3 +1488,25 @@ svga_texture_transfer_unmap_upload(struct svga_context *svga, pipe_resource_reference(&st->upload.buf, NULL); } + +/** + * Does the device format backing this surface have an + * alpha channel? + * + * \param texture[in] The texture whose format we're querying + * \return TRUE if the format has an alpha channel, FALSE otherwise + * + * For locally created textures, the device (svga) format is typically + * identical to svga_format(texture->format), and we can use the gallium + * format tests to determine whether the device format has an alpha channel + * or not. However, for textures backed by imported svga surfaces that is + * not always true, and we have to look at the SVGA3D utilities. + */ +boolean +svga_texture_device_format_has_alpha(struct pipe_resource *texture) +{ + enum svga3d_block_desc block_desc = + svga3dsurface_get_desc(svga_texture(texture)->key.format)->block_desc; + + return !!(block_desc & SVGA3DBLOCKDESC_ALPHA); +} diff --git a/src/gallium/drivers/svga/svga_resource_texture.h b/src/gallium/drivers/svga/svga_resource_texture.h index 4cb98970a5b..fe52738b4f1 100644 --- a/src/gallium/drivers/svga/svga_resource_texture.h +++ b/src/gallium/drivers/svga/svga_resource_texture.h @@ -313,4 +313,7 @@ void svga_texture_transfer_unmap_upload(struct svga_context *svga, struct svga_transfer *st); +boolean +svga_texture_device_format_has_alpha(struct pipe_resource *texture); + #endif /* SVGA_TEXTURE_H */ diff --git a/src/gallium/drivers/svga/svga_shader.c b/src/gallium/drivers/svga/svga_shader.c index 669672de643..795531773bf 100644 --- a/src/gallium/drivers/svga/svga_shader.c +++ b/src/gallium/drivers/svga/svga_shader.c @@ -215,7 +215,6 @@ svga_init_shader_key_common(const struct svga_context *svga, key->tex[i].swizzle_r = view->swizzle_r; key->tex[i].swizzle_g = view->swizzle_g; key->tex[i].swizzle_b = view->swizzle_b; - key->tex[i].swizzle_a = view->swizzle_a; /* If we have a non-alpha view into an svga3d surface with an * alpha channel, then explicitly set the alpha channel to 1 @@ -223,13 +222,11 @@ svga_init_shader_key_common(const struct svga_context *svga, * in the svga texture key, since the imported format is * stored here and it may differ from the gallium format. */ - if (!util_format_has_alpha(view->format)) { - enum svga3d_block_desc block_desc = - svga3dsurface_get_desc(svga_texture(view->texture)->key.format)-> - block_desc; - - if (block_desc & SVGA3DBLOCKDESC_ALPHA) - key->tex[i].swizzle_a = PIPE_SWIZZLE_1; + if (!util_format_has_alpha(view->format) && + svga_texture_device_format_has_alpha(view->texture)) { + key->tex[i].swizzle_a = PIPE_SWIZZLE_1; + } else { + key->tex[i].swizzle_a = view->swizzle_a; } } } diff --git a/src/gallium/drivers/svga/svga_state_sampler.c b/src/gallium/drivers/svga/svga_state_sampler.c index 482449ecc66..c361dba676a 100644 --- a/src/gallium/drivers/svga/svga_state_sampler.c +++ b/src/gallium/drivers/svga/svga_state_sampler.c @@ -44,7 +44,7 @@ #include "svga_shader.h" #include "svga_state.h" #include "svga_surface.h" - +#include "svga3d_surfacedefs.h" /** Get resource handle for a texture or buffer */ static inline struct svga_winsys_surface * @@ -141,11 +141,11 @@ svga_validate_pipe_sampler_view(struct svga_context *svga, * create a BGRA view (and vice versa). */ if (viewFormat == PIPE_FORMAT_B8G8R8X8_UNORM && - texture->format == PIPE_FORMAT_B8G8R8A8_UNORM) { + svga_texture_device_format_has_alpha(texture)) { viewFormat = PIPE_FORMAT_B8G8R8A8_UNORM; } else if (viewFormat == PIPE_FORMAT_B8G8R8A8_UNORM && - texture->format == PIPE_FORMAT_B8G8R8X8_UNORM) { + !svga_texture_device_format_has_alpha(texture)) { viewFormat = PIPE_FORMAT_B8G8R8X8_UNORM; } -- 2.30.2