aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Barbour <tony@LunarG.com>2016-06-02 09:43:50 -0600
committerTony Barbour <tony@LunarG.com>2016-06-07 12:05:13 -0600
commit0d0a82a77b82e9560dce5c5a7f6b213cac490237 (patch)
treebc94da638f791290af3fdcdb109ea916436e025e
parentb6b1a1f490a1a64877a52ec42600da5c8a340b7d (diff)
downloadusermoji-0d0a82a77b82e9560dce5c5a7f6b213cac490237.tar.xz
layers: Add check for image usage in vkCmdClearColorImage
Change-Id: I7ba803a11de29e65ae65fbf0a0168561a2e6739f
-rw-r--r--layers/image.cpp6
-rw-r--r--layers/image.h8
-rw-r--r--layers/vk_validation_layer_details.md1
3 files changed, 12 insertions, 3 deletions
diff --git a/layers/image.cpp b/layers/image.cpp
index 1fb7d5a0..116f49f7 100644
--- a/layers/image.cpp
+++ b/layers/image.cpp
@@ -644,6 +644,12 @@ VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkI
skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
reinterpret_cast<uint64_t &>(image), __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", str);
}
+
+ if (!(image_state->usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT)) {
+ char const str[] = "vkCmdClearColorImage called with image created without VK_IMAGE_USAGE_TRANSFER_DST_BIT.";
+ skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
+ reinterpret_cast<uint64_t &>(image), __LINE__, IMAGE_INVALID_USAGE, "IMAGE", str);
+ }
}
if (!skipCall) {
diff --git a/layers/image.h b/layers/image.h
index 93b6c7ed..6a6c76b3 100644
--- a/layers/image.h
+++ b/layers/image.h
@@ -44,6 +44,7 @@ enum IMAGE_ERROR {
IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, // Device limits for this format have been exceeded
IMAGE_INVALID_LAYOUT, // Operation specifies an invalid layout
IMAGE_INVALID_EXTENTS, // Operation specifies invalid image extents
+ IMAGE_INVALID_USAGE, // Image was created without necessary usage for operation
};
struct IMAGE_STATE {
@@ -54,13 +55,14 @@ struct IMAGE_STATE {
VkImageType imageType;
VkExtent3D extent;
VkImageCreateFlags flags;
+ VkImageUsageFlags usage;
IMAGE_STATE()
: mipLevels(0), arraySize(0), format(VK_FORMAT_UNDEFINED), samples(VK_SAMPLE_COUNT_1_BIT),
- imageType(VK_IMAGE_TYPE_RANGE_SIZE), extent{}, flags(0){};
+ imageType(VK_IMAGE_TYPE_RANGE_SIZE), extent{}, flags(0), usage(0){};
IMAGE_STATE(const VkImageCreateInfo *pCreateInfo)
: mipLevels(pCreateInfo->mipLevels), arraySize(pCreateInfo->arrayLayers), format(pCreateInfo->format),
- samples(pCreateInfo->samples), imageType(pCreateInfo->imageType), extent(pCreateInfo->extent),
- flags(pCreateInfo->flags){};
+ samples(pCreateInfo->samples), imageType(pCreateInfo->imageType), extent(pCreateInfo->extent), flags(pCreateInfo->flags),
+ usage(pCreateInfo->usage){};
};
#endif // IMAGE_H
diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md
index e7c6c592..e71a41db 100644
--- a/layers/vk_validation_layer_details.md
+++ b/layers/vk_validation_layer_details.md
@@ -215,6 +215,7 @@ DETAILS TABLE PENDING
| Verify Image Format Limits | Verifies that image creation parameters are with the device format limits | INVALID_FORMAT_LIMITS_VIOLATION | vkCreateImage | ImageFormatLimits | NA |
| Verify Layout | Verifies the layouts are valid for this image operation | INVALID_LAYOUT | vkCreateImage vkCmdClearColorImage | TODO | ImageFormatLimits |
| Verify Image Extents | Validates that image extent limits are not invalid | INVALID_EXTENTS | vkCmdCopyImage | CopyImageLayerCountMismatch | NA |
+| Verify Usage | Verifies the image was created with usage valid for this image operation | INVALID_USAGE | vkCmdClearColorImage | TODO | ClearImageErrors |
| NA | Enum used for informational messages | NONE | | TODO | None |
### VK_LAYER_LUNARG_image Pending Work