Mesa (main): zink: queue v3.0
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jun 22 21:08:01 UTC 2021
Module: Mesa
Branch: main
Commit: d80d9e1c9354135f3b4a5788e94ba2a09aeec2fe
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d80d9e1c9354135f3b4a5788e94ba2a09aeec2fe
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Wed Jun 16 21:28:46 2021 -0400
zink: queue v3.0
this uses a pointer to a batch state substruct for timeline tracking,
which provides a few nice benefits:
* explicit ability to detect unflushed batches (even on other contexts)
* the context doesn't need to have a "current" timeline id
* timeline (batch) ids can be distributed during submit, not when recording begins
* an abstracted api which can be more easily changed under the hood
Acked-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11437>
---
src/gallium/drivers/zink/zink_batch.c | 41 ++++++++++------
src/gallium/drivers/zink/zink_batch.h | 31 +++++++-----
src/gallium/drivers/zink/zink_context.c | 75 +++++++++++------------------
src/gallium/drivers/zink/zink_context.h | 4 +-
src/gallium/drivers/zink/zink_descriptors.c | 8 +--
src/gallium/drivers/zink/zink_fence.c | 3 +-
src/gallium/drivers/zink/zink_program.h | 2 +-
src/gallium/drivers/zink/zink_query.c | 4 +-
src/gallium/drivers/zink/zink_resource.c | 14 +++---
src/gallium/drivers/zink/zink_resource.h | 4 +-
src/gallium/drivers/zink/zink_surface.h | 2 +-
11 files changed, 94 insertions(+), 94 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index 3afe9610a5c..705cd53be4f 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -95,6 +95,7 @@ zink_reset_batch_state(struct zink_context *ctx, struct zink_batch_state *bs)
zink_screen_update_last_finished(screen, bs->fence.batch_id);
bs->submit_count++;
bs->fence.batch_id = 0;
+ bs->usage.usage = 0;
bs->draw_count = bs->compute_count = 0;
}
@@ -278,6 +279,8 @@ zink_start_batch(struct zink_context *ctx, struct zink_batch *batch)
{
zink_reset_batch(ctx, batch);
+ batch->state->usage.unflushed = true;
+
VkCommandBufferBeginInfo cbbi = {0};
cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
@@ -290,7 +293,7 @@ zink_start_batch(struct zink_context *ctx, struct zink_batch *batch)
batch->state->fence.completed = false;
if (ctx->last_fence) {
struct zink_batch_state *last_state = zink_batch_state(ctx->last_fence);
- batch->last_batch_id = last_state->fence.batch_id;
+ batch->last_batch_usage = &last_state->usage;
} else {
if (zink_screen(ctx->base.screen)->threaded)
util_queue_init(&batch->flush_queue, "zfq", 8, 1, UTIL_QUEUE_INIT_RESIZE_IF_FULL, NULL);
@@ -315,7 +318,18 @@ static void
submit_queue(void *data, void *gdata, int thread_index)
{
struct zink_batch_state *bs = data;
+ struct zink_context *ctx = bs->ctx;
+ struct zink_screen *screen = zink_screen(ctx->base.screen);
VkSubmitInfo si = {0};
+
+ simple_mtx_lock(&ctx->batch_mtx);
+ while (!bs->fence.batch_id)
+ bs->fence.batch_id = p_atomic_inc_return(&screen->curr_batch);
+ _mesa_hash_table_insert_pre_hashed(&ctx->batch_states, bs->fence.batch_id, (void*)(uintptr_t)bs->fence.batch_id, bs);
+ bs->usage.usage = bs->fence.batch_id;
+ bs->usage.unflushed = false;
+ simple_mtx_unlock(&ctx->batch_mtx);
+
uint64_t batch_id = bs->fence.batch_id;
si.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
si.waitSemaphoreCount = 0;
@@ -337,7 +351,7 @@ submit_queue(void *data, void *gdata, int thread_index)
tsi.signalSemaphoreValueCount = 1;
tsi.pSignalSemaphoreValues = &batch_id;
si.signalSemaphoreCount = 1;
- si.pSignalSemaphores = &zink_screen(bs->ctx->base.screen)->sem;
+ si.pSignalSemaphores = &screen->sem;
}
struct wsi_memory_signal_submit_info mem_signal = {
@@ -345,7 +359,7 @@ submit_queue(void *data, void *gdata, int thread_index)
.pNext = si.pNext,
};
- if (bs->flush_res && zink_screen(bs->ctx->base.screen)->needs_mesa_flush_wsi) {
+ if (bs->flush_res && screen->needs_mesa_flush_wsi) {
mem_signal.memory = bs->flush_res->scanout_obj ? bs->flush_res->scanout_obj->mem : bs->flush_res->obj->mem;
si.pNext = &mem_signal;
}
@@ -518,11 +532,8 @@ zink_end_batch(struct zink_context *ctx, struct zink_batch *batch)
vkFlushMappedMemoryRanges(screen->dev, 1, &range);
}
- simple_mtx_lock(&ctx->batch_mtx);
- ctx->last_fence = &batch->state->fence;
- _mesa_hash_table_insert_pre_hashed(&ctx->batch_states, batch->state->fence.batch_id, (void*)(uintptr_t)batch->state->fence.batch_id, batch->state);
- simple_mtx_unlock(&ctx->batch_mtx);
ctx->resource_size += batch->state->resource_size;
+ ctx->last_fence = &batch->state->fence;
if (screen->device_lost)
return;
@@ -550,20 +561,20 @@ zink_batch_reference_resource_rw(struct zink_batch *batch, struct zink_resource
zink_get_depth_stencil_resources((struct pipe_resource*)res, NULL, &stencil);
/* if the resource already has usage of any sort set for this batch, we can skip hashing */
- if (!zink_batch_usage_matches(&res->obj->reads, batch->state) &&
- !zink_batch_usage_matches(&res->obj->writes, batch->state)) {
+ if (!zink_batch_usage_matches(res->obj->reads, batch->state) &&
+ !zink_batch_usage_matches(res->obj->writes, batch->state)) {
bool found = false;
_mesa_set_search_and_add(batch->state->fence.resources, res->obj, &found);
if (!found) {
pipe_reference(NULL, &res->obj->reference);
- if (!batch->last_batch_id || res->obj->reads.usage != batch->last_batch_id)
+ if (!batch->last_batch_usage || res->obj->reads != batch->last_batch_usage)
/* only add resource usage if it's "new" usage, though this only checks the most recent usage
* and not all pending usages
*/
batch->state->resource_size += res->obj->size;
if (stencil) {
pipe_reference(NULL, &stencil->obj->reference);
- if (!batch->last_batch_id || stencil->obj->reads.usage != batch->last_batch_id)
+ if (!batch->last_batch_usage || stencil->obj->reads != batch->last_batch_usage)
batch->state->resource_size += stencil->obj->size;
}
}
@@ -586,10 +597,10 @@ zink_batch_reference_resource_rw(struct zink_batch *batch, struct zink_resource
}
bool
-batch_ptr_add_usage(struct zink_batch *batch, struct set *s, void *ptr, struct zink_batch_usage *u)
+batch_ptr_add_usage(struct zink_batch *batch, struct set *s, void *ptr, struct zink_batch_usage **u)
{
bool found = false;
- if (u->usage == batch->state->fence.batch_id)
+ if (*u == &batch->state->usage)
return false;
_mesa_set_search_and_add(s, ptr, &found);
assert(!found);
@@ -661,11 +672,13 @@ zink_batch_usage_check_completion(struct zink_context *ctx, const struct zink_ba
{
if (!zink_batch_usage_exists(u))
return true;
+ if (zink_batch_usage_is_unflushed(u))
+ return false;
return zink_check_batch_completion(ctx, u->usage);
}
void
-zink_batch_usage_wait(struct zink_context *ctx, const struct zink_batch_usage *u)
+zink_batch_usage_wait(struct zink_context *ctx, struct zink_batch_usage *u)
{
if (!zink_batch_usage_exists(u))
return;
diff --git a/src/gallium/drivers/zink/zink_batch.h b/src/gallium/drivers/zink/zink_batch.h
index a15747d21f0..8df4385fa38 100644
--- a/src/gallium/drivers/zink/zink_batch.h
+++ b/src/gallium/drivers/zink/zink_batch.h
@@ -45,19 +45,20 @@ struct zink_sampler_view;
struct zink_surface;
struct zink_batch_usage {
- /* this has to be atomic for fence access, so we can't use a bitmask and make everything neat */
uint32_t usage;
+ 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_usage *u);
+batch_ptr_add_usage(struct zink_batch *batch, struct set *s, void *ptr, struct zink_batch_usage **u);
struct zink_batch_state {
struct zink_fence fence;
struct pipe_reference reference;
unsigned draw_count;
+ struct zink_batch_usage usage;
struct zink_context *ctx;
VkCommandPool cmdpool;
VkCommandBuffer cmdbuf;
@@ -97,7 +98,7 @@ struct zink_batch_state {
struct zink_batch {
struct zink_batch_state *state;
- uint32_t last_batch_id;
+ struct zink_batch_usage *last_batch_usage;
struct util_queue flush_queue; //TODO: move to wsi
bool has_work;
@@ -175,34 +176,40 @@ zink_batch_state_reference(struct zink_screen *screen,
if (dst) *dst = src;
}
+static inline bool
+zink_batch_usage_is_unflushed(const struct zink_batch_usage *u)
+{
+ return u && u->unflushed;
+}
+
static inline void
-zink_batch_usage_unset(struct zink_batch_usage *u, struct zink_batch_state *bs)
+zink_batch_usage_unset(struct zink_batch_usage **u, struct zink_batch_state *bs)
{
- p_atomic_cmpxchg(&u->usage, bs->fence.batch_id, 0);
+ (void)p_atomic_cmpxchg(u, &bs->usage, NULL);
}
static inline void
-zink_batch_usage_set(struct zink_batch_usage *u, struct zink_batch_state *bs)
+zink_batch_usage_set(struct zink_batch_usage **u, struct zink_batch_state *bs)
{
- u->usage = bs->fence.batch_id;
+ *u = &bs->usage;
}
static inline bool
zink_batch_usage_matches(const struct zink_batch_usage *u, const struct zink_batch_state *bs)
{
- return u->usage == bs->fence.batch_id;
+ return u == &bs->usage;
}
static inline bool
-zink_batch_usage_exists(struct zink_batch_usage *u)
+zink_batch_usage_exists(const struct zink_batch_usage *u)
{
- uint32_t usage = p_atomic_read(&u->usage);
- return !!usage;
+ return u && (u->usage || u->unflushed);
}
bool
zink_batch_usage_check_completion(struct zink_context *ctx, const struct zink_batch_usage *u);
void
-zink_batch_usage_wait(struct zink_context *ctx, const struct zink_batch_usage *u);
+zink_batch_usage_wait(struct zink_context *ctx, struct zink_batch_usage *u);
+
#endif
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 377cfd0cc14..ca912f1f566 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -56,15 +56,6 @@
#define XXH_INLINE_ALL
#include "util/xxhash.h"
-static void
-incr_curr_batch(struct zink_context *ctx)
-{
- struct zink_screen *screen = zink_screen(ctx->base.screen);
- ctx->curr_batch = p_atomic_inc_return(&screen->curr_batch);
- if (!ctx->curr_batch) //never use batchid 0
- incr_curr_batch(ctx);
-}
-
static void
calc_descriptor_hash_sampler_state(struct zink_sampler_state *sampler_state)
{
@@ -1804,8 +1795,6 @@ flush_batch(struct zink_context *ctx, bool sync)
if (ctx->batch.state->is_device_lost) {
check_device_lost(ctx);
} else {
- incr_curr_batch(ctx);
-
zink_start_batch(ctx, batch);
if (zink_screen(ctx->base.screen)->info.have_EXT_transform_feedback && ctx->num_so_targets)
ctx->dirty_so_targets = true;
@@ -2539,10 +2528,8 @@ zink_wait_on_batch(struct zink_context *ctx, uint32_t batch_id)
bool
zink_check_batch_completion(struct zink_context *ctx, uint32_t batch_id)
{
- assert(batch_id);
- struct zink_batch_state *bs = ctx->batch.state;
- assert(bs);
- if (bs->fence.batch_id == batch_id)
+ assert(ctx->batch.state);
+ if (!batch_id)
/* not submitted yet */
return false;
@@ -3161,8 +3148,8 @@ zink_resource_commit(struct pipe_context *pctx, struct pipe_resource *pres, unsi
struct zink_screen *screen = zink_screen(pctx->screen);
/* if any current usage exists, flush the queue */
- if (res->obj->reads.usage == ctx->curr_batch ||
- res->obj->writes.usage == ctx->curr_batch)
+ if (zink_batch_usage_is_unflushed(res->obj->reads) ||
+ zink_batch_usage_is_unflushed(res->obj->writes))
zink_flush_queue(ctx);
VkBindSparseInfo sparse;
@@ -3264,45 +3251,38 @@ zink_context_replace_buffer_storage(struct pipe_context *pctx, struct pipe_resou
zink_resource_rebind(zink_context(pctx), d);
}
+ALWAYS_INLINE static bool
+is_usage_completed(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;
+ /* check fastpath first */
+ if (zink_screen_check_last_finished(screen, u->usage))
+ return true;
+ /* if we have timelines, do a quick check */
+ if (screen->info.have_KHR_timeline_semaphore)
+ return zink_screen_timeline_wait(screen, u->usage, 0);
+
+ /* otherwise assume busy */
+ return false;
+}
+
static bool
zink_context_is_resource_busy(struct pipe_screen *pscreen, struct pipe_resource *pres, unsigned usage)
{
struct zink_screen *screen = zink_screen(pscreen);
struct zink_resource *res = zink_resource(pres);
- uint32_t reads = 0, writes = 0;
+ const struct zink_batch_usage *reads = NULL, *writes = NULL;
if (((usage & (PIPE_MAP_READ | PIPE_MAP_WRITE)) == (PIPE_MAP_READ | PIPE_MAP_WRITE)) ||
usage & PIPE_MAP_WRITE) {
- reads = p_atomic_read(&res->obj->reads.usage);
- writes = p_atomic_read(&res->obj->writes.usage);
+ reads = res->obj->reads;
+ writes = res->obj->writes;
} else if (usage & PIPE_MAP_READ)
- writes = p_atomic_read(&res->obj->writes.usage);
-
- /* get latest usage accounting for 32bit int rollover:
- * a rollover is detected if there are reads and writes,
- * but one of the values is over UINT32_MAX/2 while the other is under,
- * as it is impossible for this many unflushed batch states to ever
- * exist at any given time
- */
- uint32_t last;
-
- if (reads && writes)
- last = abs((int)reads - (int)writes) > UINT32_MAX / 2 ? MIN2(reads, writes) : MAX2(reads, writes);
- else
- last = reads ? reads : writes;
-
- if (!last)
- return false;
+ writes = res->obj->writes;
- /* check fastpath first */
- if (zink_screen_check_last_finished(screen, last))
- return false;
-
- /* if we have timelines, do a quick check */
- if (screen->info.have_KHR_timeline_semaphore)
- return !zink_screen_timeline_wait(screen, last, 0);
-
- /* otherwise assume busy */
- return true;
+ return !is_usage_completed(screen, reads) || !is_usage_completed(screen, writes);
}
static void
@@ -3484,7 +3464,6 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
ctx->have_timelines = screen->info.have_KHR_timeline_semaphore;
simple_mtx_init(&ctx->batch_mtx, mtx_plain);
- incr_curr_batch(ctx);
zink_start_batch(ctx, &ctx->batch);
if (!ctx->batch.state)
goto fail;
diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h
index fb5e08faac8..7ef543f8c43 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -69,7 +69,7 @@ struct zink_sampler_state {
VkSampler sampler;
uint32_t hash;
struct zink_descriptor_refs desc_set_refs;
- struct zink_batch_usage batch_uses;
+ struct zink_batch_usage *batch_uses;
bool custom_border_color;
};
@@ -78,7 +78,7 @@ struct zink_buffer_view {
VkBufferViewCreateInfo bvci;
VkBufferView buffer_view;
uint32_t hash;
- struct zink_batch_usage batch_uses;
+ struct zink_batch_usage *batch_uses;
struct zink_descriptor_refs desc_set_refs;
};
diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c
index 67d6db6ea1d..90e0ceb2900 100644
--- a/src/gallium/drivers/zink/zink_descriptors.c
+++ b/src/gallium/drivers/zink/zink_descriptors.c
@@ -60,7 +60,7 @@ struct zink_descriptor_set {
bool punted;
bool recycled;
struct zink_descriptor_state_key key;
- struct zink_batch_usage batch_uses;
+ struct zink_batch_usage *batch_uses;
#ifndef NDEBUG
/* for extra debug asserts */
unsigned num_resources;
@@ -622,7 +622,7 @@ allocate_desc_set(struct zink_context *ctx, struct zink_program *pg, enum zink_d
pipe_reference_init(&zds->reference, 1);
zds->pool = pool;
zds->hash = 0;
- zds->batch_uses.usage = 0;
+ zds->batch_uses = NULL;
zds->invalid = true;
zds->punted = zds->recycled = false;
#ifndef NDEBUG
@@ -731,7 +731,7 @@ zink_descriptor_set_get(struct zink_context *ctx,
zds->recycled = false;
}
if (zds->invalid) {
- if (zink_batch_usage_exists(&zds->batch_uses))
+ if (zink_batch_usage_exists(zds->batch_uses))
punt_invalid_set(zds, NULL);
else
/* this set is guaranteed to be in pool->alloc_desc_sets */
@@ -746,7 +746,7 @@ zink_descriptor_set_get(struct zink_context *ctx,
bool recycled = false, punted = false;
if (he) {
zds = (void*)he->data;
- if (zds->invalid && zink_batch_usage_exists(&zds->batch_uses)) {
+ if (zds->invalid && zink_batch_usage_exists(zds->batch_uses)) {
punt_invalid_set(zds, he);
zds = NULL;
punted = true;
diff --git a/src/gallium/drivers/zink/zink_fence.c b/src/gallium/drivers/zink/zink_fence.c
index 338ffcdf217..8e634be024c 100644
--- a/src/gallium/drivers/zink/zink_fence.c
+++ b/src/gallium/drivers/zink/zink_fence.c
@@ -158,8 +158,9 @@ zink_vkfence_wait(struct zink_screen *screen, struct zink_fence *fence, uint64_t
if (success) {
p_atomic_set(&fence->completed, true);
- zink_fence_clear_resources(screen, fence);
+ zink_batch_state(fence)->usage.usage = 0;
zink_screen_update_last_finished(screen, fence->batch_id);
+ zink_fence_clear_resources(screen, fence);
}
return success;
}
diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h
index 56feaa9a344..7f7ec6263c5 100644
--- a/src/gallium/drivers/zink/zink_program.h
+++ b/src/gallium/drivers/zink/zink_program.h
@@ -73,7 +73,7 @@ struct zink_shader_cache {
struct zink_program {
struct pipe_reference reference;
- struct zink_batch_usage batch_uses;
+ struct zink_batch_usage *batch_uses;
bool is_compute;
struct zink_program_descriptor_data *dd;
diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c
index 64fa30be246..9b51ecd2bc8 100644
--- a/src/gallium/drivers/zink/zink_query.c
+++ b/src/gallium/drivers/zink/zink_query.c
@@ -46,7 +46,7 @@ struct zink_query {
bool have_gs[NUM_QUERIES]; /* geometry shaders use GEOMETRY_SHADER_PRIMITIVES_BIT */
bool have_xfb[NUM_QUERIES]; /* xfb was active during this query */
- struct zink_batch_usage batch_id; //batch that the query was started in
+ struct zink_batch_usage *batch_id; //batch that the query was started in
struct list_head buffers;
struct zink_query_buffer *curr_qbo;
@@ -780,7 +780,7 @@ zink_get_query_result(struct pipe_context *pctx,
if (query->needs_update)
update_qbo(ctx, query);
- if (query->batch_id.usage == ctx->curr_batch) {
+ if (zink_batch_usage_is_unflushed(query->batch_id)) {
if (!threaded_query(q)->flushed)
pctx->flush(pctx, NULL, 0);
if (!wait)
diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index ce2c6b37c80..7e20a79c1f0 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -77,8 +77,8 @@ debug_describe_zink_resource_object(char *buf, const struct zink_resource_object
static uint32_t
get_resource_usage(struct zink_resource *res)
{
- bool reads = zink_batch_usage_exists(&res->obj->reads);
- bool writes = zink_batch_usage_exists(&res->obj->writes);
+ bool reads = zink_batch_usage_exists(res->obj->reads);
+ bool writes = zink_batch_usage_exists(res->obj->writes);
uint32_t batch_uses = 0;
if (reads)
batch_uses |= ZINK_RESOURCE_ACCESS_READ;
@@ -867,8 +867,8 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne
*/
if (!res->obj->host_visible ||
- !zink_batch_usage_check_completion(ctx, &res->obj->reads) ||
- !zink_batch_usage_check_completion(ctx, &res->obj->writes)) {
+ !zink_batch_usage_check_completion(ctx, res->obj->reads) ||
+ !zink_batch_usage_check_completion(ctx, res->obj->writes)) {
/* Do a wait-free write-only transfer using a temporary buffer. */
unsigned offset;
@@ -896,7 +896,7 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne
/* sparse/device-local will always need to wait since it has to copy */
if (!res->obj->host_visible)
return NULL;
- if (!zink_batch_usage_check_completion(ctx, &res->obj->writes))
+ if (!zink_batch_usage_check_completion(ctx, res->obj->writes))
return NULL;
} else if (!res->obj->host_visible) {
zink_fence_wait(&ctx->base);
@@ -909,7 +909,7 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne
res = staging_res;
zink_fence_wait(&ctx->base);
} else
- zink_batch_usage_wait(ctx, &res->obj->writes);
+ zink_batch_usage_wait(ctx, res->obj->writes);
}
if (!ptr) {
@@ -1036,7 +1036,7 @@ zink_transfer_map(struct pipe_context *pctx,
if (usage & PIPE_MAP_WRITE)
zink_fence_wait(pctx);
else
- zink_batch_usage_wait(ctx, &res->obj->writes);
+ zink_batch_usage_wait(ctx, res->obj->writes);
}
VkImageSubresource isr = {
res->aspect,
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index c64e5d59ea5..219bcaa5b6d 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -75,8 +75,8 @@ struct zink_resource_object {
unsigned persistent_maps; //if nonzero, requires vkFlushMappedMemoryRanges during batch use
struct zink_descriptor_refs desc_set_refs;
- struct zink_batch_usage reads;
- struct zink_batch_usage writes;
+ struct zink_batch_usage *reads;
+ struct zink_batch_usage *writes;
void *map;
bool is_buffer;
bool host_visible;
diff --git a/src/gallium/drivers/zink/zink_surface.h b/src/gallium/drivers/zink/zink_surface.h
index e9004255220..8b682c4de3a 100644
--- a/src/gallium/drivers/zink/zink_surface.h
+++ b/src/gallium/drivers/zink/zink_surface.h
@@ -37,7 +37,7 @@ struct zink_surface {
VkImageView simage_view;//old iview after storage replacement/rebind
void *obj; //backing resource object
uint32_t hash;
- struct zink_batch_usage batch_uses;
+ struct zink_batch_usage *batch_uses;
struct util_dynarray framebuffer_refs;
struct zink_descriptor_refs desc_set_refs;
};
More information about the mesa-commit
mailing list