aboutsummaryrefslogtreecommitdiff
path: root/layers/draw_state.cpp
diff options
context:
space:
mode:
authorTobin Ehlis <tobin@lunarg.com>2015-09-17 12:24:13 -0600
committerTobin Ehlis <tobin@lunarg.com>2015-09-21 11:41:54 -0600
commit8c518a7809b6d6914532a3383cda5e8df02c42d7 (patch)
tree0ce3ad134ae749eba79eda2d4ff12207e41be571 /layers/draw_state.cpp
parent71ccff011ec16ed932fe8b58504f05d3915b64cb (diff)
downloadusermoji-8c518a7809b6d6914532a3383cda5e8df02c42d7.tar.xz
layers: Add Idx buffer alignment check to DrawState
At vkCmdBindIndexBuffer() time, verify that offset param falls on an aligment boundary as set by indexType param. New check enum is DRAWSTATE_VTX_INDEX_ALIGNMENT_ERROR. Removed checks for this from the driver and added a validation test and documentation for the new check. ParamChecker has a check to verify indexType param is an acceptable value, but it's after the call so documented a TODO for ParamChecker to push this check prior to call.
Diffstat (limited to 'layers/draw_state.cpp')
-rw-r--r--layers/draw_state.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 4a894f24..cf101b73 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -2381,15 +2381,29 @@ VK_LAYER_EXPORT void VKAPI vkCmdBindIndexBuffer(VkCmdBuffer cmdBuffer, VkBuffer
if (!pCB->activeRenderPass) {
skipCall |= log_msg(mdd(pCB->cmdBuffer), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_NO_ACTIVE_RENDERPASS, "DS",
"Incorrect call to vkCmdBindIndexBuffer() without an active RenderPass.");
- } else {
- // TODO : Can be more exact in tracking/validating details for Idx buffer, for now just make sure *something* was bound
- pCB->status |= CBSTATUS_INDEX_BUFFER_BOUND;
- updateCBTracking(cmdBuffer);
- skipCall |= addCmd(pCB, 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)) {
+ skipCall |= log_msg(mdd(pCB->cmdBuffer), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, 0, 0, DRAWSTATE_VTX_INDEX_ALIGNMENT_ERROR, "DS",
+ "vkCmdBindIndexBuffer() offset (%#" PRIxLEAST64 ") does not fall on alignment (%s) boundary.", offset, string_VkIndexType(indexType));
}
} else {
skipCall |= report_error_no_cb_begin(cmdBuffer, "vkCmdBindIndexBuffer()");
}
+ pCB->status |= CBSTATUS_INDEX_BUFFER_BOUND;
+ updateCBTracking(cmdBuffer);
+ skipCall |= addCmd(pCB, CMD_BINDINDEXBUFFER);
}
if (VK_FALSE == skipCall)
get_dispatch_table(draw_state_device_table_map, cmdBuffer)->CmdBindIndexBuffer(cmdBuffer, buffer, offset, indexType);