diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index be9b07c5f7b..51b98f07d28 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -832,6 +832,18 @@ zink_screen_usage_check_completion(struct zink_screen *screen, const struct zink return zink_screen_timeline_wait(screen, u->usage, 0); } +/* an even faster check that doesn't ioctl */ +bool +zink_screen_usage_check_completion_fast(struct zink_screen *screen, const struct zink_batch_usage *u) +{ + if (!zink_batch_usage_exists(u)) + return true; + if (zink_batch_usage_is_unflushed(u)) + return false; + + return zink_screen_check_last_finished(screen, u->usage); +} + bool zink_batch_usage_check_completion(struct zink_context *ctx, const struct zink_batch_usage *u) { diff --git a/src/gallium/drivers/zink/zink_batch.h b/src/gallium/drivers/zink/zink_batch.h index 0ee460ac3de..40872ce2551 100644 --- a/src/gallium/drivers/zink/zink_batch.h +++ b/src/gallium/drivers/zink/zink_batch.h @@ -115,6 +115,8 @@ zink_batch_usage_exists(const struct zink_batch_usage *u) bool zink_screen_usage_check_completion(struct zink_screen *screen, const struct zink_batch_usage *u); +bool +zink_screen_usage_check_completion_fast(struct zink_screen *screen, const struct zink_batch_usage *u); bool zink_batch_usage_check_completion(struct zink_context *ctx, const struct zink_batch_usage *u); diff --git a/src/gallium/drivers/zink/zink_bo.h b/src/gallium/drivers/zink/zink_bo.h index 42b1fc6437e..d48bea52cc1 100644 --- a/src/gallium/drivers/zink/zink_bo.h +++ b/src/gallium/drivers/zink/zink_bo.h @@ -173,6 +173,16 @@ zink_bo_usage_check_completion(struct zink_screen *screen, struct zink_bo *bo, e return true; } +static inline bool +zink_bo_usage_check_completion_fast(struct zink_screen *screen, struct zink_bo *bo, enum zink_resource_access access) +{ + if (access & ZINK_RESOURCE_ACCESS_READ && !zink_screen_usage_check_completion_fast(screen, bo->reads)) + return false; + if (access & ZINK_RESOURCE_ACCESS_WRITE && !zink_screen_usage_check_completion_fast(screen, bo->writes)) + return false; + return true; +} + static inline void zink_bo_usage_wait(struct zink_context *ctx, struct zink_bo *bo, enum zink_resource_access access) { diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h index d1eee2183b6..868e355f30e 100644 --- a/src/gallium/drivers/zink/zink_resource.h +++ b/src/gallium/drivers/zink/zink_resource.h @@ -141,6 +141,12 @@ zink_resource_usage_check_completion(struct zink_screen *screen, struct zink_res return zink_bo_usage_check_completion(screen, res->obj->bo, access); } +static inline bool +zink_resource_usage_check_completion_fast(struct zink_screen *screen, struct zink_resource *res, enum zink_resource_access access) +{ + return zink_bo_usage_check_completion_fast(screen, res->obj->bo, access); +} + static inline void zink_resource_usage_try_wait(struct zink_context *ctx, struct zink_resource *res, enum zink_resource_access access) {