summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/xa
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/xa')
-rw-r--r--src/gallium/state_trackers/xa/xa_tracker.c41
-rw-r--r--src/gallium/state_trackers/xa/xa_tracker.h9
2 files changed, 46 insertions, 4 deletions
diff --git a/src/gallium/state_trackers/xa/xa_tracker.c b/src/gallium/state_trackers/xa/xa_tracker.c
index 3410144141d..b49f0d9e18d 100644
--- a/src/gallium/state_trackers/xa/xa_tracker.c
+++ b/src/gallium/state_trackers/xa/xa_tracker.c
@@ -279,13 +279,14 @@ xa_format_check_supported(struct xa_tracker *xa,
return XA_ERR_NONE;
}
-XA_EXPORT struct xa_surface *
-xa_surface_create(struct xa_tracker *xa,
+static struct xa_surface *
+surface_create(struct xa_tracker *xa,
int width,
int height,
int depth,
enum xa_surface_type stype,
- enum xa_formats xa_format, unsigned int flags)
+ enum xa_formats xa_format, unsigned int flags,
+ struct winsys_handle *whandle)
{
struct pipe_resource *template;
struct xa_surface *srf;
@@ -320,7 +321,10 @@ xa_surface_create(struct xa_tracker *xa,
if (flags & XA_FLAG_SCANOUT)
template->bind |= PIPE_BIND_SCANOUT;
- srf->tex = xa->screen->resource_create(xa->screen, template);
+ if (whandle)
+ srf->tex = xa->screen->resource_from_handle(xa->screen, template, whandle);
+ else
+ srf->tex = xa->screen->resource_create(xa->screen, template);
if (!srf->tex)
goto out_no_tex;
@@ -334,6 +338,35 @@ xa_surface_create(struct xa_tracker *xa,
return NULL;
}
+
+XA_EXPORT struct xa_surface *
+xa_surface_create(struct xa_tracker *xa,
+ int width,
+ int height,
+ int depth,
+ enum xa_surface_type stype,
+ enum xa_formats xa_format, unsigned int flags)
+{
+ return surface_create(xa, width, height, depth, stype, xa_format, flags, NULL);
+}
+
+
+XA_EXPORT struct xa_surface *
+xa_surface_from_handle(struct xa_tracker *xa,
+ int width,
+ int height,
+ int depth,
+ enum xa_surface_type stype,
+ enum xa_formats xa_format, unsigned int flags,
+ uint32_t handle, uint32_t stride)
+{
+ struct winsys_handle whandle;
+ memset(&whandle, 0, sizeof(whandle));
+ whandle.handle = handle;
+ whandle.stride = stride;
+ return surface_create(xa, width, height, depth, stype, xa_format, flags, &whandle);
+}
+
XA_EXPORT int
xa_surface_redefine(struct xa_surface *srf,
int width,
diff --git a/src/gallium/state_trackers/xa/xa_tracker.h b/src/gallium/state_trackers/xa/xa_tracker.h
index ffe24f7ba15..13486219562 100644
--- a/src/gallium/state_trackers/xa/xa_tracker.h
+++ b/src/gallium/state_trackers/xa/xa_tracker.h
@@ -160,6 +160,15 @@ extern struct xa_surface *xa_surface_create(struct xa_tracker *xa,
enum xa_formats pform,
unsigned int flags);
+extern struct xa_surface * xa_surface_from_handle(struct xa_tracker *xa,
+ int width,
+ int height,
+ int depth,
+ enum xa_surface_type stype,
+ enum xa_formats pform,
+ unsigned int flags,
+ uint32_t handle, uint32_t stride);
+
enum xa_formats xa_surface_format(const struct xa_surface *srf);
extern void xa_surface_destroy(struct xa_surface *srf);