[Mesa-dev] [PATCH] virgl: use primconvert provoking vertex properly
Gert Wollny
gert.wollny at collabora.com
Thu Jan 3 13:31:39 UTC 2019
Am Donnerstag, den 03.01.2019, 14:28 +0100 schrieb Gert Wollny:
> Tested it, looks fine,
> Reviewed-By: Gert Wollny <gert.wollny at gmail.com>
Sorry, that should be <gert.wollny at collabora.com>
>
> Am Freitag, den 28.12.2018, 16:54 +1000 schrieb Dave Airlie:
> > From: Dave Airlie <airlied at redhat.com>
> >
> > This stores the raster state and calls the correct primconvert
> > interface
> > using the currently bound raster state.
> >
> > This fixes piglit glsl-fs-flat-color
> > ---
> > src/gallium/drivers/virgl/virgl_context.c | 26 ++++++++++++++++---
> > --
> > --
> > src/gallium/drivers/virgl/virgl_context.h | 6 ++++++
> > 2 files changed, 24 insertions(+), 8 deletions(-)
> >
> > diff --git a/src/gallium/drivers/virgl/virgl_context.c
> > b/src/gallium/drivers/virgl/virgl_context.c
> > index f095920489f..6ed4e2f8394 100644
> > --- a/src/gallium/drivers/virgl/virgl_context.c
> > +++ b/src/gallium/drivers/virgl/virgl_context.c
> > @@ -322,19 +322,27 @@ static void
> > *virgl_create_rasterizer_state(struct pipe_context *ctx,
> > const struct
> > pipe_rasterizer_state *rs_state)
> > {
> > struct virgl_context *vctx = virgl_context(ctx);
> > - uint32_t handle;
> > - handle = virgl_object_assign_handle();
> > + struct virgl_rasterizer_state *vrs =
> > CALLOC_STRUCT(virgl_rasterizer_state);
> >
> > - virgl_encode_rasterizer_state(vctx, handle, rs_state);
> > - return (void *)(unsigned long)handle;
> > + if (!vrs)
> > + return NULL;
> > + vrs->rs = *rs_state;
> > + vrs->handle = virgl_object_assign_handle();
> > +
> > + virgl_encode_rasterizer_state(vctx, vrs->handle, rs_state);
> > + return (void *)vrs;
> > }
> >
> > 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;
> > -
> > + uint32_t handle = 0;
> > + if (rs_state) {
> > + struct virgl_rasterizer_state *vrs = rs_state;
> > + vctx->rs_state = *vrs;
> > + handle = vrs->handle;
> > + }
> > virgl_encode_bind_object(vctx, handle,
> > VIRGL_OBJECT_RASTERIZER);
> > }
> >
> > @@ -342,8 +350,9 @@ static void
> > virgl_delete_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_delete_object(vctx, handle,
> > VIRGL_OBJECT_RASTERIZER);
> > + struct virgl_rasterizer_state *vrs = rs_state;
> > + virgl_encode_delete_object(vctx, vrs->handle,
> > VIRGL_OBJECT_RASTERIZER);
> > + FREE(vrs);
> > }
> >
> > static void virgl_set_framebuffer_state(struct pipe_context *ctx,
> > @@ -695,6 +704,7 @@ static void virgl_draw_vbo(struct pipe_context
> > *ctx,
> > return;
> >
> > if (!(rs->caps.caps.v1.prim_mask & (1 << dinfo->mode))) {
> > + util_primconvert_save_rasterizer_state(vctx->primconvert,
> > &vctx->rs_state.rs);
> > util_primconvert_draw_vbo(vctx->primconvert, dinfo);
> > return;
> > }
> > diff --git a/src/gallium/drivers/virgl/virgl_context.h
> > b/src/gallium/drivers/virgl/virgl_context.h
> > index 0f51d730985..79a1a73e615 100644
> > --- a/src/gallium/drivers/virgl/virgl_context.h
> > +++ b/src/gallium/drivers/virgl/virgl_context.h
> > @@ -49,6 +49,11 @@ struct virgl_textures_info {
> > uint32_t enabled_mask;
> > };
> >
> > +struct virgl_rasterizer_state {
> > + struct pipe_rasterizer_state rs;
> > + uint32_t handle;
> > +};
> > +
> > struct virgl_context {
> > struct pipe_context base;
> > struct virgl_cmd_buf *cbuf;
> > @@ -66,6 +71,7 @@ struct virgl_context {
> > unsigned num_vertex_buffers;
> > boolean vertex_array_dirty;
> >
> > + struct virgl_rasterizer_state rs_state;
> > struct virgl_so_target so_targets[PIPE_MAX_SO_BUFFERS];
> > unsigned num_so_targets;
> >
>
> _______________________________________________
> 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