diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2017-02-14 13:17:35 -0700 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-02-15 11:28:39 -0700 |
| commit | a0536133d2df6e08faec0fbf40e1419fda436603 (patch) | |
| tree | 01aef384343dadf3a5a39ee5432b46220b2a2126 /layers/core_validation.cpp | |
| parent | f435214742a330de5b284175e74a7e7075e269f2 (diff) | |
| download | usermoji-a0536133d2df6e08faec0fbf40e1419fda436603.tar.xz | |
layers: Fix CB status checks in bindVtx/IndexBuffer
These calls were calling the wrong validate function if a CB_NODE
was not found. Fixed this and added appropriate calls to check the
CB recording state.
Change-Id: I8f22f5bca7233fc92b0b91f3aceb8c38b312dc8f
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 83 |
1 files changed, 46 insertions, 37 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index dda03daf..eaf7dd6d 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -7341,32 +7341,36 @@ VKAPI_ATTR void VKAPI_CALL CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkB auto buffer_state = GetBufferState(dev_data, buffer); auto cb_node = GetCBNode(dev_data, commandBuffer); if (cb_node && buffer_state) { - skip_call |= ValidateMemoryIsBoundToBuffer(dev_data, buffer_state, "vkCmdBindIndexBuffer()", VALIDATION_ERROR_02543); - std::function<bool()> function = [=]() { - return ValidateBufferMemoryIsValid(dev_data, buffer_state, "vkCmdBindIndexBuffer()"); - }; - cb_node->validate_functions.push_back(function); - skip_call |= ValidateCmd(dev_data, cb_node, CMD_BINDINDEXBUFFER, "vkCmdBindIndexBuffer()"); - UpdateCmdBufferLastCmd(cb_node, CMD_BINDINDEXBUFFER); - VkDeviceSize offset_align = 0; - switch (indexType) { - case VK_INDEX_TYPE_UINT16: - offset_align = 2; - break; - case VK_INDEX_TYPE_UINT32: - offset_align = 4; - break; - default: - // ParamChecker should catch bad enum, we'll also throw alignment error below if offset_align stays 0 - break; - } - if (!offset_align || (offset % offset_align)) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_VTX_INDEX_ALIGNMENT_ERROR, "DS", - "vkCmdBindIndexBuffer() offset (0x%" PRIxLEAST64 ") does not fall on alignment (%s) boundary.", - offset, string_VkIndexType(indexType)); + if (cb_node->state == CB_RECORDING) { + skip_call |= ValidateMemoryIsBoundToBuffer(dev_data, buffer_state, "vkCmdBindIndexBuffer()", VALIDATION_ERROR_02543); + std::function<bool()> function = [=]() { + return ValidateBufferMemoryIsValid(dev_data, buffer_state, "vkCmdBindIndexBuffer()"); + }; + cb_node->validate_functions.push_back(function); + skip_call |= ValidateCmd(dev_data, cb_node, CMD_BINDINDEXBUFFER, "vkCmdBindIndexBuffer()"); + UpdateCmdBufferLastCmd(cb_node, CMD_BINDINDEXBUFFER); + VkDeviceSize offset_align = 0; + switch (indexType) { + case VK_INDEX_TYPE_UINT16: + offset_align = 2; + break; + case VK_INDEX_TYPE_UINT32: + offset_align = 4; + break; + default: + // ParamChecker should catch bad enum, we'll also throw alignment error below if offset_align stays 0 + break; + } + if (!offset_align || (offset % offset_align)) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, + __LINE__, DRAWSTATE_VTX_INDEX_ALIGNMENT_ERROR, "DS", + "vkCmdBindIndexBuffer() offset (0x%" PRIxLEAST64 ") does not fall on alignment (%s) boundary.", + offset, string_VkIndexType(indexType)); + } + cb_node->status |= CBSTATUS_INDEX_BUFFER_BOUND; + } else { + skip_call |= report_error_no_cb_begin(dev_data, commandBuffer, "CmdBindIndexBuffer()"); } - cb_node->status |= CBSTATUS_INDEX_BUFFER_BOUND; } else { assert(0); } @@ -7395,20 +7399,25 @@ VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, u auto cb_node = GetCBNode(dev_data, commandBuffer); if (cb_node) { - for (uint32_t i = 0; i < bindingCount; ++i) { - auto buffer_state = GetBufferState(dev_data, pBuffers[i]); - assert(buffer_state); - skip_call |= ValidateMemoryIsBoundToBuffer(dev_data, buffer_state, "vkCmdBindVertexBuffers()", VALIDATION_ERROR_02546); - std::function<bool()> function = [=]() { - return ValidateBufferMemoryIsValid(dev_data, buffer_state, "vkCmdBindVertexBuffers()"); - }; - cb_node->validate_functions.push_back(function); + if (cb_node->state == CB_RECORDING) { + for (uint32_t i = 0; i < bindingCount; ++i) { + auto buffer_state = GetBufferState(dev_data, pBuffers[i]); + assert(buffer_state); + skip_call |= + ValidateMemoryIsBoundToBuffer(dev_data, buffer_state, "vkCmdBindVertexBuffers()", VALIDATION_ERROR_02546); + std::function<bool()> function = [=]() { + return ValidateBufferMemoryIsValid(dev_data, buffer_state, "vkCmdBindVertexBuffers()"); + }; + cb_node->validate_functions.push_back(function); + } + skip_call |= ValidateCmd(dev_data, cb_node, CMD_BINDVERTEXBUFFER, "vkCmdBindVertexBuffer()"); + UpdateCmdBufferLastCmd(cb_node, CMD_BINDVERTEXBUFFER); + updateResourceTracking(cb_node, firstBinding, bindingCount, pBuffers); + } else { + skip_call |= report_error_no_cb_begin(dev_data, commandBuffer, "vkCmdBindVertexBuffer()"); } - skip_call |= ValidateCmd(dev_data, cb_node, CMD_BINDVERTEXBUFFER, "vkCmdBindVertexBuffer()"); - UpdateCmdBufferLastCmd(cb_node, CMD_BINDVERTEXBUFFER); - updateResourceTracking(cb_node, firstBinding, bindingCount, pBuffers); } else { - skip_call |= report_error_no_cb_begin(dev_data, commandBuffer, "vkCmdBindVertexBuffer()"); + assert(0); } lock.unlock(); if (!skip_call) dev_data->dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets); |
