[virglrenderer-devel] [PATCH] vrend_clear: clear and restore rasterizer discard and depth clamp

Gert Wollny gert.wollny at collabora.com
Tue May 8 10:47:50 UTC 2018


vrend_clear is passed in from gallium clear which, unlike glClear, must
not obey rasterizer discard and depth_clmap. However, the guest doesn't 
foreard the latest update of the rendering states to the host before issuing 
"clear". Therefore, the host clear command must clear these states before 
calling glClear in turn. After calling glClear these states are again brought 
into sync with what the host assumes.

Fixes CTS:
   dEQP-GLES3.functional.rasterizer_discard.fbo.*

Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
---
 src/vrend_renderer.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index ac9723c..34fa32b 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -2486,6 +2486,8 @@ void vrend_clear(struct vrend_context *ctx,
       } else {
          glClearDepth(depth);
       }
+      if (!ctx->sub->hw_rs_state.depth_clip)
+          glDisable(GL_DEPTH_CLAMP);
    }
 
    if (buffers & PIPE_CLEAR_STENCIL) {
@@ -2493,6 +2495,9 @@ void vrend_clear(struct vrend_context *ctx,
       glClearStencil(stencil);
    }
 
+   if (ctx->sub->hw_rs_state.rasterizer_discard)
+       glDisable(GL_RASTERIZER_DISCARD);
+
    if (buffers & PIPE_CLEAR_COLOR) {
       uint32_t mask = 0;
       int i;
@@ -2526,9 +2531,19 @@ void vrend_clear(struct vrend_context *ctx,
    if (bits)
       glClear(bits);
 
-   if (buffers & PIPE_CLEAR_DEPTH)
+   /* Is it really necessary to restore the old states? The only reason we
+    * get here is because the guest cleared all those states but gallium
+    * didn't forward them before calling the clear command
+    */
+   if (ctx->sub->hw_rs_state.rasterizer_discard)
+       glEnable(GL_RASTERIZER_DISCARD);
+
+   if (buffers & PIPE_CLEAR_DEPTH) {
       if (!ctx->sub->dsa_state.depth.writemask)
          glDepthMask(GL_FALSE);
+      if (!ctx->sub->hw_rs_state.depth_clip)
+          glEnable(GL_DEPTH_CLAMP);
+   }
 
    /* Restore previous stencil buffer write masks for both front and back faces */
    if (buffers & PIPE_CLEAR_STENCIL) {
-- 
2.16.1



More information about the virglrenderer-devel mailing list