sampler_state->hash = XXH32(hash_data, data_size, 0);
}
+static inline uint32_t
+get_sampler_view_hash(const struct zink_sampler_view *sampler_view)
+{
+ if (!sampler_view)
+ return 0;
+ return sampler_view->base.target == PIPE_BUFFER ?
+ sampler_view->buffer_view->hash : sampler_view->image_view->hash;
+}
+
+static inline uint32_t
+get_image_view_hash(const struct zink_image_view *image_view)
+{
+ if (!image_view || !image_view->base.resource)
+ return 0;
+ return image_view->base.resource->target == PIPE_BUFFER ?
+ image_view->buffer_view->hash : image_view->surface->hash;
+}
+
+uint32_t
+zink_get_sampler_view_hash(struct zink_context *ctx, struct zink_sampler_view *sampler_view, bool is_buffer)
+{
+ return get_sampler_view_hash(sampler_view) ? get_sampler_view_hash(sampler_view) :
+ (is_buffer ? zink_screen(ctx->base.screen)->null_descriptor_hashes.buffer_view :
+ zink_screen(ctx->base.screen)->null_descriptor_hashes.image_view);
+}
+
+uint32_t
+zink_get_image_view_hash(struct zink_context *ctx, struct zink_image_view *image_view, bool is_buffer)
+{
+ return get_image_view_hash(image_view) ? get_image_view_hash(image_view) :
+ (is_buffer ? zink_screen(ctx->base.screen)->null_descriptor_hashes.buffer_view :
+ zink_screen(ctx->base.screen)->null_descriptor_hashes.image_view);
+}
+
static uint32_t
calc_descriptor_state_hash_sampler(struct zink_context *ctx, struct zink_shader *zs, enum pipe_shader_type shader, int i, int idx, uint32_t hash)
{
- struct zink_screen *screen = zink_screen(ctx->base.screen);
-
for (unsigned k = 0; k < zs->bindings[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW][i].size; k++) {
struct zink_sampler_view *sampler_view = zink_sampler_view(ctx->sampler_views[shader][idx + k]);
- if (!sampler_view) {
- uint32_t val = zs->bindings[ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW][i].type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER ?
- screen->null_descriptor_hashes.buffer_view :
- screen->null_descriptor_hashes.image_view;
- hash = XXH32(&val, sizeof(uint32_t), hash);
- continue;
- }
- uint32_t sv_hash = get_sampler_view_hash(sampler_view);
- hash = XXH32(&sv_hash, sizeof(uint32_t), hash);
- if (sampler_view->base.target == PIPE_BUFFER)
+ bool is_buffer = zink_shader_descriptor_is_buffer(zs, ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW, i);
+ uint32_t val = zink_get_sampler_view_hash(ctx, sampler_view, is_buffer);
+ hash = XXH32(&val, sizeof(uint32_t), hash);
+ if (is_buffer)
continue;
struct zink_sampler_state *sampler_state = ctx->sampler_states[shader][idx + k];
calc_descriptor_state_hash_image(struct zink_context *ctx, struct zink_shader *zs, enum pipe_shader_type shader, int i, int idx, uint32_t hash)
{
for (unsigned k = 0; k < zs->bindings[ZINK_DESCRIPTOR_TYPE_IMAGE][i].size; k++) {
- if (!get_resource_for_descriptor(ctx, ZINK_DESCRIPTOR_TYPE_IMAGE, shader, idx + k)) {
- struct zink_screen *screen = zink_screen(ctx->base.screen);
- uint32_t val = zs->bindings[ZINK_DESCRIPTOR_TYPE_IMAGE][i].type == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER ?
- screen->null_descriptor_hashes.buffer_view :
- screen->null_descriptor_hashes.image_view;
- hash = XXH32(&val, sizeof(uint32_t), hash);
- break;
- }
- uint32_t iv_hash = get_image_view_hash(&ctx->image_views[shader][idx + k]);
- hash = XXH32(&iv_hash, sizeof(uint32_t), hash);
+ uint32_t val = zink_get_image_view_hash(ctx, &ctx->image_views[shader][idx + k],
+ zink_shader_descriptor_is_buffer(zs, ZINK_DESCRIPTOR_TYPE_IMAGE, i));
+ hash = XXH32(&val, sizeof(uint32_t), hash);
}
return hash;
}
res->bind_history |= BITFIELD_BIT(ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW);
res->bind_stages |= 1 << shader_type;
}
- uint32_t hash_a = get_sampler_view_hash(a);
- uint32_t hash_b = get_sampler_view_hash(b);
+ bool is_buffer = zink_program_descriptor_is_buffer(ctx, shader_type, ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW, start_slot + i);
+ uint32_t hash_a = zink_get_sampler_view_hash(ctx, a, is_buffer);
+ uint32_t hash_b = zink_get_sampler_view_hash(ctx, b, is_buffer);
update |= !!a != !!b || hash_a != hash_b;
pipe_sampler_view_reference(&ctx->sampler_views[shader_type][start_slot + i], pview);
}
* whenever a resource is destroyed
*/
#ifndef NDEBUG
- uint32_t null_hash = is_buffer ? zink_screen(ctx->base.screen)->null_descriptor_hashes.buffer_view :
- zink_screen(ctx->base.screen)->null_descriptor_hashes.image_view;
- uint32_t cur_hash = get_sampler_view_hash(zds->sampler_views[i]) ? get_sampler_view_hash(zds->sampler_views[i]) :
- null_hash;
- uint32_t new_hash = get_sampler_view_hash(sv) ? get_sampler_view_hash(sv) :
- null_hash;
+ uint32_t cur_hash = zink_get_sampler_view_hash(ctx, zds->sampler_views[i], is_buffer);
+ uint32_t new_hash = zink_get_sampler_view_hash(ctx, sv, is_buffer);
#endif
assert(!cache_hit || cur_hash == new_hash);
assert(!cache_hit || zds->sampler_states[i] == state);
* whenever a resource is destroyed
*/
#ifndef NDEBUG
- uint32_t null_hash = is_buffer ? zink_screen(ctx->base.screen)->null_descriptor_hashes.buffer_view :
- zink_screen(ctx->base.screen)->null_descriptor_hashes.image_view;
- uint32_t cur_hash = get_image_view_hash(zds->image_views[i]) ? get_image_view_hash(zds->image_views[i]) :
- null_hash;
- uint32_t new_hash = get_image_view_hash(image_view) ? get_image_view_hash(image_view) :
- null_hash;
+ uint32_t cur_hash = zink_get_image_view_hash(ctx, zds->image_views[i], is_buffer);
+ uint32_t new_hash = zink_get_image_view_hash(ctx, image_view, is_buffer);
#endif
assert(!cache_hit || cur_hash == new_hash);
if (!cache_hit)