loc->pSampleLocations = ctx->vk_sample_locations;
}
+static void
+zink_evaluate_depth_buffer(struct pipe_context *pctx)
+{
+ struct zink_context *ctx = zink_context(pctx);
+
+ if (!ctx->fb_state.zsbuf)
+ return;
+
+ struct zink_resource *res = zink_resource(ctx->fb_state.zsbuf->texture);
+ res->obj->needs_zs_evaluate = true;
+ zink_init_vk_sample_locations(ctx, &res->obj->zs_evaluate);
+ zink_batch_no_rp(ctx);
+}
+
void
zink_begin_render_pass(struct zink_context *ctx, struct zink_batch *batch)
{
if (ctx->fb_state.zsbuf) {
struct pipe_surface *surf = ctx->fb_state.zsbuf;
if (surf != state->zsbuf) {
+ struct zink_resource *res = zink_resource(surf->texture);
zink_fb_clears_apply(ctx, ctx->fb_state.zsbuf->texture);
+ if (unlikely(res->obj->needs_zs_evaluate))
+ /* have to flush zs eval while the sample location data still exists,
+ * so just throw some random barrier */
+ zink_resource_image_barrier(ctx, NULL, res, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ VK_ACCESS_SHADER_READ_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
ctx->rp_changed = true;
}
zink_resource(surf->texture)->fb_binds--;
res->obj->image,
isr
};
- return zink_resource_image_needs_barrier(res, new_layout, flags, pipeline);
+ return res->obj->needs_zs_evaluate || zink_resource_image_needs_barrier(res, new_layout, flags, pipeline);
}
static inline bool
/* only barrier if we're changing layout or doing something besides read -> read */
VkCommandBuffer cmdbuf = get_cmdbuf(ctx, res);
assert(new_layout);
+ if (res->obj->needs_zs_evaluate)
+ imb.pNext = &res->obj->zs_evaluate;
+ res->obj->needs_zs_evaluate = false;
vkCmdPipelineBarrier(
cmdbuf,
res->access_stage ? res->access_stage : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
ctx->base.flush = zink_flush;
ctx->base.memory_barrier = zink_memory_barrier;
ctx->base.texture_barrier = zink_texture_barrier;
+ ctx->base.evaluate_depth_buffer = zink_evaluate_depth_buffer;
ctx->base.resource_commit = zink_resource_commit;
ctx->base.resource_copy_region = zink_resource_copy_region;