OSDN Git Service

start moving is synced check into winsys
authorDave Airlie <airlied@redhat.com>
Wed, 29 Jun 2016 06:27:10 +0000 (16:27 +1000)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Sun, 14 Aug 2016 17:31:16 +0000 (01:31 +0800)
12 files changed:
src/gallium/drivers/virgl/virgl_buffer.c
src/gallium/drivers/virgl/virgl_context.c
src/gallium/drivers/virgl/virgl_query.c
src/gallium/drivers/virgl/virgl_resource.c
src/gallium/drivers/virgl/virgl_resource.h
src/gallium/drivers/virgl/virgl_streamout.c
src/gallium/drivers/virgl/virgl_texture.c
src/gallium/drivers/virgl/virgl_winsys.h
src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
src/gallium/winsys/virgl/drm/virgl_drm_winsys.h
src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h

index 9403407..1dc183c 100644 (file)
@@ -106,7 +106,6 @@ static void virgl_buffer_transfer_unmap(struct pipe_context *ctx,
    if (trans->base.usage & PIPE_TRANSFER_WRITE) {
       if (!(transfer->usage & PIPE_TRANSFER_FLUSH_EXPLICIT)) {
          struct virgl_screen *vs = virgl_screen(ctx->screen);
-         vbuf->base.clean = FALSE;
          vctx->num_transfers++;
          vs->vws->transfer_put(vs->vws, vbuf->base.hw_res,
                                &transfer->box, trans->base.stride, trans->base.layer_stride, trans->offset, transfer->level);
@@ -134,8 +133,6 @@ static void virgl_buffer_transfer_flush_region(struct pipe_context *ctx,
 
    util_range_add(&vbuf->valid_buffer_range, transfer->box.x + box->x,
                   transfer->box.x + box->x + box->width);
-
-   vbuf->base.clean = FALSE;
 }
 
 static const struct u_resource_vtbl virgl_buffer_vtbl =
@@ -155,7 +152,6 @@ struct pipe_resource *virgl_buffer_create(struct virgl_screen *vs,
    uint32_t size;
    uint32_t vbind;
    buf = CALLOC_STRUCT(virgl_buffer);
-   buf->base.clean = TRUE;
    buf->base.u.b = *template;
    buf->base.u.b.screen = &vs->base;
    buf->base.u.vtbl = &virgl_buffer_vtbl;
index cdb43e3..f61cafb 100644 (file)
@@ -200,7 +200,6 @@ static struct pipe_surface *virgl_create_surface(struct pipe_context *ctx,
    if (!surf)
       return NULL;
 
-   res->clean = FALSE;
    handle = virgl_object_assign_handle();
    pipe_reference_init(&surf->base.reference, 1);
    pipe_resource_reference(&surf->base.texture, resource);
@@ -460,8 +459,6 @@ void virgl_transfer_inline_write(struct pipe_context *ctx,
    struct virgl_resource *grres = virgl_resource(res);
    struct virgl_buffer *vbuf = virgl_buffer(res);
 
-   grres->clean = FALSE;
-
    if (virgl_res_needs_flush_wait(vctx, &vbuf->base, usage)) {
       ctx->flush(ctx, NULL, 0);
 
@@ -820,7 +817,6 @@ static void virgl_resource_copy_region(struct pipe_context *ctx,
    struct virgl_resource *dres = virgl_resource(dst);
    struct virgl_resource *sres = virgl_resource(src);
 
-   dres->clean = FALSE;
    virgl_encode_resource_copy_region(vctx, dres,
                                     dst_level, dstx, dsty, dstz,
                                     sres, src_level,
@@ -840,7 +836,6 @@ static void virgl_blit(struct pipe_context *ctx,
    struct virgl_resource *dres = virgl_resource(blit->dst.resource);
    struct virgl_resource *sres = virgl_resource(blit->src.resource);
 
-   dres->clean = FALSE;
    virgl_encode_blit(vctx, dres, sres,
                     blit);
 }
index 4ddb925..0f49b06 100644 (file)
@@ -78,7 +78,6 @@ static struct pipe_query *virgl_create_query(struct pipe_context *ctx,
    query->type = query_type;
    query->index = index;
    query->handle = handle;
-   query->buf->clean = FALSE;
    virgl_encoder_create_query(vctx, handle, query_type, index, query->buf, 0);
 
    return (struct pipe_query *)query;
@@ -102,7 +101,6 @@ static boolean virgl_begin_query(struct pipe_context *ctx,
    struct virgl_context *vctx = virgl_context(ctx);
    struct virgl_query *query = virgl_query(q);
 
-   query->buf->clean = FALSE;
    virgl_encoder_begin_query(vctx, query->handle);
    return true;
 }
index 51e2769..9d806e0 100644 (file)
@@ -41,8 +41,9 @@ bool virgl_res_needs_readback(struct virgl_context *vctx,
                               struct virgl_resource *res,
                               unsigned usage)
 {
+   struct virgl_screen *vs = virgl_screen(vctx->base.screen);
    bool readback = true;
-   if (res->clean)
+   if (vs->vws->res_is_synced(vs->vws, res->hw_res))
       readback = false;
    else if (usage & PIPE_TRANSFER_DISCARD_RANGE)
       readback = false;
index bab9bcb..1affc47 100644 (file)
@@ -39,7 +39,6 @@ struct virgl_context;
 struct virgl_resource {
    struct u_resource u;
    struct virgl_hw_res *hw_res;
-   boolean clean;
 };
 
 struct virgl_buffer {
index b6a65ff..589aab9 100644 (file)
@@ -48,7 +48,6 @@ static struct pipe_stream_output_target *virgl_create_so_target(
    t->base.buffer_offset = buffer_offset;
    t->base.buffer_size = buffer_size;
    t->handle = handle;
-   res->clean = FALSE;
    virgl_encoder_create_so_target(vctx, handle, res, buffer_offset, buffer_size);
    return &t->base;
 }
index 34db056..c8e8866 100644 (file)
@@ -224,7 +224,6 @@ static void virgl_texture_transfer_unmap(struct pipe_context *ctx,
    if (trans->base.usage & PIPE_TRANSFER_WRITE) {
       if (!(transfer->usage & PIPE_TRANSFER_FLUSH_EXPLICIT)) {
          struct virgl_screen *vs = virgl_screen(ctx->screen);
-         vtex->base.clean = FALSE;
          vctx->num_transfers++;
          vs->vws->transfer_put(vs->vws, vtex->base.hw_res,
                                &transfer->box, trans->base.stride, l_stride, trans->offset, transfer->level);
@@ -334,7 +333,6 @@ struct pipe_resource *virgl_texture_create(struct virgl_screen *vs,
    unsigned vbind;
 
    tex = CALLOC_STRUCT(virgl_texture);
-   tex->base.clean = TRUE;
    tex->base.u.b = *template;
    tex->base.u.b.screen = &vs->base;
    pipe_reference_init(&tex->base.u.b.reference, 1);
index 54a7ddb..c6dd9bf 100644 (file)
@@ -96,6 +96,9 @@ struct virgl_winsys {
                                 struct virgl_hw_res *res,
                                 enum virgl_bo_usage usage);
 
+   bool (*res_is_synced)(struct virgl_winsys *vws,
+                         struct virgl_hw_res *res);
+
    int (*get_caps)(struct virgl_winsys *vws, struct virgl_drm_caps *caps);
 
    /* fence */
index b556950..2e12353 100644 (file)
@@ -222,6 +222,7 @@ virgl_drm_winsys_resource_create(struct virgl_winsys *qws,
    res->stride = stride;
    pipe_reference_init(&res->reference, 1);
    res->num_cs_references = 0;
+   res->synced = true;
    return res;
 }
 
@@ -352,6 +353,7 @@ virgl_drm_winsys_resource_cache_create(struct virgl_winsys *qws,
 
    if (res) {
       LIST_DEL(&res->head);
+      res->synced = true;
       --qdws->num_delayed;
       pipe_mutex_unlock(qdws->mutex);
       pipe_reference_init(&res->reference, 1);
@@ -650,12 +652,21 @@ static void virgl_drm_emit_res(struct virgl_winsys *qws,
    if (write_buf)
       cbuf->base.buf[cbuf->base.cdw++] = res->res_handle;
 
+   if (usage & VIRGL_USAGE_WRITE)
+      res->synced = false;
+
    if (index_in_list == -1)
       virgl_drm_add_res(qdws, cbuf, res, usage);
    else
       cbuf->bo_usage[index_in_list] |= usage;
 }
 
+static bool virgl_drm_res_is_synced(struct virgl_winsys *qws,
+                                    struct virgl_hw_res *res)
+{
+   return res->synced;
+}
+
 static boolean virgl_drm_res_is_ref(struct virgl_winsys *qws,
                                     struct virgl_cmd_buf *_cbuf,
                                     struct virgl_hw_res *res,
@@ -814,7 +825,7 @@ virgl_drm_winsys_create(int drmFD)
    qdws->base.submit_cmd = virgl_drm_winsys_submit_cmd;
    qdws->base.emit_res = virgl_drm_emit_res;
    qdws->base.res_is_referenced = virgl_drm_res_is_ref;
-
+   qdws->base.res_is_synced = virgl_drm_res_is_synced;
    qdws->base.cs_create_fence = virgl_cs_create_fence;
    qdws->base.fence_wait = virgl_fence_wait;
    qdws->base.fence_reference = virgl_fence_reference;
index 099f46f..13b6251 100644 (file)
@@ -50,6 +50,8 @@ struct virgl_hw_res {
    int64_t start, end;
    boolean flinked;
    uint32_t flink;
+
+   bool synced; /* guest copy is synced with host copy */
 };
 
 struct virgl_drm_winsys
index f74bbb8..d958161 100644 (file)
@@ -520,6 +520,12 @@ static boolean virgl_vtest_res_is_ref(struct virgl_winsys *vws,
    return TRUE;
 }
 
+static bool virgl_vtest_res_is_synced(struct virgl_winsys *vws,
+                                    struct virgl_hw_res *res)
+{
+   return res->synced;
+}
+
 static int virgl_vtest_get_caps(struct virgl_winsys *vws,
                                 struct virgl_drm_caps *caps)
 {
@@ -659,6 +665,7 @@ virgl_vtest_winsys_wrap(struct sw_winsys *sws)
 
    vtws->base.emit_res = virgl_vtest_emit_res;
    vtws->base.res_is_referenced = virgl_vtest_res_is_ref;
+   vtws->base.res_is_synced = virgl_vtest_res_is_synced;
    vtws->base.get_caps = virgl_vtest_get_caps;
 
    vtws->base.cs_create_fence = virgl_cs_create_fence;
index 570b442..e327d2c 100644 (file)
@@ -71,7 +71,7 @@ struct virgl_hw_res {
    uint32_t bind;
    boolean cacheable;
    int64_t start, end;
-
+   bool synced; /* remote copy is synced with host copy */
 };
 
 struct virgl_vtest_cmd_buf {