summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2018-12-28 16:21:23 +1000
committerDave Airlie <[email protected]>2019-01-08 12:06:41 +1000
commit4298a85ae8b54ac323cdc0518bf58be8d39650f9 (patch)
tree496f969efd5782ce649652c00da77c7172a95bde
parent754eff07d228c5100c575c24668670284a9585d1 (diff)
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 <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
-rw-r--r--src/gallium/drivers/virgl/virgl_context.c26
-rw-r--r--src/gallium/drivers/virgl/virgl_context.h6
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;