[virglrenderer-devel] [PATCH v2 2/7] vrend: Use source swizzle when blitting with GL
Elie Tournier
tournier.elie at gmail.com
Mon Apr 23 16:19:19 UTC 2018
On Mon, Apr 23, 2018 at 06:45:57PM +0300, Alexandros Frantzis wrote:
> Use the source format swizzle information to set the
> GL_TEXTURE_SWIZZLE_* parameters for the GL blit operation. This also
> removes the need for the emulated alpha special case, since when using
> emulated alpha the source format already has proper swizzle information.
>
> Signed-off-by: Alexandros Frantzis <alexandros.frantzis at collabora.com>
> ---
> src/vrend_blitter.c | 30 ++++++++++++++++++++++++++++--
> src/vrend_renderer.c | 6 ++++++
> src/vrend_renderer.h | 1 +
> 3 files changed, 35 insertions(+), 2 deletions(-)
>
> diff --git a/src/vrend_blitter.c b/src/vrend_blitter.c
> index 2acad14..a70da14 100644
> --- a/src/vrend_blitter.c
> +++ b/src/vrend_blitter.c
> @@ -614,6 +614,21 @@ static void set_dsa_write_depth_keep_stencil(void)
> glDepthMask(GL_TRUE);
> }
>
> +static inline GLenum to_gl_swizzle(int swizzle)
> +{
> + switch (swizzle) {
> + case PIPE_SWIZZLE_RED: return GL_RED;
> + case PIPE_SWIZZLE_GREEN: return GL_GREEN;
> + case PIPE_SWIZZLE_BLUE: return GL_BLUE;
> + case PIPE_SWIZZLE_ALPHA: return GL_ALPHA;
> + case PIPE_SWIZZLE_ZERO: return GL_ZERO;
> + case PIPE_SWIZZLE_ONE: return GL_ONE;
> + default:
> + assert(0);
Maybe we can add a comment in the assert like assert("Invalid swizzle" && 0)
Going through the codebase, it seems that assert(0) is quite common, so
as you prefer.
> + return 0;
> + }
> +}
> +
> /* implement blitting using OpenGL. */
> void vrend_renderer_blit_gl(struct vrend_context *ctx,
> struct vrend_resource *src_res,
> @@ -635,6 +650,8 @@ void vrend_renderer_blit_gl(struct vrend_context *ctx,
> util_format_description(src_res->base.format);
> const struct util_format_description *dst_desc =
> util_format_description(dst_res->base.format);
> + const struct vrend_format_table *src_entry =
> + vrend_get_format_table_entry(info->src.format);
>
> has_depth = util_format_has_depth(src_desc) &&
> util_format_has_depth(dst_desc);
> @@ -691,8 +708,17 @@ void vrend_renderer_blit_gl(struct vrend_context *ctx,
>
> glBindTexture(src_res->target, src_res->id);
>
> - if (vrend_format_is_emulated_alpha(info->src.format))
> - glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_A, GL_RED);
> + if (src_entry->flags & VREND_BIND_NEED_SWIZZLE) {
> + glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_R,
> + to_gl_swizzle(src_entry->swizzle[0]));
> + glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_G,
> + to_gl_swizzle(src_entry->swizzle[1]));
> + glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_B,
> + to_gl_swizzle(src_entry->swizzle[2]));
> + glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_A,
> + to_gl_swizzle(src_entry->swizzle[3]));
> + }
> +
>
> glTexParameteri(src_res->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
> glTexParameteri(src_res->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
> index 2fa0f2a..5c16afe 100644
> --- a/src/vrend_renderer.c
> +++ b/src/vrend_renderer.c
> @@ -673,6 +673,12 @@ vrend_insert_format_swizzle(int override_format, struct vrend_format_table *entr
> tex_conv_table[override_format].swizzle[i] = swizzle[i];
> }
>
> +const struct vrend_format_table *
> +vrend_get_format_table_entry(enum virgl_formats format)
> +{
> + return &tex_conv_table[format];
> +}
> +
> static bool vrend_is_timer_query(GLenum gltype)
> {
> return gltype == GL_TIMESTAMP ||
> diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h
> index 7e83c20..0a139c7 100644
> --- a/src/vrend_renderer.h
> +++ b/src/vrend_renderer.h
> @@ -105,6 +105,7 @@ int vrend_renderer_init(struct vrend_if_cbs *cbs, uint32_t flags);
>
> void vrend_insert_format(struct vrend_format_table *entry, uint32_t bindings);
> void vrend_insert_format_swizzle(int override_format, struct vrend_format_table *entry, uint32_t bindings, uint8_t swizzle[4]);
> +const struct vrend_format_table *vrend_get_format_table_entry(enum virgl_formats format);
> int vrend_create_shader(struct vrend_context *ctx,
> uint32_t handle,
> const struct pipe_stream_output_info *stream_output,
> --
> 2.17.0
>
> _______________________________________________
> virglrenderer-devel mailing list
> virglrenderer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel
More information about the virglrenderer-devel
mailing list