diff options
Diffstat (limited to 'src/gallium/drivers/zink/zink_batch.h')
-rw-r--r-- | src/gallium/drivers/zink/zink_batch.h | 119 |
1 files changed, 15 insertions, 104 deletions
diff --git a/src/gallium/drivers/zink/zink_batch.h b/src/gallium/drivers/zink/zink_batch.h index 4b077646369..67ffa9e0b04 100644 --- a/src/gallium/drivers/zink/zink_batch.h +++ b/src/gallium/drivers/zink/zink_batch.h @@ -24,7 +24,8 @@ #ifndef ZINK_BATCH_H #define ZINK_BATCH_H -#include <vulkan/vulkan.h> +#include <vulkan/vulkan_core.h> +#include "zink_types.h" #include "util/list.h" #include "util/set.h" @@ -36,90 +37,6 @@ extern "C" { #endif -struct pipe_reference; - -struct zink_buffer_view; -struct zink_context; -struct zink_descriptor_set; -struct zink_image_view; -struct zink_program; -struct zink_render_pass; -struct zink_resource; -struct zink_sampler_view; -struct zink_surface; - -struct zink_batch_usage { - uint32_t usage; - cnd_t flush; - mtx_t mtx; - bool unflushed; -}; - -/* not real api don't use */ -bool -batch_ptr_add_usage(struct zink_batch *batch, struct set *s, void *ptr); - -struct zink_batch_state { - struct zink_fence fence; - - struct zink_batch_usage usage; - struct zink_context *ctx; - VkCommandPool cmdpool; - VkCommandBuffer cmdbuf; - VkCommandBuffer barrier_cmdbuf; - - VkQueue queue; //duplicated from batch for threading - VkSemaphore sem; - - struct util_queue_fence flush_completed; - - struct pipe_resource *flush_res; - - struct set *programs; - - struct set *resources; - struct set *surfaces; - struct set *bufferviews; - - struct util_dynarray unref_resources; - - struct util_dynarray persistent_resources; - struct util_dynarray zombie_samplers; - struct util_dynarray dead_framebuffers; - - struct set *active_queries; /* zink_query objects which were active at some point in this batch */ - - struct zink_batch_descriptor_data *dd; - - VkDeviceSize resource_size; - - /* this is a monotonic int used to disambiguate internal fences from their tc fence references */ - unsigned submit_count; - - bool is_device_lost; - bool have_timelines; - bool has_barriers; - bool scanout_flush; -}; - -struct zink_batch { - struct zink_batch_state *state; - - struct zink_batch_usage *last_batch_usage; - - unsigned work_count; - - bool has_work; - bool last_was_compute; - bool in_rp; //renderpass is currently active -}; - - -static inline struct zink_batch_state * -zink_batch_state(struct zink_fence *fence) -{ - return (struct zink_batch_state *)fence; -} void zink_reset_batch_state(struct zink_context *ctx, struct zink_batch_state *bs); @@ -145,7 +62,7 @@ void zink_end_batch(struct zink_context *ctx, struct zink_batch *batch); void -zink_batch_resource_usage_set(struct zink_batch *batch, struct zink_resource *res, bool write); +zink_batch_add_wait_semaphore(struct zink_batch *batch, VkSemaphore sem); void zink_batch_reference_resource_rw(struct zink_batch *batch, @@ -154,54 +71,43 @@ zink_batch_reference_resource_rw(struct zink_batch *batch, void zink_batch_reference_resource(struct zink_batch *batch, struct zink_resource *res); -void +bool zink_batch_reference_resource_move(struct zink_batch *batch, struct zink_resource *res); void -zink_batch_reference_sampler_view(struct zink_batch *batch, - struct zink_sampler_view *sv); - -void zink_batch_reference_program(struct zink_batch *batch, struct zink_program *pg); void -zink_batch_reference_image_view(struct zink_batch *batch, - struct zink_image_view *image_view); - -void -zink_batch_reference_bufferview(struct zink_batch *batch, struct zink_buffer_view *buffer_view); -void -zink_batch_reference_surface(struct zink_batch *batch, struct zink_surface *surface); - +zink_batch_bind_db(struct zink_context *ctx); void debug_describe_zink_batch_state(char *buf, const struct zink_batch_state *ptr); -static inline bool +static ALWAYS_INLINE bool zink_batch_usage_is_unflushed(const struct zink_batch_usage *u) { return u && u->unflushed; } -static inline void +static ALWAYS_INLINE void zink_batch_usage_unset(struct zink_batch_usage **u, struct zink_batch_state *bs) { (void)p_atomic_cmpxchg((uintptr_t *)u, (uintptr_t)&bs->usage, (uintptr_t)NULL); } -static inline void +static ALWAYS_INLINE void zink_batch_usage_set(struct zink_batch_usage **u, struct zink_batch_state *bs) { *u = &bs->usage; } -static inline bool +static ALWAYS_INLINE bool zink_batch_usage_matches(const struct zink_batch_usage *u, const struct zink_batch_state *bs) { return u == &bs->usage; } -static inline bool +static ALWAYS_INLINE bool zink_batch_usage_exists(const struct zink_batch_usage *u) { return u && (u->usage || u->unflushed); @@ -209,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); @@ -216,6 +124,9 @@ zink_batch_usage_check_completion(struct zink_context *ctx, const struct zink_ba void zink_batch_usage_wait(struct zink_context *ctx, struct zink_batch_usage *u); +void +zink_batch_usage_try_wait(struct zink_context *ctx, struct zink_batch_usage *u); + #ifdef __cplusplus } #endif |