[Mesa-dev] [PATCH] virgl: clear render state before submitting clear command

Gurchetan Singh gurchetansingh at chromium.org
Tue May 8 01:25:05 UTC 2018


In vrend_clear, we already save and restore colormasks and stencils:

https://cgit.freedesktop.org/virglrenderer/commit/?id=b75e0a1dabdfbda44c310a69026a9dbd7d980294
https://cgit.freedesktop.org/virglrenderer/commit/?id=252b00d77c30ce39608c1a9de18523cbdcaca623

It would be nice if we can put everything on the host side.  Wouldn't
the following code also solve the RASTERIZER_DISCARD problem?

if (ctx->sub->hw_rs_state.rasterizer_discard)
    glDisable(GL_RASTERIZER_DISCARD)

...

glClear(..)

...

if (ctx->sub->hw_rs_state.rasterizer_discard)
    glEnable(GL_RASTERIZER_DISCARD)


On Mon, May 7, 2018 at 1:18 AM, Gert Wollny <gert.wollny at collabora.com> wrote:
> Virgl/virglrenderer implements the gallium clear command via a call to
> glClear. However, gallium clear does not take render states like e.g.
> RASTERIZER_DISCARD into account, but glClear does, and gallium st_Clear
> does not updated the latest rendering state on the host. Hence, in order
> to properly emulate gallium clear with glClear, all rendering states that
> influence glClear must be set to their default values on the host before
> submitting the actual clear command and restore the original state
> afterwards (Thanks to Ilia Mirkin for helpint me understand this).
>
> This patch implements the according mechanism in virgl_clear, the clear state
> is defined like in mesa/st/st_cb_clear.c: st_init_clear.
>
> Fixes CTS:
>    dEQP-GLES3.functional.rasterizer_discard.fbo.*
>
> Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
> ---
> PS : I have no mesa commits rights.
>
>  src/gallium/drivers/virgl/virgl_context.c | 24 ++++++++++++++++++-----
>  src/gallium/drivers/virgl/virgl_context.h |  2 ++
>  2 files changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c
> index 8d701bb8f4..55ddbcf7df 100644
> --- a/src/gallium/drivers/virgl/virgl_context.c
> +++ b/src/gallium/drivers/virgl/virgl_context.c
> @@ -305,9 +305,8 @@ static void virgl_bind_rasterizer_state(struct pipe_context *ctx,
>                                                  void *rs_state)
>  {
>     struct virgl_context *vctx = virgl_context(ctx);
> -   uint32_t handle = (unsigned long)rs_state;
> -
> -   virgl_encode_bind_object(vctx, handle, VIRGL_OBJECT_RASTERIZER);
> +   vctx->last_render_state = rs_state;
> +   virgl_encode_bind_object(vctx, (unsigned long)rs_state, VIRGL_OBJECT_RASTERIZER);
>  }
>
>  static void virgl_delete_rasterizer_state(struct pipe_context *ctx,
> @@ -568,8 +567,19 @@ static void virgl_clear(struct pipe_context *ctx,
>                                  double depth, unsigned stencil)
>  {
>     struct virgl_context *vctx = virgl_context(ctx);
> +   struct pipe_rasterizer_state *old_state = vctx->last_render_state;
>
> +   if (!vctx->clear_render_state) {
> +      struct pipe_rasterizer_state clear_state;
> +      memset(&clear_state, 0, sizeof(clear_state));
> +      clear_state.depth_clip = 1;
> +      clear_state.bottom_edge_rule = 1;
> +      clear_state.half_pixel_center = 1;
> +      vctx->clear_render_state = virgl_create_rasterizer_state(ctx, &clear_state);
> +   }
> +   virgl_bind_rasterizer_state(ctx, vctx->clear_render_state);
>     virgl_encode_clear(vctx, buffers, color, depth, stencil);
> +   virgl_bind_rasterizer_state(ctx, old_state);
>  }
>
>  static void virgl_draw_vbo(struct pipe_context *ctx,
> @@ -844,6 +854,9 @@ virgl_context_destroy( struct pipe_context *ctx )
>     struct virgl_context *vctx = virgl_context(ctx);
>     struct virgl_screen *rs = virgl_screen(ctx->screen);
>
> +   if (vctx->clear_render_state)
> +      virgl_delete_rasterizer_state(ctx, vctx->clear_render_state);
> +
>     vctx->framebuffer.zsbuf = NULL;
>     vctx->framebuffer.nr_cbufs = 0;
>     virgl_encoder_destroy_sub_ctx(vctx, vctx->hw_sub_ctx_id);
> @@ -948,6 +961,7 @@ struct pipe_context *virgl_context_create(struct pipe_screen *pscreen,
>     virgl_encoder_create_sub_ctx(vctx, vctx->hw_sub_ctx_id);
>
>     virgl_encoder_set_sub_ctx(vctx, vctx->hw_sub_ctx_id);
> +
>     return &vctx->base;
>  fail:
>     return NULL;
> diff --git a/src/gallium/drivers/virgl/virgl_context.h b/src/gallium/drivers/virgl/virgl_context.h
> index 3492dcfa49..a1c1d1a60c 100644
> --- a/src/gallium/drivers/virgl/virgl_context.h
> +++ b/src/gallium/drivers/virgl/virgl_context.h
> @@ -74,6 +74,8 @@ struct virgl_context {
>
>     struct primconvert_context *primconvert;
>     uint32_t hw_sub_ctx_id;
> +   void *last_render_state;
> +   void *clear_render_state;
>  };
>
>  static inline struct virgl_sampler_view *
> --
> 2.17.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list