diff options
| author | Tobin Ehlis <tobin@lunarg.com> | 2015-09-17 12:24:13 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobin@lunarg.com> | 2015-09-21 11:41:54 -0600 |
| commit | 8c518a7809b6d6914532a3383cda5e8df02c42d7 (patch) | |
| tree | 0ce3ad134ae749eba79eda2d4ff12207e41be571 /layers/draw_state.cpp | |
| parent | 71ccff011ec16ed932fe8b58504f05d3915b64cb (diff) | |
| download | usermoji-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.cpp | 24 |
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); |
