aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2017-01-31 15:11:38 -0700
committerMark Lobodzinski <mark@lunarg.com>2017-02-01 07:30:11 -0700
commitd65a75092728753fbb13754bfe2de56473f082f6 (patch)
tree72e796d4fa6d9117f07b4831c13f563cd7bbd9bc /layers/core_validation.cpp
parentecb7924583c847193f78927a682b6e68b478084a (diff)
downloadusermoji-d65a75092728753fbb13754bfe2de56473f082f6.tar.xz
layers: Split validation/state updates for clears
CmdClearColorImage and CmdClearDepthStencilImage routines mixed validation and state updates. Separated these and made the state updates conditional on passing validation. Change-Id: Ib710e91a038f7a0307d30218a49db1bf49bb8187
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp73
1 files changed, 36 insertions, 37 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 0cec3e25..69dbb0be 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -8876,31 +8876,32 @@ VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkI
layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
std::unique_lock<std::mutex> lock(global_lock);
// TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
-
auto cb_node = getCBNode(dev_data, commandBuffer);
auto image_state = getImageState(dev_data, image);
if (cb_node && image_state) {
skip |= ValidateMemoryIsBoundToImage(dev_data, image_state, "vkCmdClearColorImage()", VALIDATION_ERROR_02527);
- AddCommandBufferBindingImage(dev_data, cb_node, image_state);
- std::function<bool()> function = [=]() {
- SetImageMemoryValid(dev_data, image_state, true);
- return false;
- };
- cb_node->validate_functions.push_back(function);
-
skip |= ValidateCmd(dev_data, cb_node, CMD_CLEARCOLORIMAGE, "vkCmdClearColorImage()");
- UpdateCmdBufferLastCmd(dev_data, cb_node, CMD_CLEARCOLORIMAGE);
skip |= insideRenderPass(dev_data, cb_node, "vkCmdClearColorImage()", VALIDATION_ERROR_01096);
- } else {
- assert(0);
- }
- for (uint32_t i = 0; i < rangeCount; ++i) {
- skip |= ValidateImageAttributes(dev_data, image_state, pRanges[i]);
- skip |= VerifyClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout, "vkCmdClearColorImage()");
- RecordClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout);
+ for (uint32_t i = 0; i < rangeCount; ++i) {
+ skip |= ValidateImageAttributes(dev_data, image_state, pRanges[i]);
+ skip |= VerifyClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout, "vkCmdClearColorImage()");
+ }
+ if (!skip) {
+ AddCommandBufferBindingImage(dev_data, cb_node, image_state);
+ std::function<bool()> function = [=]() {
+ SetImageMemoryValid(dev_data, image_state, true);
+ return false;
+ };
+ cb_node->validate_functions.push_back(function);
+
+ UpdateCmdBufferLastCmd(dev_data, cb_node, CMD_CLEARCOLORIMAGE);
+ for (uint32_t i = 0; i < rangeCount; ++i) {
+ RecordClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout);
+ }
+ lock.unlock();
+ dev_data->dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
+ }
}
- lock.unlock();
- if (!skip) dev_data->dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
}
VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
@@ -8910,32 +8911,30 @@ VKAPI_ATTR void VKAPI_CALL CmdClearDepthStencilImage(VkCommandBuffer commandBuff
layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
std::unique_lock<std::mutex> lock(global_lock);
// TODO : Verify memory is in VK_IMAGE_STATE_CLEAR state
-
auto cb_node = getCBNode(dev_data, commandBuffer);
auto image_state = getImageState(dev_data, image);
if (cb_node && image_state) {
skip |= ValidateMemoryIsBoundToImage(dev_data, image_state, "vkCmdClearDepthStencilImage()", VALIDATION_ERROR_02528);
- AddCommandBufferBindingImage(dev_data, cb_node, image_state);
- std::function<bool()> function = [=]() {
- SetImageMemoryValid(dev_data, image_state, true);
- return false;
- };
- cb_node->validate_functions.push_back(function);
-
skip |= ValidateCmd(dev_data, cb_node, CMD_CLEARDEPTHSTENCILIMAGE, "vkCmdClearDepthStencilImage()");
- UpdateCmdBufferLastCmd(dev_data, cb_node, CMD_CLEARDEPTHSTENCILIMAGE);
skip |= insideRenderPass(dev_data, cb_node, "vkCmdClearDepthStencilImage()", VALIDATION_ERROR_01111);
- } else {
- assert(0);
- }
-
- for (uint32_t i = 0; i < rangeCount; ++i) {
- skip |= VerifyClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout, "vkCmdClearDepthStencilImage()");
- RecordClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout);
+ for (uint32_t i = 0; i < rangeCount; ++i) {
+ skip |= VerifyClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout, "vkCmdClearDepthStencilImage()");
+ }
+ if (!skip) {
+ AddCommandBufferBindingImage(dev_data, cb_node, image_state);
+ std::function<bool()> function = [=]() {
+ SetImageMemoryValid(dev_data, image_state, true);
+ return false;
+ };
+ cb_node->validate_functions.push_back(function);
+ UpdateCmdBufferLastCmd(dev_data, cb_node, CMD_CLEARDEPTHSTENCILIMAGE);
+ for (uint32_t i = 0; i < rangeCount; ++i) {
+ RecordClearImageLayout(dev_data, cb_node, image, pRanges[i], imageLayout);
+ }
+ lock.unlock();
+ dev_data->dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
+ }
}
- lock.unlock();
- if (!skip)
- dev_data->dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
}
VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,