diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index 77922707363..0a39a9d596f 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -133,6 +133,24 @@ struct rendering_state { uint32_t so_offsets[PIPE_MAX_SO_BUFFERS]; }; +ALWAYS_INLINE static void +assert_subresource_layers(const struct pipe_resource *pres, const VkImageSubresourceLayers *layers, const VkOffset3D *offsets) +{ +#ifndef NDEBUG + if (pres->target == PIPE_TEXTURE_3D) { + assert(layers->baseArrayLayer == 0); + assert(layers->layerCount == 1); + assert(offsets[0].z <= pres->depth0); + assert(offsets[1].z <= pres->depth0); + } else { + assert(layers->baseArrayLayer < pres->array_size); + assert(layers->baseArrayLayer + layers->layerCount <= pres->array_size); + assert(offsets[0].z == 0); + assert(offsets[1].z == 1); + } +#endif +} + static void emit_compute_state(struct rendering_state *state) { if (state->iv_dirty[PIPE_SHADER_COMPUTE]) { @@ -2064,6 +2082,8 @@ static void handle_blit_image(struct lvp_cmd_buffer_entry *cmd, info.src.box.height = srcY0 - srcY1; } + assert_subresource_layers(info.src.resource, &blitcmd->regions[i].srcSubresource, blitcmd->regions[i].srcOffsets); + assert_subresource_layers(info.dst.resource, &blitcmd->regions[i].dstSubresource, blitcmd->regions[i].dstOffsets); if (blitcmd->src->bo->target == PIPE_TEXTURE_3D) { if (dstZ0 < dstZ1) { info.dst.box.z = dstZ0;