summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <basni@chromium.org>2017-12-21 14:17:14 +0100
committerchrome-bot <chrome-bot@chromium.org>2018-01-31 03:36:29 -0800
commitec23d1a68addc8082d004461e10bc903e8383251 (patch)
treee437260056fa5c8384fca776a6c620d87e408100 /src
parent68a70770125712bd69e92bab038dfd668169686f (diff)
UPSTREAM: radeonsi: Export signalled sync file instead of -1.
-1 is considered an error for EGL_ANDROID_native_fence_sync, so we need to actually create a sync file. Fixes: f536f45250 "radeonsi: implement sync_file import/export" Reviewed-by: Dave Airlie <airlied@redhat.com> (cherry picked from commit 5a3404d443e0c6e8e9a44d7f8dccf96c5ac18f0f) BUG=b:72449616 TESTED=Try play store in ARC with 4.14 kernel on Kahlee. Change-Id: Ib053b640e70a0fe529e5cea84fd4144f93c8c588 Reviewed-on: https://chromium-review.googlesource.com/886703 Commit-Ready: Bas Nieuwenhuizen <basni@chromium.org> Tested-by: Bas Nieuwenhuizen <basni@chromium.org> Tested-by: Benjamin Gordon <bmgordon@chromium.org> Reviewed-by: Chad Versace <chadversary@chromium.org> Reviewed-by: Benjamin Gordon <bmgordon@chromium.org>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/radeon/r600_pipe_common.c2
-rw-r--r--src/gallium/drivers/radeon/radeon_winsys.h5
-rw-r--r--src/gallium/winsys/amdgpu/drm/amdgpu_cs.c23
3 files changed, 30 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
index b77d85901f0..e5a31bbba71 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.c
+++ b/src/gallium/drivers/radeon/r600_pipe_common.c
@@ -410,6 +410,8 @@ static int r600_fence_get_fd(struct pipe_screen *screen,
/* If we don't have FDs at this point, it means we don't have fences
* either. */
+ if (sdma_fd == -1 && gfx_fd == -1)
+ return ws->export_signalled_sync_file(ws);
if (sdma_fd == -1)
return gfx_fd;
if (gfx_fd == -1)
diff --git a/src/gallium/drivers/radeon/radeon_winsys.h b/src/gallium/drivers/radeon/radeon_winsys.h
index 2d3f646dc65..206c299ac4c 100644
--- a/src/gallium/drivers/radeon/radeon_winsys.h
+++ b/src/gallium/drivers/radeon/radeon_winsys.h
@@ -610,6 +610,11 @@ struct radeon_winsys {
struct pipe_fence_handle *fence);
/**
+ * Return a sync file FD that is already signalled.
+ */
+ int (*export_signalled_sync_file)(struct radeon_winsys *ws);
+
+ /**
* Initialize surface
*
* \param ws The winsys this function is called from.
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
index 8f43e936469..2b45c2c7091 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
@@ -113,6 +113,28 @@ static int amdgpu_fence_export_sync_file(struct radeon_winsys *rws,
return fd;
}
+static int amdgpu_export_signalled_sync_file(struct radeon_winsys *rws)
+{
+ struct amdgpu_winsys *ws = amdgpu_winsys(rws);
+ uint32_t syncobj;
+ int fd = -1;
+
+ int r = amdgpu_cs_create_syncobj2(ws->dev, DRM_SYNCOBJ_CREATE_SIGNALED,
+ &syncobj);
+ if (r) {
+ return -1;
+ }
+
+ r = amdgpu_cs_syncobj_export_sync_file(ws->dev, syncobj, &fd);
+ if (r) {
+ fd = -1;
+ }
+
+ amdgpu_cs_destroy_syncobj(ws->dev, syncobj);
+ return fd;
+}
+
+
static void amdgpu_fence_submitted(struct pipe_fence_handle *fence,
uint64_t seq_no,
uint64_t *user_fence_cpu_address)
@@ -1552,4 +1574,5 @@ void amdgpu_cs_init_functions(struct amdgpu_winsys *ws)
ws->base.fence_reference = amdgpu_fence_reference;
ws->base.fence_import_sync_file = amdgpu_fence_import_sync_file;
ws->base.fence_export_sync_file = amdgpu_fence_export_sync_file;
+ ws->base.export_signalled_sync_file = amdgpu_export_signalled_sync_file;
}