anv: ignore pColorBlendState if all color attachments of the subpass are unused

According to Vulkan spec:

  "pColorBlendState is a pointer to an instance of the
   VkPipelineColorBlendStateCreateInfo structure, and is ignored if the
   pipeline has rasterization disabled or if the subpass of the render pass the
   pipeline is created against does not use any color attachments."

Fixes tests from CL#2505:

   dEQP-VK.renderpass.*.simple.color_unused_omit_blend_state

v2:
- Check that blend is not NULL before usage.

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Samuel Iglesias Gonsálvez
2018-05-07 08:42:56 +02:00
parent e7a7b712fe
commit 2cf64fdb46
2 changed files with 13 additions and 3 deletions

View File

@@ -1247,8 +1247,18 @@ anv_pipeline_validate_create_info(const VkGraphicsPipelineCreateInfo *info)
if (subpass && subpass->depth_stencil_attachment.attachment != VK_ATTACHMENT_UNUSED)
assert(info->pDepthStencilState);
if (subpass && subpass->color_count > 0)
assert(info->pColorBlendState);
if (subpass && subpass->color_count > 0) {
bool all_color_unused = true;
for (int i = 0; i < subpass->color_count; i++) {
if (subpass->color_attachments[i].attachment != VK_ATTACHMENT_UNUSED)
all_color_unused = false;
}
/* pColorBlendState is ignored if the pipeline has rasterization
* disabled or if the subpass of the render pass the pipeline is
* created against does not use any color attachments.
*/
assert(info->pColorBlendState || all_color_unused);
}
}
for (uint32_t i = 0; i < info->stageCount; ++i) {

View File

@@ -1361,7 +1361,7 @@ has_color_buffer_write_enabled(const struct anv_pipeline *pipeline,
if (binding->index == UINT32_MAX)
continue;
if (blend->pAttachments[binding->index].colorWriteMask != 0)
if (blend && blend->pAttachments[binding->index].colorWriteMask != 0)
return true;
}