From dcf124b1ec4b84e57e0fa408bd99a6b2a2de5aa3 Mon Sep 17 00:00:00 2001 From: Maciej Jesionowski Date: Wed, 6 Sep 2017 11:25:36 +0200 Subject: layers: Add support for VK_AMD_mixed_attachment_samples Change-Id: I2ee0ab4c2ba7510316f190689fd3d81db27cb04f --- layers/core_validation.cpp | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) (limited to 'layers/core_validation.cpp') 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(pso_num_samples) != subpass_num_samples) { + if (!dev_data->extensions.vk_amd_mixed_attachment_samples && + ((subpass_num_samples & static_cast(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::vectorextensions.vk_amd_mixed_attachment_samples) { + VkSampleCountFlagBits max_sample_count = static_cast(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 " -- cgit v1.2.3