aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2017-02-06 11:06:26 -0700
committerMark Lobodzinski <mark@lunarg.com>2017-02-07 14:02:48 -0700
commit917253c6001e311d44b87f9f5d036f8775c02936 (patch)
treee6b5899755fecbfb688021ba685323b0c6dd966b
parent7e72b26d49907e21554e961bb714924e79d4a6af (diff)
downloadusermoji-917253c6001e311d44b87f9f5d036f8775c02936.tar.xz
layers: Move CmdBlit/ResolveImage helpers out of CV
Moved to the buffer validation module. Change-Id: Ic80b327e7ddd4c2e699587bd0b664b91462ee8da
-rw-r--r--layers/buffer_validation.cpp74
-rw-r--r--layers/buffer_validation.h13
-rw-r--r--layers/core_validation.cpp80
-rw-r--r--layers/core_validation_types.h6
4 files changed, 97 insertions, 76 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 8731c48b..066bcd89 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -1234,4 +1234,76 @@ bool PreCallValidateCmdClearAttachments(core_validation::layer_data *device_data
}
}
return skip;
-} \ No newline at end of file
+}
+
+bool PreCallValidateCmdResolveImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ IMAGE_STATE *dst_image_state) {
+ bool skip = false;
+ if (cb_node && src_image_state && dst_image_state) {
+ skip |= ValidateMemoryIsBoundToImage(device_data, src_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02541);
+ skip |= ValidateMemoryIsBoundToImage(device_data, dst_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02542);
+ skip |= ValidateCmd(device_data, cb_node, CMD_RESOLVEIMAGE, "vkCmdResolveImage()");
+ skip |= insideRenderPass(device_data, cb_node, "vkCmdResolveImage()", VALIDATION_ERROR_01335);
+ } else {
+ assert(0);
+ }
+ return skip;
+}
+
+void PreCallRecordCmdResolveImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ IMAGE_STATE *dst_image_state) {
+ // Update bindings between images and cmd buffer
+ AddCommandBufferBindingImage(device_data, cb_node, src_image_state);
+ AddCommandBufferBindingImage(device_data, cb_node, dst_image_state);
+
+ std::function<bool()> function = [=]() {
+ return ValidateImageMemoryIsValid(device_data, src_image_state, "vkCmdResolveImage()");
+ };
+ cb_node->validate_functions.push_back(function);
+ function = [=]() {
+ SetImageMemoryValid(device_data, dst_image_state, true);
+ return false;
+ };
+ cb_node->validate_functions.push_back(function);
+ UpdateCmdBufferLastCmd(device_data, cb_node, CMD_RESOLVEIMAGE);
+}
+
+bool PreCallValidateCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ IMAGE_STATE *dst_image_state) {
+ bool skip = false;
+ if (cb_node && src_image_state && dst_image_state) {
+ skip |= ValidateImageSampleCount(device_data, src_image_state, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): srcImage",
+ VALIDATION_ERROR_02194);
+ skip |= ValidateImageSampleCount(device_data, dst_image_state, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): dstImage",
+ VALIDATION_ERROR_02195);
+ skip |= ValidateMemoryIsBoundToImage(device_data, src_image_state, "vkCmdBlitImage()", VALIDATION_ERROR_02539);
+ skip |= ValidateMemoryIsBoundToImage(device_data, dst_image_state, "vkCmdBlitImage()", VALIDATION_ERROR_02540);
+ skip |= ValidateImageUsageFlags(device_data, src_image_state, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, true, VALIDATION_ERROR_02182,
+ "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
+ skip |= ValidateImageUsageFlags(device_data, dst_image_state, VK_IMAGE_USAGE_TRANSFER_DST_BIT, true, VALIDATION_ERROR_02186,
+ "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
+ skip |= ValidateCmd(device_data, cb_node, CMD_BLITIMAGE, "vkCmdBlitImage()");
+ skip |= insideRenderPass(device_data, cb_node, "vkCmdBlitImage()", VALIDATION_ERROR_01300);
+ } else {
+ assert(0);
+ }
+ return skip;
+}
+
+void PreCallRecordCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ IMAGE_STATE *dst_image_state) {
+ // Update bindings between images and cmd buffer
+ AddCommandBufferBindingImage(device_data, cb_node, src_image_state);
+ AddCommandBufferBindingImage(device_data, cb_node, dst_image_state);
+
+ std::function<bool()> function = [=]() { return ValidateImageMemoryIsValid(device_data, src_image_state, "vkCmdBlitImage()"); };
+ cb_node->validate_functions.push_back(function);
+ function = [=]() {
+ SetImageMemoryValid(device_data, dst_image_state, true);
+ return false;
+ };
+ cb_node->validate_functions.push_back(function);
+ UpdateCmdBufferLastCmd(device_data, cb_node, CMD_BLITIMAGE);
+}
+
+
diff --git a/layers/buffer_validation.h b/layers/buffer_validation.h
index ae2b54c1..8622f099 100644
--- a/layers/buffer_validation.h
+++ b/layers/buffer_validation.h
@@ -128,4 +128,17 @@ bool PreCallValidateCmdClearAttachments(core_validation::layer_data *device_data
uint32_t attachmentCount, const VkClearAttachment *pAttachments, uint32_t rectCount,
const VkClearRect *pRects);
+bool PreCallValidateCmdResolveImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ IMAGE_STATE *dst_image_state);
+
+void PreCallRecordCmdResolveImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ IMAGE_STATE *dst_image_state);
+
+bool PreCallValidateCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ IMAGE_STATE *dst_image_state);
+
+void PreCallRecordCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
+ IMAGE_STATE *dst_image_state);
+
+
#endif // CORE_VALIDATION_BUFFER_VALIDATION_H_
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index e63b36a0..560b0e99 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -460,8 +460,8 @@ static bool validate_usage_flags(layer_data *my_data, VkFlags actual, VkFlags de
// Helper function to validate usage flags for buffers
// For given buffer_state send actual vs. desired usage off to helper above where
// an error will be flagged if usage is not correct
-static bool ValidateImageUsageFlags(layer_data *dev_data, IMAGE_STATE const *image_state, VkFlags desired, VkBool32 strict,
- int32_t const msgCode, char const *func_name, char const *usage_string) {
+bool ValidateImageUsageFlags(layer_data *dev_data, IMAGE_STATE const *image_state, VkFlags desired, VkBool32 strict,
+ int32_t const msgCode, char const *func_name, char const *usage_string) {
return validate_usage_flags(dev_data, image_state->createInfo.usage, desired, strict,
reinterpret_cast<const uint64_t &>(image_state->image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
msgCode, "image", func_name, usage_string);
@@ -553,7 +553,7 @@ static bool ValidateMemoryIsValid(layer_data *dev_data, VkDeviceMemory mem, uint
// For given image_state
// If mem is special swapchain key, then verify that image_state valid member is true
// Else verify that the image's bound memory range is valid
-static bool ValidateImageMemoryIsValid(layer_data *dev_data, IMAGE_STATE *image_state, const char *functionName) {
+bool ValidateImageMemoryIsValid(layer_data *dev_data, IMAGE_STATE *image_state, const char *functionName) {
if (image_state->binding.mem == MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) {
if (!image_state->valid) {
return log_msg(dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
@@ -8172,8 +8172,8 @@ VKAPI_ATTR void VKAPI_CALL CmdCopyImage(VkCommandBuffer commandBuffer, VkImage s
}
// Validate that an image's sampleCount matches the requirement for a specific API call
-static inline bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_STATE *image_state, VkSampleCountFlagBits sample_count,
- const char *location, UNIQUE_VALIDATION_ERROR_CODE msgCode) {
+bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_STATE *image_state, VkSampleCountFlagBits sample_count,
+ const char *location, UNIQUE_VALIDATION_ERROR_CODE msgCode) {
bool skip = false;
if (image_state->createInfo.samples != sample_count) {
skip =
@@ -8186,44 +8186,6 @@ static inline bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_STATE *i
return skip;
}
-bool PreCallValidateCmdBlitImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
- IMAGE_STATE *dst_image_state) {
- bool skip = false;
- if (cb_node && src_image_state && dst_image_state) {
- skip |= ValidateImageSampleCount(device_data, src_image_state, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): srcImage",
- VALIDATION_ERROR_02194);
- skip |= ValidateImageSampleCount(device_data, dst_image_state, VK_SAMPLE_COUNT_1_BIT, "vkCmdBlitImage(): dstImage",
- VALIDATION_ERROR_02195);
- skip |= ValidateMemoryIsBoundToImage(device_data, src_image_state, "vkCmdBlitImage()", VALIDATION_ERROR_02539);
- skip |= ValidateMemoryIsBoundToImage(device_data, dst_image_state, "vkCmdBlitImage()", VALIDATION_ERROR_02540);
- skip |= ValidateImageUsageFlags(device_data, src_image_state, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, true, VALIDATION_ERROR_02182,
- "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
- skip |= ValidateImageUsageFlags(device_data, dst_image_state, VK_IMAGE_USAGE_TRANSFER_DST_BIT, true, VALIDATION_ERROR_02186,
- "vkCmdBlitImage()", "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
- skip |= ValidateCmd(device_data, cb_node, CMD_BLITIMAGE, "vkCmdBlitImage()");
- skip |= insideRenderPass(device_data, cb_node, "vkCmdBlitImage()", VALIDATION_ERROR_01300);
- } else {
- assert(0);
- }
- return skip;
-}
-
-void PreCallRecordCmdBlitImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
- IMAGE_STATE *dst_image_state) {
- // Update bindings between images and cmd buffer
- AddCommandBufferBindingImage(device_data, cb_node, src_image_state);
- AddCommandBufferBindingImage(device_data, cb_node, dst_image_state);
-
- std::function<bool()> function = [=]() { return ValidateImageMemoryIsValid(device_data, src_image_state, "vkCmdBlitImage()"); };
- cb_node->validate_functions.push_back(function);
- function = [=]() {
- SetImageMemoryValid(device_data, dst_image_state, true);
- return false;
- };
- cb_node->validate_functions.push_back(function);
- UpdateCmdBufferLastCmd(device_data, cb_node, CMD_BLITIMAGE);
-}
-
VKAPI_ATTR void VKAPI_CALL CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
const VkImageBlit *pRegions, VkFilter filter) {
@@ -8443,38 +8405,6 @@ VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuff
}
}
-bool PreCallValidateCmdResolveImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
- IMAGE_STATE *dst_image_state) {
- bool skip = false;
- if (cb_node && src_image_state && dst_image_state) {
- skip |= ValidateMemoryIsBoundToImage(device_data, src_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02541);
- skip |= ValidateMemoryIsBoundToImage(device_data, dst_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02542);
- skip |= ValidateCmd(device_data, cb_node, CMD_RESOLVEIMAGE, "vkCmdResolveImage()");
- skip |= insideRenderPass(device_data, cb_node, "vkCmdResolveImage()", VALIDATION_ERROR_01335);
- } else {
- assert(0);
- }
- return skip;
-}
-
-void PreCallRecordCmdResolveImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
- IMAGE_STATE *dst_image_state) {
- // Update bindings between images and cmd buffer
- AddCommandBufferBindingImage(device_data, cb_node, src_image_state);
- AddCommandBufferBindingImage(device_data, cb_node, dst_image_state);
-
- std::function<bool()> function = [=]() {
- return ValidateImageMemoryIsValid(device_data, src_image_state, "vkCmdResolveImage()");
- };
- cb_node->validate_functions.push_back(function);
- function = [=]() {
- SetImageMemoryValid(device_data, dst_image_state, true);
- return false;
- };
- cb_node->validate_functions.push_back(function);
- UpdateCmdBufferLastCmd(device_data, cb_node, CMD_RESOLVEIMAGE);
-}
-
VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
const VkImageResolve *pRegions) {
diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h
index c89b0232..f346f752 100644
--- a/layers/core_validation_types.h
+++ b/layers/core_validation_types.h
@@ -763,6 +763,12 @@ bool outsideRenderPass(const layer_data *my_data, GLOBAL_CB_NODE *pCB, const cha
void SetLayout(GLOBAL_CB_NODE *pCB, ImageSubresourcePair imgpair, const IMAGE_CMD_BUF_LAYOUT_NODE &node);
void SetLayout(GLOBAL_CB_NODE *pCB, ImageSubresourcePair imgpair, const VkImageLayout &layout);
VkPhysicalDeviceLimits GetPhysicalDeviceLimits(layer_data const *);
+bool ValidateImageMemoryIsValid(layer_data *dev_data, IMAGE_STATE *image_state, const char *functionName);
+bool ValidateImageSampleCount(layer_data *dev_data, IMAGE_STATE *image_state, VkSampleCountFlagBits sample_count,
+ const char *location, UNIQUE_VALIDATION_ERROR_CODE msgCode);
+bool ValidateImageUsageFlags(layer_data *dev_data, IMAGE_STATE const *image_state, VkFlags desired, VkBool32 strict,
+ int32_t const msgCode, char const *func_name, char const *usage_string);
+
// Prototypes for layer_data accessor functions. These should be in their own header file at some point
PFN_vkGetPhysicalDeviceFormatProperties GetFormatPropertiesPointer(layer_data *);