summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2015-06-27 13:57:06 +0200
committerMarek Olšák <marek.olsak@amd.com>2015-07-05 15:08:59 +0200
commit872ede6fd136c7f9701cc60268ab195a48e75e67 (patch)
tree4a8019c186c346ae7f4fa94a7238696cf0507c79
parent5a69929683b15d48e4f2fd47e2c816e716ab60ef (diff)
st/mesa: if a fence isn't returned, assume it's signalled
The reason might be that no commands have been submitted before the flush and the GPU is idle.
-rw-r--r--src/mesa/state_tracker/st_cb_syncobj.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/mesa/state_tracker/st_cb_syncobj.c b/src/mesa/state_tracker/st_cb_syncobj.c
index d23c93d98d8..ec2687fba53 100644
--- a/src/mesa/state_tracker/st_cb_syncobj.c
+++ b/src/mesa/state_tracker/st_cb_syncobj.c
@@ -81,7 +81,13 @@ static void st_check_sync(struct gl_context *ctx, struct gl_sync_object *obj)
struct pipe_screen *screen = st_context(ctx)->pipe->screen;
struct st_sync_object *so = (struct st_sync_object*)obj;
- if (so->fence && screen->fence_finish(screen, so->fence, 0)) {
+ /* If the fence doesn't exist, assume it's signalled. */
+ if (!so->fence) {
+ so->b.StatusFlag = GL_TRUE;
+ return;
+ }
+
+ if (screen->fence_finish(screen, so->fence, 0)) {
screen->fence_reference(screen, &so->fence, NULL);
so->b.StatusFlag = GL_TRUE;
}
@@ -94,6 +100,12 @@ static void st_client_wait_sync(struct gl_context *ctx,
struct pipe_screen *screen = st_context(ctx)->pipe->screen;
struct st_sync_object *so = (struct st_sync_object*)obj;
+ /* If the fence doesn't exist, assume it's signalled. */
+ if (!so->fence) {
+ so->b.StatusFlag = GL_TRUE;
+ return;
+ }
+
/* We don't care about GL_SYNC_FLUSH_COMMANDS_BIT, because flush is
* already called when creating a fence. */