[virglrenderer-devel] [PATCH v2 2/2] blitter: Make fbo sRGB state always act like on GLES
Robert Tarasov
tutankhamen at chromium.org
Tue Jul 31 22:12:20 UTC 2018
Reviewed-by: Robert Tarasov <t <tarceri at itsqueeze.com>
utankhamen at chromium.org>
On Thu, Jul 26, 2018 at 6:04 AM Gert Wollny <gert.wollny at collabora.com>
wrote:
> On an GL host set the sRGB blit framebuffer state explicitly to make virgl
> behave like on a GLES host.
>
> This does not correct the handing of sRGB completely, because the state
> GL_FRAMEBUFFER_SRGB is not properly transmitted to the host. As a result
> the piglits "blit texture linear_to_srgb * * *" flip.
> Tests thatset "enable" failed before and pass now, and tests that set
> "disable"
> now fail.
>
> v2: - Move setting the fbo state out of the loop (Robert Tarasov)
> - Use the blitter context to set and store the state, since it is
> only,
> and currently we don't pass the state from the guest
> relevant when the dst texture is SRGB, there is no need to disable it
> - Just enforce that a source SRGB texture is always decoded when this
> could
> be disabled
>
> Fixes on GL host:
> dEQP-GLES3.functional.fbo.blit.conversion.rgb8_to_srgb8_alpha8
> dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8
>
> Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
>
> blitter: check srgb feature
> Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
> ---
> src/vrend_blitter.c | 13 +++++++++++--
> src/vrend_renderer.c | 10 +++++++++-
> src/vrend_renderer.h | 3 ++-
> 3 files changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/src/vrend_blitter.c b/src/vrend_blitter.c
> index 338577d..dd3c626 100644
> --- a/src/vrend_blitter.c
> +++ b/src/vrend_blitter.c
> @@ -55,6 +55,7 @@ struct vrend_blitter_ctx {
> virgl_gl_context gl_context;
> bool initialised;
> bool use_gles;
> + int framebuffer_srgb_enabled;
>
> GLuint vaoid;
>
> @@ -460,6 +461,10 @@ static void vrend_renderer_init_blit_ctx(struct
> vrend_blitter_ctx *blit_ctx)
> blit_ctx->vertices[i][0][3] = 1; /*v.w*/
> glBindVertexArray(blit_ctx->vaoid);
> glBindBuffer(GL_ARRAY_BUFFER, blit_ctx->vbo_id);
> +
> + if (!blit_ctx->use_gles)
> + glEnable(GL_FRAMEBUFFER_SRGB);
> + blit_ctx->framebuffer_srgb_enabled = true;
> }
>
> static inline GLenum convert_mag_filter(unsigned int filter)
> @@ -686,7 +691,8 @@ static void calc_dst_deltas_from_src(const struct
> pipe_blit_info *info,
> void vrend_renderer_blit_gl(UNUSED struct vrend_context *ctx,
> struct vrend_resource *src_res,
> struct vrend_resource *dst_res,
> - const struct pipe_blit_info *info)
> + const struct pipe_blit_info *info,
> + bool has_texture_srgb_decode)
> {
> struct vrend_blitter_ctx *blit_ctx = &vrend_blit_ctx;
> GLuint buffers;
> @@ -787,6 +793,9 @@ void vrend_renderer_blit_gl(UNUSED struct
> vrend_context *ctx,
> to_gl_swizzle(src_entry->swizzle[3]));
> }
>
> + /* Just make sure that no stale state disabled decoding */
> + if (has_texture_srgb_decode &&
> util_format_is_srgb(src_res->base.format))
> + glTexParameteri(src_res->target, GL_TEXTURE_SRGB_DECODE_EXT,
> GL_DECODE_EXT);
>
> glTexParameteri(src_res->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
> glTexParameteri(src_res->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
> @@ -833,4 +842,4 @@ void vrend_renderer_blit_gl(UNUSED struct
> vrend_context *ctx,
> GL_TEXTURE_2D, 0, 0);
> glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0,
> GL_TEXTURE_2D, 0, 0);
> -}
> +}
> \ No newline at end of file
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
> index 8829d97..d77bf82 100644
> --- a/src/vrend_renderer.c
> +++ b/src/vrend_renderer.c
> @@ -6746,7 +6746,8 @@ static void vrend_renderer_blit_int(struct
> vrend_context *ctx,
> use_gl = true;
>
> if (use_gl) {
> - vrend_renderer_blit_gl(ctx, src_res, dst_res, info);
> + vrend_renderer_blit_gl(ctx, src_res, dst_res, info,
> + has_feature(feat_texture_srgb_decode));
> vrend_clicbs->make_current(0, ctx->sub->gl_context);
> return;
> }
> @@ -6865,6 +6866,13 @@ static void vrend_renderer_blit_int(struct
> vrend_context *ctx,
> vrend_fb_bind_texture(dst_res, 0, info->dst.level, info->dst.box.z
> + i);
> glBindFramebuffer(GL_DRAW_FRAMEBUFFER, ctx->sub->blit_fb_ids[1]);
>
> + if (!vrend_state.use_gles) {
> + if (util_format_is_srgb(dst_res->base.format))
> + glEnable(GL_FRAMEBUFFER_SRGB);
> + else
> + glDisable(GL_FRAMEBUFFER_SRGB);
> + }
> +
> glBindFramebuffer(GL_READ_FRAMEBUFFER, intermediate_fbo);
>
> glBlitFramebuffer(info->src.box.x,
> diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h
> index 8f1192e..9a8f10d 100644
> --- a/src/vrend_renderer.h
> +++ b/src/vrend_renderer.h
> @@ -375,7 +375,8 @@ boolean format_is_copy_compatible(enum pipe_format
> src, enum pipe_format dst);
> void vrend_renderer_blit_gl(struct vrend_context *ctx,
> struct vrend_resource *src_res,
> struct vrend_resource *dst_res,
> - const struct pipe_blit_info *info);
> + const struct pipe_blit_info *info,
> + bool has_texture_srgb_decode);
>
> void vrend_renderer_reset(void);
> int vrend_renderer_get_poll_fd(void);
> --
> 2.16.4
>
> _______________________________________________
> virglrenderer-devel mailing list
> virglrenderer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/virglrenderer-devel/attachments/20180731/0c0bd4f7/attachment.html>
More information about the virglrenderer-devel
mailing list