aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp41
1 files changed, 39 insertions, 2 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index b0bc39b8..78e72aaf 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -1047,7 +1047,8 @@ static bool ValidatePipelineDrawtimeState(layer_data const *dev_data, LAST_BOUND
subpass_num_samples |= (unsigned)render_pass_info->pAttachments[attachment].samples;
}
- if (subpass_num_samples && static_cast<unsigned>(pso_num_samples) != subpass_num_samples) {
+ if (!dev_data->extensions.vk_amd_mixed_attachment_samples &&
+ ((subpass_num_samples & static_cast<unsigned>(pso_num_samples)) != subpass_num_samples)) {
skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
HandleToUint64(pPipeline->pipeline), __LINE__, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS",
"Num samples mismatch! At draw-time in Pipeline (0x%" PRIxLEAST64
@@ -1512,6 +1513,28 @@ static bool ValidatePipelineUnlocked(layer_data *dev_data, std::vector<std::uniq
}
}
+ if (dev_data->extensions.vk_amd_mixed_attachment_samples) {
+ VkSampleCountFlagBits max_sample_count = static_cast<VkSampleCountFlagBits>(0);
+ for (uint32_t i = 0; i < subpass_desc->colorAttachmentCount; ++i) {
+ if (subpass_desc->pColorAttachments[i].attachment != VK_ATTACHMENT_UNUSED) {
+ max_sample_count = std::max(max_sample_count, pPipeline->render_pass_ci.pAttachments[subpass_desc->pColorAttachments[i].attachment].samples);
+ }
+ }
+ if (subpass_desc->pDepthStencilAttachment && subpass_desc->pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
+ max_sample_count = std::max(max_sample_count, pPipeline->render_pass_ci.pAttachments[subpass_desc->pDepthStencilAttachment->attachment].samples);
+ }
+ if (pPipeline->graphicsPipelineCI.pMultisampleState->rasterizationSamples != max_sample_count) {
+ skip |=
+ log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ HandleToUint64(pPipeline->pipeline), __LINE__, VALIDATION_ERROR_09600bc2, "DS",
+ "vkCreateGraphicsPipelines: pCreateInfo[%d].pMultisampleState->rasterizationSamples (%s) != max attachment samples (%s) "
+ "used in subpass %u. %s",
+ pipelineIndex, string_VkSampleCountFlagBits(pPipeline->graphicsPipelineCI.pMultisampleState->rasterizationSamples),
+ string_VkSampleCountFlagBits(max_sample_count), pPipeline->graphicsPipelineCI.subpass,
+ validation_error_map[VALIDATION_ERROR_09600bc2]);
+ }
+ }
+
return skip;
}
@@ -7866,6 +7889,19 @@ static bool ValidateRenderpassAttachmentUsage(layer_data *dev_data, const VkRend
i, j, color_desc.format, resolve_desc.format, validation_error_map[VALIDATION_ERROR_140006a4]);
}
}
+
+ if (dev_data->extensions.vk_amd_mixed_attachment_samples &&
+ subpass.pDepthStencilAttachment && subpass.pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
+ const auto depth_stencil_sample_count = pCreateInfo->pAttachments[subpass.pDepthStencilAttachment->attachment].samples;
+ if (pCreateInfo->pAttachments[attachment].samples > depth_stencil_sample_count) {
+ skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
+ __LINE__, VALIDATION_ERROR_14000bc4, "DS",
+ "CreateRenderPass: Subpass %u pColorAttachments[%u] has %s which is larger than "
+ "depth/stencil attachment %s. %s",
+ i, j, string_VkSampleCountFlagBits(pCreateInfo->pAttachments[attachment].samples),
+ string_VkSampleCountFlagBits(depth_stencil_sample_count), validation_error_map[VALIDATION_ERROR_14000bc4]);
+ }
+ }
}
}
@@ -7883,7 +7919,8 @@ static bool ValidateRenderpassAttachmentUsage(layer_data *dev_data, const VkRend
skip |= ValidateAttachmentIndex(dev_data, attachment, pCreateInfo->attachmentCount, "Input");
}
- if (sample_count && !IsPowerOfTwo(sample_count)) {
+ if (!dev_data->extensions.vk_amd_mixed_attachment_samples &&
+ sample_count && !IsPowerOfTwo(sample_count)) {
skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
__LINE__, VALIDATION_ERROR_0082b401, "DS",
"CreateRenderPass: Subpass %u attempts to render to "