From 4298a85ae8b54ac323cdc0518bf58be8d39650f9 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Fri, 28 Dec 2018 16:21:23 +1000 Subject: [PATCH] virgl: use primconvert provoking vertex properly This stores the raster state and calls the correct primconvert interface using the currently bound raster state. Reviewed-By: Gert Wollny Signed-off-by: Dave Airlie --- 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; -- 2.30.2