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