From: Italo Nicola Date: Mon, 5 Jul 2021 09:22:16 +0000 (-0300) Subject: virgl/vtest: implement resource_create_front X-Git-Tag: upstream/22.3.5~14871 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0577a142de513a577107f03b230f6554607394e3;p=platform%2Fupstream%2Fmesa.git virgl/vtest: implement resource_create_front This is required for glXCopySubBufferMESA to work. Signed-off-by: Italo Nicola Reviewed-by: Gert Wollny Part-of: --- diff --git a/src/gallium/drivers/virgl/tests/virgl_staging_mgr_test.cpp b/src/gallium/drivers/virgl/tests/virgl_staging_mgr_test.cpp index a475ff4..d32fc16 100644 --- a/src/gallium/drivers/virgl/tests/virgl_staging_mgr_test.cpp +++ b/src/gallium/drivers/virgl/tests/virgl_staging_mgr_test.cpp @@ -43,6 +43,7 @@ struct virgl_hw_res { static struct virgl_hw_res * fake_resource_create(struct virgl_winsys *vws, enum pipe_texture_target target, + const void *map_front_private, uint32_t format, uint32_t bind, uint32_t width, uint32_t height, uint32_t depth, uint32_t array_size, @@ -316,6 +317,7 @@ TEST_F(VirglStagingMgr, releases_resource_on_destruction) static struct virgl_hw_res * failing_resource_create(struct virgl_winsys *vws, enum pipe_texture_target target, + const void *map_front_private, uint32_t format, uint32_t bind, uint32_t width, uint32_t height, uint32_t depth, uint32_t array_size, diff --git a/src/gallium/drivers/virgl/virgl_resource.c b/src/gallium/drivers/virgl/virgl_resource.c index c5e8a96..5dc8253 100644 --- a/src/gallium/drivers/virgl/virgl_resource.c +++ b/src/gallium/drivers/virgl/virgl_resource.c @@ -402,6 +402,7 @@ virgl_resource_realloc(struct virgl_context *vctx, struct virgl_resource *res) vflags = pipe_to_virgl_flags(vs, templ->flags); hw_res = vs->vws->resource_create(vs->vws, templ->target, + NULL, templ->format, vbind, templ->width0, @@ -567,8 +568,9 @@ static void virgl_resource_layout(struct pipe_resource *pt, metadata->total_size = 0; } -static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen, - const struct pipe_resource *templ) +static struct pipe_resource *virgl_resource_create_front(struct pipe_screen *screen, + const struct pipe_resource *templ, + const void *map_front_private) { unsigned vbind, vflags; struct virgl_screen *vs = virgl_screen(screen); @@ -600,6 +602,7 @@ static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen, alloc_size = res->metadata.total_size; res->hw_res = vs->vws->resource_create(vs->vws, templ->target, + map_front_private, templ->format, vbind, templ->width0, templ->height0, @@ -627,6 +630,12 @@ static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen, } +static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen, + const struct pipe_resource *templ) +{ + return virgl_resource_create_front(screen, templ, NULL); +} + static struct pipe_resource *virgl_resource_from_handle(struct pipe_screen *screen, const struct pipe_resource *templ, struct winsys_handle *whandle, @@ -715,6 +724,7 @@ static struct pipe_resource *virgl_resource_from_handle(struct pipe_screen *scre void virgl_init_screen_resource_functions(struct pipe_screen *screen) { + screen->resource_create_front = virgl_resource_create_front; screen->resource_create = virgl_resource_create; screen->resource_from_handle = virgl_resource_from_handle; screen->resource_get_handle = virgl_resource_get_handle; diff --git a/src/gallium/drivers/virgl/virgl_staging_mgr.c b/src/gallium/drivers/virgl/virgl_staging_mgr.c index b6f5209..947f343 100644 --- a/src/gallium/drivers/virgl/virgl_staging_mgr.c +++ b/src/gallium/drivers/virgl/virgl_staging_mgr.c @@ -47,6 +47,7 @@ virgl_staging_alloc_buffer(struct virgl_staging_mgr *staging, unsigned min_size) staging->hw_res = vws->resource_create(vws, PIPE_BUFFER, + NULL, PIPE_FORMAT_R8_UNORM, VIRGL_BIND_STAGING, size, /* width */ diff --git a/src/gallium/drivers/virgl/virgl_winsys.h b/src/gallium/drivers/virgl/virgl_winsys.h index dfbd10f..615b78c 100644 --- a/src/gallium/drivers/virgl/virgl_winsys.h +++ b/src/gallium/drivers/virgl/virgl_winsys.h @@ -65,12 +65,13 @@ struct virgl_winsys { uint32_t buf_offset, uint32_t level); struct virgl_hw_res *(*resource_create)(struct virgl_winsys *vws, - enum pipe_texture_target target, - uint32_t format, uint32_t bind, - uint32_t width, uint32_t height, - uint32_t depth, uint32_t array_size, - uint32_t last_level, uint32_t nr_samples, - uint32_t flags, uint32_t size); + enum pipe_texture_target target, + const void *map_front_private, + uint32_t format, uint32_t bind, + uint32_t width, uint32_t height, + uint32_t depth, uint32_t array_size, + uint32_t last_level, uint32_t nr_samples, + uint32_t flags, uint32_t size); void (*resource_reference)(struct virgl_winsys *qws, struct virgl_hw_res **dres, diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c index d762542..75bd890 100644 --- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c +++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c @@ -402,6 +402,7 @@ virgl_bo_transfer_get(struct virgl_winsys *vws, static struct virgl_hw_res * virgl_drm_winsys_resource_cache_create(struct virgl_winsys *qws, enum pipe_texture_target target, + const void *map_front_private, uint32_t format, uint32_t bind, uint32_t width, diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c index 1d7fb62..b69b9ce 100644 --- a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c +++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c @@ -224,6 +224,7 @@ static void virgl_vtest_resource_reference(struct virgl_winsys *vws, static struct virgl_hw_res * virgl_vtest_winsys_resource_create(struct virgl_winsys *vws, enum pipe_texture_target target, + const void *map_front_private, uint32_t format, uint32_t bind, uint32_t width, @@ -256,7 +257,7 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws, if (bind & (VIRGL_BIND_DISPLAY_TARGET | VIRGL_BIND_SCANOUT)) { res->dt = vtws->sws->displaytarget_create(vtws->sws, bind, format, - width, height, 64, NULL, + width, height, 64, map_front_private, &res->stride); } else if (vtws->protocol_version < 2) { @@ -279,6 +280,7 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws, if (vtws->protocol_version >= 2) { if (res->size == 0) { res->ptr = NULL; + res->res_handle = handle; goto out; } @@ -301,9 +303,21 @@ virgl_vtest_winsys_resource_create(struct virgl_winsys *vws, close(fd); } + res->res_handle = handle; + if (map_front_private && res->ptr && res->dt) { + void *dt_map = vtws->sws->displaytarget_map(vtws->sws, res->dt, PIPE_MAP_READ_WRITE); + uint32_t shm_stride = util_format_get_stride(res->format, res->width); + util_copy_rect(res->ptr, res->format, shm_stride, 0, 0, + res->width, res->height, dt_map, res->stride, 0, 0); + + struct pipe_box box; + u_box_2d(0, 0, res->width, res->height, &box); + virgl_vtest_transfer_put(vws, res, &box, res->stride, 0, 0, 0); + } + out: virgl_resource_cache_entry_init(&res->cache_entry, params); - res->res_handle = handle++; + handle++; pipe_reference_init(&res->reference, 1); p_atomic_set(&res->num_cs_references, 0); return res; @@ -350,6 +364,7 @@ static void virgl_vtest_resource_wait(struct virgl_winsys *vws, static struct virgl_hw_res * virgl_vtest_winsys_resource_cache_create(struct virgl_winsys *vws, enum pipe_texture_target target, + const void *map_front_private, uint32_t format, uint32_t bind, uint32_t width, @@ -392,9 +407,10 @@ virgl_vtest_winsys_resource_cache_create(struct virgl_winsys *vws, mtx_unlock(&vtws->mutex); alloc: - res = virgl_vtest_winsys_resource_create(vws, target, format, bind, - width, height, depth, array_size, - last_level, nr_samples, size); + res = virgl_vtest_winsys_resource_create(vws, target, map_front_private, + format, bind, width, height, depth, + array_size, last_level, nr_samples, + size); return res; } @@ -508,6 +524,7 @@ virgl_vtest_fence_create(struct virgl_winsys *vws) */ res = virgl_vtest_winsys_resource_create(vws, PIPE_BUFFER, + NULL, PIPE_FORMAT_R8_UNORM, VIRGL_BIND_CUSTOM, 8, 1, 1, 0, 0, 0, 8);