diff options
| author | Chris Forbes <chrisforbes@google.com> | 2017-09-14 16:03:37 -0700 |
|---|---|---|
| committer | Chris Forbes <chrisf@ijw.co.nz> | 2017-09-15 13:43:08 -0700 |
| commit | b93993eac00e379e5448b54af2a8af71f6983b66 (patch) | |
| tree | ceb38959dda6a34d99f6d0c7cdb34adf9c883e49 | |
| parent | fabaad9a6dae4865ecf8d424fe8543a3d5a5ba08 (diff) | |
| download | usermoji-b93993eac00e379e5448b54af2a8af71f6983b66.tar.xz | |
layers: Implement VU check for BUFFER_USAGE_VERTEX_BUFFER_BIT
| -rw-r--r-- | layers/core_validation.cpp | 54 | ||||
| -rw-r--r-- | layers/vk_validation_error_database.txt | 2 |
2 files changed, 32 insertions, 24 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 65375234..8deb63b7 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5720,35 +5720,43 @@ VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, u const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) { bool skip = false; layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); - // TODO : Somewhere need to verify that VBs have correct usage state flagged unique_lock_t lock(global_lock); auto cb_node = GetCBNode(dev_data, commandBuffer); - if (cb_node) { - skip |= - ValidateCmdQueueFlags(dev_data, cb_node, "vkCmdBindVertexBuffers()", VK_QUEUE_GRAPHICS_BIT, VALIDATION_ERROR_18202415); - skip |= ValidateCmd(dev_data, cb_node, CMD_BINDVERTEXBUFFER, "vkCmdBindVertexBuffers()"); - for (uint32_t i = 0; i < bindingCount; ++i) { - auto buffer_state = GetBufferState(dev_data, pBuffers[i]); - assert(buffer_state); - skip |= ValidateMemoryIsBoundToBuffer(dev_data, buffer_state, "vkCmdBindVertexBuffers()", VALIDATION_ERROR_182004e8); - std::function<bool()> function = [=]() { - return ValidateBufferMemoryIsValid(dev_data, buffer_state, "vkCmdBindVertexBuffers()"); - }; - cb_node->queue_submit_functions.push_back(function); - if (pOffsets[i] >= buffer_state->createInfo.size) { - skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, - HandleToUint64(buffer_state->buffer), __LINE__, VALIDATION_ERROR_182004e4, "DS", - "vkCmdBindVertexBuffers() offset (0x%" PRIxLEAST64 ") is beyond the end of the buffer. %s", - pOffsets[i], validation_error_map[VALIDATION_ERROR_182004e4]); - } + assert(cb_node); + + skip |= ValidateCmdQueueFlags(dev_data, cb_node, "vkCmdBindVertexBuffers()", VK_QUEUE_GRAPHICS_BIT, VALIDATION_ERROR_18202415); + skip |= ValidateCmd(dev_data, cb_node, CMD_BINDVERTEXBUFFER, "vkCmdBindVertexBuffers()"); + for (uint32_t i = 0; i < bindingCount; ++i) { + auto buffer_state = GetBufferState(dev_data, pBuffers[i]); + assert(buffer_state); + skip |= ValidateBufferUsageFlags(dev_data, buffer_state, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, true, + VALIDATION_ERROR_182004e6, "vkCmdBindVertexBuffers()", "VK_BUFFER_USAGE_VERTEX_BUFFER_BIT"); + skip |= ValidateMemoryIsBoundToBuffer(dev_data, buffer_state, "vkCmdBindVertexBuffers()", VALIDATION_ERROR_182004e8); + if (pOffsets[i] >= buffer_state->createInfo.size) { + skip |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, + HandleToUint64(buffer_state->buffer), __LINE__, VALIDATION_ERROR_182004e4, "DS", + "vkCmdBindVertexBuffers() offset (0x%" PRIxLEAST64 ") is beyond the end of the buffer. %s", + pOffsets[i], validation_error_map[VALIDATION_ERROR_182004e4]); } - updateResourceTracking(cb_node, firstBinding, bindingCount, pBuffers); - } else { - assert(0); } + + if (skip) + return; + + for (uint32_t i = 0; i < bindingCount; ++i) { + auto buffer_state = GetBufferState(dev_data, pBuffers[i]); + assert(buffer_state); + std::function<bool()> function = [=]() { + return ValidateBufferMemoryIsValid(dev_data, buffer_state, "vkCmdBindVertexBuffers()"); + }; + cb_node->queue_submit_functions.push_back(function); + } + + updateResourceTracking(cb_node, firstBinding, bindingCount, pBuffers); + lock.unlock(); - if (!skip) dev_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets); + dev_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets); } // Expects global_lock to be held by caller diff --git a/layers/vk_validation_error_database.txt b/layers/vk_validation_error_database.txt index 17208fba..0b6b27ad 100644 --- a/layers/vk_validation_error_database.txt +++ b/layers/vk_validation_error_database.txt @@ -1625,7 +1625,7 @@ VALIDATION_ERROR_18200009~^~Y~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-vkCmdBin VALIDATION_ERROR_182004e0~^~N~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-vkCmdBindVertexBuffers-firstBinding-00624~^~core~^~The spec valid usage text states 'firstBinding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBindVertexBuffers-firstBinding-00624)~^~ VALIDATION_ERROR_182004e2~^~N~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-vkCmdBindVertexBuffers-firstBinding-00625~^~core~^~The spec valid usage text states 'The sum of firstBinding and bindingCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBindVertexBuffers-firstBinding-00625)~^~ VALIDATION_ERROR_182004e4~^~Y~^~BadVertexBufferOffset~^~vkCmdBindVertexBuffers~^~VUID-vkCmdBindVertexBuffers-pOffsets-00626~^~core~^~The spec valid usage text states 'All elements of pOffsets must be less than the size of the corresponding element in pBuffers' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBindVertexBuffers-pOffsets-00626)~^~ -VALIDATION_ERROR_182004e6~^~N~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-vkCmdBindVertexBuffers-pBuffers-00627~^~core~^~The spec valid usage text states 'All elements of pBuffers must have been created with the VK_BUFFER_USAGE_VERTEX_BUFFER_BIT flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBindVertexBuffers-pBuffers-00627)~^~ +VALIDATION_ERROR_182004e6~^~Y~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-vkCmdBindVertexBuffers-pBuffers-00627~^~core~^~The spec valid usage text states 'All elements of pBuffers must have been created with the VK_BUFFER_USAGE_VERTEX_BUFFER_BIT flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBindVertexBuffers-pBuffers-00627)~^~ VALIDATION_ERROR_182004e8~^~Y~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-vkCmdBindVertexBuffers-pBuffers-00628~^~core~^~The spec valid usage text states 'Each element of pBuffers that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBindVertexBuffers-pBuffers-00628)~^~ VALIDATION_ERROR_1820181b~^~Y~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-vkCmdBindVertexBuffers-bindingCount-arraylength~^~core~^~The spec valid usage text states 'bindingCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBindVertexBuffers-bindingCount-arraylength)~^~implicit VALIDATION_ERROR_18202401~^~Y~^~None~^~vkCmdBindVertexBuffers~^~VUID-vkCmdBindVertexBuffers-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBindVertexBuffers-commandBuffer-parameter)~^~implicit |
