intel: implement color clear load ops
V2: Extract guts of vkCmdClearColorImage to an internal-use function,
and use that from render pass ops, rather than possibly allowing
the clear to be intercepted by layers.
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Courtney Goeltzenleuchter <courtney@lunarg.com>
diff --git a/icd/intel/cmd_pipeline.c b/icd/intel/cmd_pipeline.c
index 99fe560..cef30c9 100644
--- a/icd/intel/cmd_pipeline.c
+++ b/icd/intel/cmd_pipeline.c
@@ -3610,8 +3610,33 @@
const VkRenderPassBegin* pRenderPassBegin)
{
struct intel_cmd *cmd = intel_cmd(cmdBuffer);
+ struct intel_render_pass *rp = (struct intel_render_pass *) pRenderPassBegin->renderPass;
+ struct intel_fb *fb = (struct intel_fb *) pRenderPassBegin->framebuffer;
+ unsigned i;
- cmd_begin_render_pass(cmd, (struct intel_render_pass *) pRenderPassBegin->renderPass, (struct intel_fb *) pRenderPassBegin->framebuffer);
+ cmd_begin_render_pass(cmd, rp, fb);
+
+ /* issue load ops */
+ for (i = 0; i < rp->colorAttachmentCount; i++) {
+ if (rp->colorLoadOps[i] == VK_ATTACHMENT_LOAD_OP_CLEAR) {
+ /* issue clear of this attachment */
+ const struct intel_rt_view *rt = fb->rt[i];
+
+ VkImageSubresourceRange ranges[1] = {{
+ VK_IMAGE_ASPECT_COLOR,
+ rt->mipLevel,
+ 1,
+ rt->baseArraySlice,
+ rt->array_size
+ }};
+
+ cmd_meta_clear_color_image(cmdBuffer, (VkImage) rt->img,
+ rp->colorLayouts[i],
+ &rp->colorClearValues[i],
+ 1,
+ ranges);
+ }
+ }
}
ICD_EXPORT void VKAPI vkCmdEndRenderPass(