diff options
author | Rob Clark <[email protected]> | 2015-09-02 23:13:33 -0700 |
---|---|---|
committer | Thomas Hellstrom <[email protected]> | 2015-09-07 01:25:08 -0700 |
commit | 1432a182414352e853bfdad997591598e621fd73 (patch) | |
tree | a619a9cd193f98f23385bc15b4caedb56338ccf3 | |
parent | 00c568f679413ee627421d5724beb85be3da55c1 (diff) |
xa: add xa_surface_from_handle2 v2
Like xa_surface_from_handle(), but takes a handle type, rather than
hard-coding 'shared' handle. This is needed to fix bugs seen with
xf86-video-freedreno with xrandr rotation, for example. The root issue
is that doing a GEM_OPEN ioctl on a bo that already has a GEM handle
associated with the drm_file will result in two unique handles for the
same bo. Which causes all sorts of follow-on fail.
v2:
- Add support for for fd handles.
- Avoid duplicating code.
- Bump xa version minor.
Signed-off-by: Rob Clark <[email protected]>
Signed-off-by: Thomas Hellstrom <[email protected]>
-rw-r--r-- | src/gallium/state_trackers/xa/xa_tracker.c | 41 | ||||
-rw-r--r-- | src/gallium/state_trackers/xa/xa_tracker.h | 14 | ||||
-rw-r--r-- | src/gallium/targets/xa/xa.sym | 1 |
3 files changed, 45 insertions, 11 deletions
diff --git a/src/gallium/state_trackers/xa/xa_tracker.c b/src/gallium/state_trackers/xa/xa_tracker.c index 21ca57ca633..2944b16858c 100644 --- a/src/gallium/state_trackers/xa/xa_tracker.c +++ b/src/gallium/state_trackers/xa/xa_tracker.c @@ -298,6 +298,20 @@ xa_format_check_supported(struct xa_tracker *xa, return XA_ERR_NONE; } +static unsigned +handle_type(enum xa_handle_type type) +{ + switch (type) { + case xa_handle_type_kms: + return DRM_API_HANDLE_TYPE_KMS; + case xa_handle_type_fd: + return DRM_API_HANDLE_TYPE_FD; + case xa_handle_type_shared: + default: + return DRM_API_HANDLE_TYPE_SHARED; + } +} + static struct xa_surface * surface_create(struct xa_tracker *xa, int width, @@ -380,9 +394,24 @@ xa_surface_from_handle(struct xa_tracker *xa, enum xa_formats xa_format, unsigned int flags, uint32_t handle, uint32_t stride) { + return xa_surface_from_handle2(xa, width, height, depth, stype, xa_format, + DRM_API_HANDLE_TYPE_SHARED, flags, handle, + stride); +} + +XA_EXPORT struct xa_surface * +xa_surface_from_handle2(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_handle_type type, + uint32_t handle, uint32_t stride) +{ struct winsys_handle whandle; memset(&whandle, 0, sizeof(whandle)); - whandle.type = DRM_API_HANDLE_TYPE_SHARED; + whandle.type = handle_type(type); whandle.handle = handle; whandle.stride = stride; return surface_create(xa, width, height, depth, stype, xa_format, flags, &whandle); @@ -511,15 +540,7 @@ xa_surface_handle(struct xa_surface *srf, boolean res; memset(&whandle, 0, sizeof(whandle)); - switch (type) { - case xa_handle_type_kms: - whandle.type = DRM_API_HANDLE_TYPE_KMS; - break; - case xa_handle_type_shared: - default: - whandle.type = DRM_API_HANDLE_TYPE_SHARED; - break; - } + whandle.type = handle_type(type); res = screen->resource_get_handle(screen, srf->tex, &whandle); if (!res) return -XA_ERR_INVAL; diff --git a/src/gallium/state_trackers/xa/xa_tracker.h b/src/gallium/state_trackers/xa/xa_tracker.h index 5c6435e19c1..44b3eb5cbe4 100644 --- a/src/gallium/state_trackers/xa/xa_tracker.h +++ b/src/gallium/state_trackers/xa/xa_tracker.h @@ -37,7 +37,7 @@ #include <stdint.h> #define XA_TRACKER_VERSION_MAJOR 2 -#define XA_TRACKER_VERSION_MINOR 2 +#define XA_TRACKER_VERSION_MINOR 3 #define XA_TRACKER_VERSION_PATCH 0 #define XA_FLAG_SHARED (1 << 0) @@ -149,6 +149,7 @@ struct xa_box { enum xa_handle_type { xa_handle_type_shared, xa_handle_type_kms, + xa_handle_type_fd, }; extern void xa_tracker_version(int *major, int *minor, int *patch); @@ -177,6 +178,17 @@ extern struct xa_surface * xa_surface_from_handle(struct xa_tracker *xa, enum xa_formats pform, unsigned int flags, uint32_t handle, uint32_t stride); +extern struct xa_surface * +xa_surface_from_handle2(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_handle_type type, + uint32_t handle, + uint32_t stride); enum xa_formats xa_surface_format(const struct xa_surface *srf); diff --git a/src/gallium/targets/xa/xa.sym b/src/gallium/targets/xa/xa.sym index 9c7f422f399..50ccc99cb48 100644 --- a/src/gallium/targets/xa/xa.sym +++ b/src/gallium/targets/xa/xa.sym @@ -23,6 +23,7 @@ xa_surface_dma; xa_surface_format; xa_surface_from_handle; + xa_surface_from_handle2; xa_surface_handle; xa_surface_map; xa_surface_redefine; |