diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2015-11-30 19:30:06 +0100 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@gmail.com> | 2015-12-01 22:06:49 +0100 |
commit | c691d95167e9a992f59d1f3cac38932629663480 (patch) | |
tree | f385e496d1c9b789cb6f7ed16f883737d8936de6 | |
parent | 1fecc5987acc61660fe85011260c4a32ca6a2d2f (diff) |
swapswap
-rw-r--r-- | src/virglrenderer.c | 5 | ||||
-rw-r--r-- | src/virglrenderer.h | 3 | ||||
-rw-r--r-- | src/vrend_renderer.c | 60 | ||||
-rw-r--r-- | src/vrend_renderer.h | 2 |
4 files changed, 69 insertions, 1 deletions
diff --git a/src/virglrenderer.c b/src/virglrenderer.c index ea382db..08ade1f 100644 --- a/src/virglrenderer.c +++ b/src/virglrenderer.c @@ -169,6 +169,11 @@ int virgl_renderer_resource_get_info(int res_handle, return ret; } +int virgl_renderer_resource_swap(int res_handle) +{ + return vrend_renderer_resource_swap(res_handle); +} + void virgl_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver, uint32_t *max_size) { diff --git a/src/virglrenderer.h b/src/virglrenderer.h index 8794dd6..4508789 100644 --- a/src/virglrenderer.h +++ b/src/virglrenderer.h @@ -163,4 +163,7 @@ VIRGL_EXPORT void virgl_renderer_cleanup(void *cookie); /* reset the rendererer - destroy all contexts and resource */ VIRGL_EXPORT void virgl_renderer_reset(void); + +VIRGL_EXPORT int virgl_renderer_resource_swap(int res_handle); + #endif diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 0525acd..6ba3d31 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -3742,7 +3742,10 @@ static int check_resource_valid(struct vrend_renderer_resource_create_args *args } return 0; } -int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *args, struct iovec *iov, uint32_t num_iovs) + +int vrend_resource_create(struct vrend_renderer_resource_create_args *args, + struct iovec *iov, uint32_t num_iovs, + struct vrend_resource **res) { struct vrend_resource *gr; int level; @@ -3887,11 +3890,26 @@ int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *a gt->cur_swizzle_r = gt->cur_swizzle_g = gt->cur_swizzle_b = gt->cur_swizzle_a = -1; } + *res = gr; + + return 0; +} + +int vrend_renderer_resource_create(struct vrend_renderer_resource_create_args *args, struct iovec *iov, uint32_t num_iovs) +{ + struct vrend_resource *gr = NULL; + int ret; + + ret = vrend_resource_create(args, iov, num_iovs, &gr); + if (ret) + return ret; + ret = vrend_resource_insert(gr, sizeof(*gr), args->handle); if (ret == 0) { vrend_renderer_resource_destroy(gr, true); return ENOMEM; } + return 0; } @@ -5871,6 +5889,46 @@ int vrend_renderer_resource_get_info(int res_handle, return 0; } +int vrend_renderer_resource_swap(int res_handle) +{ + struct vrend_resource *res, *gr = NULL; + struct vrend_renderer_resource_create_args args = { 0, }; + struct iovec *iov; + uint32_t num_iovs; + int ret; + + res = vrend_resource_lookup(res_handle, 0); + if (!res) + return EINVAL; + + if (res->target != GL_TEXTURE_2D) + return EINVAL; + + args.handle = res->handle; + args.target = PIPE_TEXTURE_2D; + args.format = res->base.format; + args.width = res->base.width0; + args.height = res->base.height0; + args.depth = res->base.depth0; + args.array_size = res->base.array_size; + args.last_level = res->base.last_level; + args.nr_samples = res->base.nr_samples; + args.bind = VREND_RES_BIND_SAMPLER_VIEW; + iov = res->iov; + num_iovs = res->num_iovs; + if (res->y_0_top) + args.flags |= VIRGL_RESOURCE_Y_0_TOP; + + ret = vrend_resource_create(&args, iov, num_iovs, &gr); + if (ret) + return ret; + + res->id = gr->id; + FREE(gr); + + return 0; +} + void vrend_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver, uint32_t *max_size) { diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h index ee26993..4172c4e 100644 --- a/src/vrend_renderer.h +++ b/src/vrend_renderer.h @@ -348,6 +348,8 @@ struct vrend_renderer_resource_info { int vrend_renderer_resource_get_info(int res_handle, struct vrend_renderer_resource_info *info); +int vrend_renderer_resource_swap(int res_handle); + #define VREND_CAP_SET 1 void vrend_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver, |