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 <gert.wollny@collabora.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user