aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Forbes <chrisforbes@google.com>2017-09-14 16:03:37 -0700
committerChris Forbes <chrisf@ijw.co.nz>2017-09-15 13:43:08 -0700
commitb93993eac00e379e5448b54af2a8af71f6983b66 (patch)
treeceb38959dda6a34d99f6d0c7cdb34adf9c883e49
parentfabaad9a6dae4865ecf8d424fe8543a3d5a5ba08 (diff)
downloadusermoji-b93993eac00e379e5448b54af2a8af71f6983b66.tar.xz
layers: Implement VU check for BUFFER_USAGE_VERTEX_BUFFER_BIT
-rw-r--r--layers/core_validation.cpp54
-rw-r--r--layers/vk_validation_error_database.txt2
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