virgl: use primconvert provoking vertex properly
authorDave Airlie <airlied@redhat.com>
Fri, 28 Dec 2018 06:21:23 +0000 (16:21 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 8 Jan 2019 02:06:41 +0000 (12:06 +1000)
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>
src/gallium/drivers/virgl/virgl_context.c
src/gallium/drivers/virgl/virgl_context.h

index f095920489f39e8cc770f3a3516de5f345b2cd50..6ed4e2f839466d5dd566b54fe31417c3656ff70b 100644 (file)
@@ -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;
    }
index 0f51d730985dc3f63c902397e5bd8b728e88018c..79a1a73e615fe68488cc253b8bb2136e8f3338ba 100644 (file)
@@ -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;