summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorItalo Nicola <italonicola@collabora.com>2021-07-05 06:22:16 -0300
committerMarge Bot <emma+marge@anholt.net>2021-12-11 17:49:00 +0000
commit0577a142de513a577107f03b230f6554607394e3 (patch)
tree1b5d372776902795a6e41f29359f1e72e6dfc1ab
parentb6d04470272666de9cba86326e544436ee7eebb5 (diff)
virgl/vtest: implement resource_create_front
This is required for glXCopySubBufferMESA to work. Signed-off-by: Italo Nicola <italonicola@collabora.com> Reviewed-by: Gert Wollny <gert.wollny@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11714>
-rw-r--r--src/gallium/drivers/virgl/tests/virgl_staging_mgr_test.cpp2
-rw-r--r--src/gallium/drivers/virgl/virgl_resource.c14
-rw-r--r--src/gallium/drivers/virgl/virgl_staging_mgr.c1
-rw-r--r--src/gallium/drivers/virgl/virgl_winsys.h13
-rw-r--r--src/gallium/winsys/virgl/drm/virgl_drm_winsys.c1
-rw-r--r--src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c27
6 files changed, 45 insertions, 13 deletions
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 a475ff408b4..d32fc1643a5 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 c5e8a96de2e..5dc8253bf37 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 b6f52090310..947f343bd7f 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 dfbd10f4261..615b78cb0c8 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 d762542113a..75bd890f9d0 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 1d7fb623118..b69b9ceee16 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);