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
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index dda03da..eaf7dd6 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -7341,32 +7341,36 @@
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 (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()");
}
- 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 {
assert(0);
}
@@ -7395,20 +7399,25 @@
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);