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 /layers/core_validation.cpp | |
| parent | fabaad9a6dae4865ecf8d424fe8543a3d5a5ba08 (diff) | |
| download | usermoji-b93993eac00e379e5448b54af2a8af71f6983b66.tar.xz | |
layers: Implement VU check for BUFFER_USAGE_VERTEX_BUFFER_BIT
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 54 |
1 files changed, 31 insertions, 23 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 |
