summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2015-11-30 19:30:06 +0100
committerMarc-André Lureau <marcandre.lureau@gmail.com>2015-12-01 22:06:49 +0100
commitc691d95167e9a992f59d1f3cac38932629663480 (patch)
treef385e496d1c9b789cb6f7ed16f883737d8936de6
parent1fecc5987acc61660fe85011260c4a32ca6a2d2f (diff)
swapswap
-rw-r--r--src/virglrenderer.c5
-rw-r--r--src/virglrenderer.h3
-rw-r--r--src/vrend_renderer.c60
-rw-r--r--src/vrend_renderer.h2
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,