Mesa (master): svga: Fix imported surface view creation
Thomas Hellstrom
thomash at kemper.freedesktop.org
Wed Jun 7 17:48:11 UTC 2017
Module: Mesa
Branch: master
Commit: df4d6003dc75395f8ded57fdf59046f0d008eea3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=df4d6003dc75395f8ded57fdf59046f0d008eea3
Author: Thomas Hellstrom <thellstrom at vmware.com>
Date: Tue May 30 15:51:06 2017 +0200
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 <thellstrom at vmware.com>
Reviewed-by: Charmaine Lee <charmainel at vmware.com>
---
src/gallium/drivers/svga/svga_resource_texture.c | 22 ++++++++++++++++++++++
src/gallium/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 356e7c54d9..39e11d3a61 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 4cb98970a5..fe52738b4f 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 669672de64..795531773b 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 482449ecc6..c361dba676 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;
}
More information about the mesa-commit
mailing list