aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2016-08-23 15:10:36 -0600
committerMark Lobodzinski <mark@lunarg.com>2016-08-26 11:44:57 -0600
commit40470c76163ae7e74702e80f30e9477958c15689 (patch)
tree9b7f75b680c8a872c1dec57600369bfad9c34e59 /layers/core_validation.cpp
parentadc9517e6790410c55e1a589639e0de775d87747 (diff)
downloadusermoji-40470c76163ae7e74702e80f30e9477958c15689.tar.xz
layers: Add validation for image samplecounts
Check that an image's sampleCount is valid for BlitImage, CopyImageToBuffer and CopyBufferToImage. Change-Id: I5e012e35bd2eb87cd42798a0cacdb03ed64b3c3b
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index a5177afd..503ac907 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -7739,6 +7739,20 @@ CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcI
regionCount, pRegions);
}
+// Validate that an image's sampleCount matches the requirement for a specific API call
+static inline bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_NODE *image_node, VkSampleCountFlagBits sample_count,
+ const char *location) {
+ bool skip = false;
+ if (image_node->createInfo.samples != sample_count) {
+ skip = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
+ reinterpret_cast<uint64_t &>(image_node->image), 0, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS",
+ "%s for image 0x%" PRIxLEAST64 " was created with a sample count of %s but must be %s.", location,
+ reinterpret_cast<uint64_t &>(image_node->image),
+ string_VkSampleCountFlagBits(image_node->createInfo.samples), string_VkSampleCountFlagBits(sample_count));
+ }
+ return skip;
+}
+
VKAPI_ATTR void VKAPI_CALL
CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) {
@@ -7750,6 +7764,8 @@ CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcI
auto src_img_node = getImageNode(dev_data, srcImage);
auto dst_img_node = getImageNode(dev_data, dstImage);
if (cb_node && src_img_node && dst_img_node) {
+ skip_call |= ValidateImageSampleCount(dev_data, src_img_node, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): srcImage");
+ skip_call |= ValidateImageSampleCount(dev_data, dst_img_node, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): dstImage");
skip_call |= ValidateMemoryIsBoundToImage(dev_data, src_img_node, "vkCmdBlitImage()");
skip_call |= ValidateMemoryIsBoundToImage(dev_data, dst_img_node, "vkCmdBlitImage()");
// Update bindings between images and cmd buffer
@@ -7790,6 +7806,7 @@ VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, V
auto src_buff_node = getBufferNode(dev_data, srcBuffer);
auto dst_img_node = getImageNode(dev_data, dstImage);
if (cb_node && src_buff_node && dst_img_node) {
+ skip_call |= ValidateImageSampleCount(dev_data, dst_img_node, VK_SAMPLE_COUNT_1_BIT, "vkCmdCopyBufferToImage(): dstImage");
skip_call |= ValidateMemoryIsBoundToBuffer(dev_data, src_buff_node, "vkCmdCopyBufferToImage()");
skip_call |= ValidateMemoryIsBoundToImage(dev_data, dst_img_node, "vkCmdCopyBufferToImage()");
AddCommandBufferBindingBuffer(dev_data, cb_node, src_buff_node);
@@ -7833,6 +7850,7 @@ VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, V
auto src_img_node = getImageNode(dev_data, srcImage);
auto dst_buff_node = getBufferNode(dev_data, dstBuffer);
if (cb_node && src_img_node && dst_buff_node) {
+ skip_call |= ValidateImageSampleCount(dev_data, src_img_node, VK_SAMPLE_COUNT_1_BIT, "vkCmdCopyImageToBuffer(): srcImage");
skip_call |= ValidateMemoryIsBoundToImage(dev_data, src_img_node, "vkCmdCopyImageToBuffer()");
skip_call |= ValidateMemoryIsBoundToBuffer(dev_data, dst_buff_node, "vkCmdCopyImageToBuffer()");
// Update bindings between buffer/image and cmd buffer