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.
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 4a894f2..cf101b7 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -2381,15 +2381,29 @@
             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);