xref: /aosp_15_r20/external/vulkan-validation-layers/layers/drawdispatch.cpp (revision b7893ccf7851cd6a48cc5a1e965257d8a5cdcc70)
1*b7893ccfSSadaf Ebrahimi /* Copyright (c) 2015-2019 The Khronos Group Inc.
2*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2019 Valve Corporation
3*b7893ccfSSadaf Ebrahimi  * Copyright (c) 2015-2019 LunarG, Inc.
4*b7893ccfSSadaf Ebrahimi  * Copyright (C) 2015-2019 Google Inc.
5*b7893ccfSSadaf Ebrahimi  *
6*b7893ccfSSadaf Ebrahimi  * Licensed under the Apache License, Version 2.0 (the "License");
7*b7893ccfSSadaf Ebrahimi  * you may not use this file except in compliance with the License.
8*b7893ccfSSadaf Ebrahimi  * You may obtain a copy of the License at
9*b7893ccfSSadaf Ebrahimi  *
10*b7893ccfSSadaf Ebrahimi  *     http://www.apache.org/licenses/LICENSE-2.0
11*b7893ccfSSadaf Ebrahimi  *
12*b7893ccfSSadaf Ebrahimi  * Unless required by applicable law or agreed to in writing, software
13*b7893ccfSSadaf Ebrahimi  * distributed under the License is distributed on an "AS IS" BASIS,
14*b7893ccfSSadaf Ebrahimi  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*b7893ccfSSadaf Ebrahimi  * See the License for the specific language governing permissions and
16*b7893ccfSSadaf Ebrahimi  * limitations under the License.
17*b7893ccfSSadaf Ebrahimi  *
18*b7893ccfSSadaf Ebrahimi  * Author: Cody Northrop <[email protected]>
19*b7893ccfSSadaf Ebrahimi  * Author: Michael Lentine <[email protected]>
20*b7893ccfSSadaf Ebrahimi  * Author: Tobin Ehlis <[email protected]>
21*b7893ccfSSadaf Ebrahimi  * Author: Chia-I Wu <[email protected]>
22*b7893ccfSSadaf Ebrahimi  * Author: Chris Forbes <[email protected]>
23*b7893ccfSSadaf Ebrahimi  * Author: Mark Lobodzinski <[email protected]>
24*b7893ccfSSadaf Ebrahimi  * Author: Ian Elliott <[email protected]>
25*b7893ccfSSadaf Ebrahimi  * Author: Dave Houlton <[email protected]>
26*b7893ccfSSadaf Ebrahimi  * Author: Dustin Graves <[email protected]>
27*b7893ccfSSadaf Ebrahimi  * Author: Jeremy Hayes <[email protected]>
28*b7893ccfSSadaf Ebrahimi  * Author: Jon Ashburn <[email protected]>
29*b7893ccfSSadaf Ebrahimi  * Author: Karl Schultz <[email protected]>
30*b7893ccfSSadaf Ebrahimi  * Author: Mark Young <[email protected]>
31*b7893ccfSSadaf Ebrahimi  * Author: Mike Schuchardt <[email protected]>
32*b7893ccfSSadaf Ebrahimi  * Author: Mike Weiblen <[email protected]>
33*b7893ccfSSadaf Ebrahimi  * Author: Tony Barbour <[email protected]>
34*b7893ccfSSadaf Ebrahimi  * Author: John Zulauf <[email protected]>
35*b7893ccfSSadaf Ebrahimi  * Author: Shannon McPherson <[email protected]>
36*b7893ccfSSadaf Ebrahimi  */
37*b7893ccfSSadaf Ebrahimi 
38*b7893ccfSSadaf Ebrahimi // Allow use of STL min and max functions in Windows
39*b7893ccfSSadaf Ebrahimi #define NOMINMAX
40*b7893ccfSSadaf Ebrahimi 
41*b7893ccfSSadaf Ebrahimi #include "chassis.h"
42*b7893ccfSSadaf Ebrahimi #include "core_validation.h"
43*b7893ccfSSadaf Ebrahimi 
UpdateResourceTrackingOnDraw(CMD_BUFFER_STATE * pCB)44*b7893ccfSSadaf Ebrahimi static inline void UpdateResourceTrackingOnDraw(CMD_BUFFER_STATE *pCB) {
45*b7893ccfSSadaf Ebrahimi     pCB->cb_vertex_buffer_binding_info.push_back(pCB->current_vertex_buffer_binding_info);
46*b7893ccfSSadaf Ebrahimi }
47*b7893ccfSSadaf Ebrahimi 
48*b7893ccfSSadaf Ebrahimi // Generic function to handle validation for all CmdDraw* type functions
ValidateCmdDrawType(VkCommandBuffer cmd_buffer,bool indexed,VkPipelineBindPoint bind_point,CMD_TYPE cmd_type,const char * caller,VkQueueFlags queue_flags,const char * queue_flag_code,const char * renderpass_msg_code,const char * pipebound_msg_code,const char * dynamic_state_msg_code) const49*b7893ccfSSadaf Ebrahimi bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
50*b7893ccfSSadaf Ebrahimi                                      const char *caller, VkQueueFlags queue_flags, const char *queue_flag_code,
51*b7893ccfSSadaf Ebrahimi                                      const char *renderpass_msg_code, const char *pipebound_msg_code,
52*b7893ccfSSadaf Ebrahimi                                      const char *dynamic_state_msg_code) const {
53*b7893ccfSSadaf Ebrahimi     bool skip = false;
54*b7893ccfSSadaf Ebrahimi     const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
55*b7893ccfSSadaf Ebrahimi     if (cb_state) {
56*b7893ccfSSadaf Ebrahimi         skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, queue_flag_code);
57*b7893ccfSSadaf Ebrahimi         skip |= ValidateCmd(cb_state, cmd_type, caller);
58*b7893ccfSSadaf Ebrahimi         skip |=
59*b7893ccfSSadaf Ebrahimi             ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller, pipebound_msg_code, dynamic_state_msg_code);
60*b7893ccfSSadaf Ebrahimi         skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, renderpass_msg_code)
61*b7893ccfSSadaf Ebrahimi                                                                 : InsideRenderPass(cb_state, caller, renderpass_msg_code);
62*b7893ccfSSadaf Ebrahimi     }
63*b7893ccfSSadaf Ebrahimi     return skip;
64*b7893ccfSSadaf Ebrahimi }
65*b7893ccfSSadaf Ebrahimi 
66*b7893ccfSSadaf Ebrahimi // Generic function to handle state update for all CmdDraw* and CmdDispatch* type functions
UpdateStateCmdDrawDispatchType(CMD_BUFFER_STATE * cb_state,VkPipelineBindPoint bind_point)67*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::UpdateStateCmdDrawDispatchType(CMD_BUFFER_STATE *cb_state, VkPipelineBindPoint bind_point) {
68*b7893ccfSSadaf Ebrahimi     UpdateDrawState(cb_state, bind_point);
69*b7893ccfSSadaf Ebrahimi     cb_state->hasDispatchCmd = true;
70*b7893ccfSSadaf Ebrahimi }
71*b7893ccfSSadaf Ebrahimi 
72*b7893ccfSSadaf Ebrahimi // Generic function to handle state update for all CmdDraw* type functions
UpdateStateCmdDrawType(CMD_BUFFER_STATE * cb_state,VkPipelineBindPoint bind_point)73*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::UpdateStateCmdDrawType(CMD_BUFFER_STATE *cb_state, VkPipelineBindPoint bind_point) {
74*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawDispatchType(cb_state, bind_point);
75*b7893ccfSSadaf Ebrahimi     UpdateResourceTrackingOnDraw(cb_state);
76*b7893ccfSSadaf Ebrahimi     cb_state->hasDrawCmd = true;
77*b7893ccfSSadaf Ebrahimi }
78*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDraw(VkCommandBuffer commandBuffer,uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex,uint32_t firstInstance)79*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
80*b7893ccfSSadaf Ebrahimi                                         uint32_t firstVertex, uint32_t firstInstance) {
81*b7893ccfSSadaf Ebrahimi     return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
82*b7893ccfSSadaf Ebrahimi                                VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDraw-commandBuffer-cmdpool", "VUID-vkCmdDraw-renderpass",
83*b7893ccfSSadaf Ebrahimi                                "VUID-vkCmdDraw-None-02700", "VUID-vkCmdDraw-commandBuffer-02701");
84*b7893ccfSSadaf Ebrahimi }
85*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDraw(VkCommandBuffer commandBuffer,uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex,uint32_t firstInstance)86*b7893ccfSSadaf Ebrahimi void CoreChecks::PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
87*b7893ccfSSadaf Ebrahimi                                       uint32_t firstVertex, uint32_t firstInstance) {
88*b7893ccfSSadaf Ebrahimi     GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
89*b7893ccfSSadaf Ebrahimi }
90*b7893ccfSSadaf Ebrahimi 
PostCallRecordCmdDraw(VkCommandBuffer commandBuffer,uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex,uint32_t firstInstance)91*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
92*b7893ccfSSadaf Ebrahimi                                                    uint32_t firstVertex, uint32_t firstInstance) {
93*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
94*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
95*b7893ccfSSadaf Ebrahimi }
96*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer,uint32_t indexCount,uint32_t instanceCount,uint32_t firstIndex,int32_t vertexOffset,uint32_t firstInstance)97*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
98*b7893ccfSSadaf Ebrahimi                                                uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
99*b7893ccfSSadaf Ebrahimi     bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
100*b7893ccfSSadaf Ebrahimi                                     VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
101*b7893ccfSSadaf Ebrahimi                                     "VUID-vkCmdDrawIndexed-renderpass", "VUID-vkCmdDrawIndexed-None-02700",
102*b7893ccfSSadaf Ebrahimi                                     "VUID-vkCmdDrawIndexed-commandBuffer-02701");
103*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
104*b7893ccfSSadaf Ebrahimi     if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
105*b7893ccfSSadaf Ebrahimi         unsigned int index_size = 0;
106*b7893ccfSSadaf Ebrahimi         const auto &index_buffer_binding = cb_state->index_buffer_binding;
107*b7893ccfSSadaf Ebrahimi         if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
108*b7893ccfSSadaf Ebrahimi             index_size = 2;
109*b7893ccfSSadaf Ebrahimi         } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
110*b7893ccfSSadaf Ebrahimi             index_size = 4;
111*b7893ccfSSadaf Ebrahimi         } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
112*b7893ccfSSadaf Ebrahimi             index_size = 1;
113*b7893ccfSSadaf Ebrahimi         }
114*b7893ccfSSadaf Ebrahimi         VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
115*b7893ccfSSadaf Ebrahimi         if (end_offset > index_buffer_binding.size) {
116*b7893ccfSSadaf Ebrahimi             skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
117*b7893ccfSSadaf Ebrahimi                             HandleToUint64(index_buffer_binding.buffer), "VUID-vkCmdDrawIndexed-indexSize-00463",
118*b7893ccfSSadaf Ebrahimi                             "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
119*b7893ccfSSadaf Ebrahimi                             "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
120*b7893ccfSSadaf Ebrahimi                             " bytes, "
121*b7893ccfSSadaf Ebrahimi                             "which is greater than the index buffer size (%" PRIuLEAST64 ").",
122*b7893ccfSSadaf Ebrahimi                             index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
123*b7893ccfSSadaf Ebrahimi         }
124*b7893ccfSSadaf Ebrahimi     }
125*b7893ccfSSadaf Ebrahimi     return skip;
126*b7893ccfSSadaf Ebrahimi }
127*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer,uint32_t indexCount,uint32_t instanceCount,uint32_t firstIndex,int32_t vertexOffset,uint32_t firstInstance)128*b7893ccfSSadaf Ebrahimi void CoreChecks::PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
129*b7893ccfSSadaf Ebrahimi                                              uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
130*b7893ccfSSadaf Ebrahimi     GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
131*b7893ccfSSadaf Ebrahimi }
132*b7893ccfSSadaf Ebrahimi 
PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer,uint32_t indexCount,uint32_t instanceCount,uint32_t firstIndex,int32_t vertexOffset,uint32_t firstInstance)133*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
134*b7893ccfSSadaf Ebrahimi                                                           uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
135*b7893ccfSSadaf Ebrahimi                                                           uint32_t firstInstance) {
136*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
137*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
138*b7893ccfSSadaf Ebrahimi }
139*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t count,uint32_t stride)140*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
141*b7893ccfSSadaf Ebrahimi                                                 uint32_t stride) {
142*b7893ccfSSadaf Ebrahimi     bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
143*b7893ccfSSadaf Ebrahimi                                     VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
144*b7893ccfSSadaf Ebrahimi                                     "VUID-vkCmdDrawIndirect-renderpass", "VUID-vkCmdDrawIndirect-None-02700",
145*b7893ccfSSadaf Ebrahimi                                     "VUID-vkCmdDrawIndirect-commandBuffer-02701");
146*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *buffer_state = GetBufferState(buffer);
147*b7893ccfSSadaf Ebrahimi     skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirect()", "VUID-vkCmdDrawIndirect-buffer-02708");
148*b7893ccfSSadaf Ebrahimi     skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDrawIndirect-buffer-02709",
149*b7893ccfSSadaf Ebrahimi                                      "vkCmdDrawIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
150*b7893ccfSSadaf Ebrahimi     if (count > 1) {
151*b7893ccfSSadaf Ebrahimi         skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
152*b7893ccfSSadaf Ebrahimi                                                 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
153*b7893ccfSSadaf Ebrahimi         skip |=
154*b7893ccfSSadaf Ebrahimi             ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
155*b7893ccfSSadaf Ebrahimi                                             "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
156*b7893ccfSSadaf Ebrahimi     }
157*b7893ccfSSadaf Ebrahimi     // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
158*b7893ccfSSadaf Ebrahimi     // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
159*b7893ccfSSadaf Ebrahimi     return skip;
160*b7893ccfSSadaf Ebrahimi }
161*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t count,uint32_t stride)162*b7893ccfSSadaf Ebrahimi void CoreChecks::PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
163*b7893ccfSSadaf Ebrahimi                                               uint32_t stride) {
164*b7893ccfSSadaf Ebrahimi     GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
165*b7893ccfSSadaf Ebrahimi }
166*b7893ccfSSadaf Ebrahimi 
PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t count,uint32_t stride)167*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
168*b7893ccfSSadaf Ebrahimi                                                            uint32_t count, uint32_t stride) {
169*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
170*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *buffer_state = GetBufferState(buffer);
171*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
172*b7893ccfSSadaf Ebrahimi     AddCommandBufferBindingBuffer(cb_state, buffer_state);
173*b7893ccfSSadaf Ebrahimi }
174*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t count,uint32_t stride)175*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
176*b7893ccfSSadaf Ebrahimi                                                        uint32_t count, uint32_t stride) {
177*b7893ccfSSadaf Ebrahimi     bool skip = ValidateCmdDrawType(
178*b7893ccfSSadaf Ebrahimi         commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()",
179*b7893ccfSSadaf Ebrahimi         VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool", "VUID-vkCmdDrawIndexedIndirect-renderpass",
180*b7893ccfSSadaf Ebrahimi         "VUID-vkCmdDrawIndexedIndirect-None-02700", "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701");
181*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *buffer_state = GetBufferState(buffer);
182*b7893ccfSSadaf Ebrahimi     skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirect()", "VUID-vkCmdDrawIndexedIndirect-buffer-02708");
183*b7893ccfSSadaf Ebrahimi     skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
184*b7893ccfSSadaf Ebrahimi                                      "VUID-vkCmdDrawIndexedIndirect-buffer-02709", "vkCmdDrawIndexedIndirect()",
185*b7893ccfSSadaf Ebrahimi                                      "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
186*b7893ccfSSadaf Ebrahimi     if (count > 1) {
187*b7893ccfSSadaf Ebrahimi         skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
188*b7893ccfSSadaf Ebrahimi                                                 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
189*b7893ccfSSadaf Ebrahimi         skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
190*b7893ccfSSadaf Ebrahimi                                                 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
191*b7893ccfSSadaf Ebrahimi                                                 buffer_state);
192*b7893ccfSSadaf Ebrahimi     }
193*b7893ccfSSadaf Ebrahimi     // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
194*b7893ccfSSadaf Ebrahimi     // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
195*b7893ccfSSadaf Ebrahimi     // 'buffer'.
196*b7893ccfSSadaf Ebrahimi     return skip;
197*b7893ccfSSadaf Ebrahimi }
198*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t count,uint32_t stride)199*b7893ccfSSadaf Ebrahimi void CoreChecks::PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
200*b7893ccfSSadaf Ebrahimi                                                      uint32_t count, uint32_t stride) {
201*b7893ccfSSadaf Ebrahimi     GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
202*b7893ccfSSadaf Ebrahimi }
203*b7893ccfSSadaf Ebrahimi 
PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t count,uint32_t stride)204*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
205*b7893ccfSSadaf Ebrahimi                                                                   VkDeviceSize offset, uint32_t count, uint32_t stride) {
206*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
207*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *buffer_state = GetBufferState(buffer);
208*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
209*b7893ccfSSadaf Ebrahimi     AddCommandBufferBindingBuffer(cb_state, buffer_state);
210*b7893ccfSSadaf Ebrahimi }
211*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer,uint32_t x,uint32_t y,uint32_t z)212*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
213*b7893ccfSSadaf Ebrahimi     bool skip = false;
214*b7893ccfSSadaf Ebrahimi     skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
215*b7893ccfSSadaf Ebrahimi                                 VK_QUEUE_COMPUTE_BIT, "VUID-vkCmdDispatch-commandBuffer-cmdpool", "VUID-vkCmdDispatch-renderpass",
216*b7893ccfSSadaf Ebrahimi                                 "VUID-vkCmdDispatch-None-02700", kVUIDUndefined);
217*b7893ccfSSadaf Ebrahimi     return skip;
218*b7893ccfSSadaf Ebrahimi }
219*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer,uint32_t x,uint32_t y,uint32_t z)220*b7893ccfSSadaf Ebrahimi void CoreChecks::PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
221*b7893ccfSSadaf Ebrahimi     GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE);
222*b7893ccfSSadaf Ebrahimi }
223*b7893ccfSSadaf Ebrahimi 
PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer,uint32_t x,uint32_t y,uint32_t z)224*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
225*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
226*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_COMPUTE);
227*b7893ccfSSadaf Ebrahimi }
228*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset)229*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
230*b7893ccfSSadaf Ebrahimi     bool skip =
231*b7893ccfSSadaf Ebrahimi         ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()",
232*b7893ccfSSadaf Ebrahimi                             VK_QUEUE_COMPUTE_BIT, "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
233*b7893ccfSSadaf Ebrahimi                             "VUID-vkCmdDispatchIndirect-renderpass", "VUID-vkCmdDispatchIndirect-None-02700", kVUIDUndefined);
234*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *buffer_state = GetBufferState(buffer);
235*b7893ccfSSadaf Ebrahimi     skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDispatchIndirect()", "VUID-vkCmdDispatchIndirect-buffer-02708");
236*b7893ccfSSadaf Ebrahimi     skip |=
237*b7893ccfSSadaf Ebrahimi         ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDispatchIndirect-buffer-02709",
238*b7893ccfSSadaf Ebrahimi                                  "vkCmdDispatchIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
239*b7893ccfSSadaf Ebrahimi     return skip;
240*b7893ccfSSadaf Ebrahimi }
241*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset)242*b7893ccfSSadaf Ebrahimi void CoreChecks::PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
243*b7893ccfSSadaf Ebrahimi     GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE);
244*b7893ccfSSadaf Ebrahimi }
245*b7893ccfSSadaf Ebrahimi 
PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset)246*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
247*b7893ccfSSadaf Ebrahimi                                                                VkDeviceSize offset) {
248*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
249*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_COMPUTE);
250*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *buffer_state = GetBufferState(buffer);
251*b7893ccfSSadaf Ebrahimi     AddCommandBufferBindingBuffer(cb_state, buffer_state);
252*b7893ccfSSadaf Ebrahimi }
253*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride)254*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
255*b7893ccfSSadaf Ebrahimi                                                         VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
256*b7893ccfSSadaf Ebrahimi                                                         uint32_t stride) {
257*b7893ccfSSadaf Ebrahimi     bool skip = false;
258*b7893ccfSSadaf Ebrahimi     if (offset & 3) {
259*b7893ccfSSadaf Ebrahimi         skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
260*b7893ccfSSadaf Ebrahimi                         HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndirectCountKHR-offset-02710",
261*b7893ccfSSadaf Ebrahimi                         "vkCmdDrawIndirectCountKHR() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.",
262*b7893ccfSSadaf Ebrahimi                         offset);
263*b7893ccfSSadaf Ebrahimi     }
264*b7893ccfSSadaf Ebrahimi 
265*b7893ccfSSadaf Ebrahimi     if (countBufferOffset & 3) {
266*b7893ccfSSadaf Ebrahimi         skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
267*b7893ccfSSadaf Ebrahimi                         HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndirectCountKHR-countBufferOffset-02716",
268*b7893ccfSSadaf Ebrahimi                         "vkCmdDrawIndirectCountKHR() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
269*b7893ccfSSadaf Ebrahimi                         "), is not a multiple of 4.",
270*b7893ccfSSadaf Ebrahimi                         countBufferOffset);
271*b7893ccfSSadaf Ebrahimi     }
272*b7893ccfSSadaf Ebrahimi     skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCountKHR-stride-03110", stride,
273*b7893ccfSSadaf Ebrahimi                                             "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
274*b7893ccfSSadaf Ebrahimi     if (maxDrawCount > 1) {
275*b7893ccfSSadaf Ebrahimi         const BUFFER_STATE *buffer_state = GetBufferState(buffer);
276*b7893ccfSSadaf Ebrahimi         skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCountKHR-maxDrawCount-03111", stride,
277*b7893ccfSSadaf Ebrahimi                                                 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), maxDrawCount, offset,
278*b7893ccfSSadaf Ebrahimi                                                 buffer_state);
279*b7893ccfSSadaf Ebrahimi     }
280*b7893ccfSSadaf Ebrahimi 
281*b7893ccfSSadaf Ebrahimi     skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNTKHR,
282*b7893ccfSSadaf Ebrahimi                                 "vkCmdDrawIndirectCountKHR()", VK_QUEUE_GRAPHICS_BIT,
283*b7893ccfSSadaf Ebrahimi                                 "VUID-vkCmdDrawIndirectCountKHR-commandBuffer-cmdpool", "VUID-vkCmdDrawIndirectCountKHR-renderpass",
284*b7893ccfSSadaf Ebrahimi                                 "VUID-vkCmdDrawIndirectCountKHR-None-02700", "VUID-vkCmdDrawIndirectCountKHR-commandBuffer-02701");
285*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *buffer_state = GetBufferState(buffer);
286*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
287*b7893ccfSSadaf Ebrahimi     skip |=
288*b7893ccfSSadaf Ebrahimi         ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirectCountKHR()", "VUID-vkCmdDrawIndirectCountKHR-buffer-02708");
289*b7893ccfSSadaf Ebrahimi     skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndirectCountKHR()",
290*b7893ccfSSadaf Ebrahimi                                           "VUID-vkCmdDrawIndirectCountKHR-countBuffer-02714");
291*b7893ccfSSadaf Ebrahimi     skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
292*b7893ccfSSadaf Ebrahimi                                      "VUID-vkCmdDrawIndirectCountKHR-buffer-02709", "vkCmdDrawIndirectCountKHR()",
293*b7893ccfSSadaf Ebrahimi                                      "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
294*b7893ccfSSadaf Ebrahimi     skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
295*b7893ccfSSadaf Ebrahimi                                      "VUID-vkCmdDrawIndirectCountKHR-countBuffer-02715", "vkCmdDrawIndirectCountKHR()",
296*b7893ccfSSadaf Ebrahimi                                      "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
297*b7893ccfSSadaf Ebrahimi     return skip;
298*b7893ccfSSadaf Ebrahimi }
299*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride)300*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
301*b7893ccfSSadaf Ebrahimi                                                                   VkDeviceSize offset, VkBuffer countBuffer,
302*b7893ccfSSadaf Ebrahimi                                                                   VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
303*b7893ccfSSadaf Ebrahimi                                                                   uint32_t stride) {
304*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
305*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *buffer_state = GetBufferState(buffer);
306*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
307*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
308*b7893ccfSSadaf Ebrahimi     AddCommandBufferBindingBuffer(cb_state, buffer_state);
309*b7893ccfSSadaf Ebrahimi     AddCommandBufferBindingBuffer(cb_state, count_buffer_state);
310*b7893ccfSSadaf Ebrahimi }
311*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride)312*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
313*b7893ccfSSadaf Ebrahimi                                                                VkBuffer countBuffer, VkDeviceSize countBufferOffset,
314*b7893ccfSSadaf Ebrahimi                                                                uint32_t maxDrawCount, uint32_t stride) {
315*b7893ccfSSadaf Ebrahimi     bool skip = false;
316*b7893ccfSSadaf Ebrahimi     if (offset & 3) {
317*b7893ccfSSadaf Ebrahimi         skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
318*b7893ccfSSadaf Ebrahimi                         HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndexedIndirectCountKHR-offset-02710",
319*b7893ccfSSadaf Ebrahimi                         "vkCmdDrawIndexedIndirectCountKHR() parameter, VkDeviceSize offset (0x%" PRIxLEAST64
320*b7893ccfSSadaf Ebrahimi                         "), is not a multiple of 4.",
321*b7893ccfSSadaf Ebrahimi                         offset);
322*b7893ccfSSadaf Ebrahimi     }
323*b7893ccfSSadaf Ebrahimi 
324*b7893ccfSSadaf Ebrahimi     if (countBufferOffset & 3) {
325*b7893ccfSSadaf Ebrahimi         skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
326*b7893ccfSSadaf Ebrahimi                         HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndexedIndirectCountKHR-countBufferOffset-02716",
327*b7893ccfSSadaf Ebrahimi                         "vkCmdDrawIndexedIndirectCountKHR() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
328*b7893ccfSSadaf Ebrahimi                         "), is not a multiple of 4.",
329*b7893ccfSSadaf Ebrahimi                         countBufferOffset);
330*b7893ccfSSadaf Ebrahimi     }
331*b7893ccfSSadaf Ebrahimi 
332*b7893ccfSSadaf Ebrahimi     skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCountKHR-stride-03142", stride,
333*b7893ccfSSadaf Ebrahimi                                             "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
334*b7893ccfSSadaf Ebrahimi     if (maxDrawCount > 1) {
335*b7893ccfSSadaf Ebrahimi         const BUFFER_STATE *buffer_state = GetBufferState(buffer);
336*b7893ccfSSadaf Ebrahimi         skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCountKHR-maxDrawCount-03143", stride,
337*b7893ccfSSadaf Ebrahimi                                                 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset,
338*b7893ccfSSadaf Ebrahimi                                                 buffer_state);
339*b7893ccfSSadaf Ebrahimi     }
340*b7893ccfSSadaf Ebrahimi 
341*b7893ccfSSadaf Ebrahimi     skip |= ValidateCmdDrawType(
342*b7893ccfSSadaf Ebrahimi         commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNTKHR, "vkCmdDrawIndexedIndirectCountKHR()",
343*b7893ccfSSadaf Ebrahimi         VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexedIndirectCountKHR-commandBuffer-cmdpool",
344*b7893ccfSSadaf Ebrahimi         "VUID-vkCmdDrawIndexedIndirectCountKHR-renderpass", "VUID-vkCmdDrawIndexedIndirectCountKHR-None-02700",
345*b7893ccfSSadaf Ebrahimi         "VUID-vkCmdDrawIndexedIndirectCountKHR-commandBuffer-02701");
346*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *buffer_state = GetBufferState(buffer);
347*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
348*b7893ccfSSadaf Ebrahimi     skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirectCountKHR()",
349*b7893ccfSSadaf Ebrahimi                                           "VUID-vkCmdDrawIndexedIndirectCountKHR-buffer-02708");
350*b7893ccfSSadaf Ebrahimi     skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndexedIndirectCountKHR()",
351*b7893ccfSSadaf Ebrahimi                                           "VUID-vkCmdDrawIndexedIndirectCountKHR-countBuffer-02714");
352*b7893ccfSSadaf Ebrahimi     skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
353*b7893ccfSSadaf Ebrahimi                                      "VUID-vkCmdDrawIndexedIndirectCountKHR-buffer-02709", "vkCmdDrawIndexedIndirectCountKHR()",
354*b7893ccfSSadaf Ebrahimi                                      "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
355*b7893ccfSSadaf Ebrahimi     skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
356*b7893ccfSSadaf Ebrahimi                                      "VUID-vkCmdDrawIndexedIndirectCountKHR-countBuffer-02715",
357*b7893ccfSSadaf Ebrahimi                                      "vkCmdDrawIndexedIndirectCountKHR()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
358*b7893ccfSSadaf Ebrahimi     return skip;
359*b7893ccfSSadaf Ebrahimi }
360*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride)361*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
362*b7893ccfSSadaf Ebrahimi                                                                          VkDeviceSize offset, VkBuffer countBuffer,
363*b7893ccfSSadaf Ebrahimi                                                                          VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
364*b7893ccfSSadaf Ebrahimi                                                                          uint32_t stride) {
365*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
366*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *buffer_state = GetBufferState(buffer);
367*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
368*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
369*b7893ccfSSadaf Ebrahimi     AddCommandBufferBindingBuffer(cb_state, buffer_state);
370*b7893ccfSSadaf Ebrahimi     AddCommandBufferBindingBuffer(cb_state, count_buffer_state);
371*b7893ccfSSadaf Ebrahimi }
372*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer,VkBuffer raygenShaderBindingTableBuffer,VkDeviceSize raygenShaderBindingOffset,VkBuffer missShaderBindingTableBuffer,VkDeviceSize missShaderBindingOffset,VkDeviceSize missShaderBindingStride,VkBuffer hitShaderBindingTableBuffer,VkDeviceSize hitShaderBindingOffset,VkDeviceSize hitShaderBindingStride,VkBuffer callableShaderBindingTableBuffer,VkDeviceSize callableShaderBindingOffset,VkDeviceSize callableShaderBindingStride,uint32_t width,uint32_t height,uint32_t depth)373*b7893ccfSSadaf Ebrahimi void CoreChecks::PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
374*b7893ccfSSadaf Ebrahimi                                              VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
375*b7893ccfSSadaf Ebrahimi                                              VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
376*b7893ccfSSadaf Ebrahimi                                              VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
377*b7893ccfSSadaf Ebrahimi                                              VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
378*b7893ccfSSadaf Ebrahimi                                              VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
379*b7893ccfSSadaf Ebrahimi                                              uint32_t width, uint32_t height, uint32_t depth) {
380*b7893ccfSSadaf Ebrahimi     GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
381*b7893ccfSSadaf Ebrahimi }
382*b7893ccfSSadaf Ebrahimi 
PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer,VkBuffer raygenShaderBindingTableBuffer,VkDeviceSize raygenShaderBindingOffset,VkBuffer missShaderBindingTableBuffer,VkDeviceSize missShaderBindingOffset,VkDeviceSize missShaderBindingStride,VkBuffer hitShaderBindingTableBuffer,VkDeviceSize hitShaderBindingOffset,VkDeviceSize hitShaderBindingStride,VkBuffer callableShaderBindingTableBuffer,VkDeviceSize callableShaderBindingOffset,VkDeviceSize callableShaderBindingStride,uint32_t width,uint32_t height,uint32_t depth)383*b7893ccfSSadaf Ebrahimi void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
384*b7893ccfSSadaf Ebrahimi                                               VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
385*b7893ccfSSadaf Ebrahimi                                               VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
386*b7893ccfSSadaf Ebrahimi                                               VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
387*b7893ccfSSadaf Ebrahimi                                               VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
388*b7893ccfSSadaf Ebrahimi                                               VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
389*b7893ccfSSadaf Ebrahimi                                               uint32_t width, uint32_t height, uint32_t depth) {
390*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
391*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
392*b7893ccfSSadaf Ebrahimi     cb_state->hasTraceRaysCmd = true;
393*b7893ccfSSadaf Ebrahimi }
394*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer,uint32_t taskCount,uint32_t firstTask)395*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) {
396*b7893ccfSSadaf Ebrahimi     bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
397*b7893ccfSSadaf Ebrahimi                                     "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT,
398*b7893ccfSSadaf Ebrahimi                                     "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool", "VUID-vkCmdDrawMeshTasksNV-renderpass",
399*b7893ccfSSadaf Ebrahimi                                     "VUID-vkCmdDrawMeshTasksNV-None-02700", "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701");
400*b7893ccfSSadaf Ebrahimi     return skip;
401*b7893ccfSSadaf Ebrahimi }
402*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer,uint32_t taskCount,uint32_t firstTask)403*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
404*b7893ccfSSadaf Ebrahimi                                                              uint32_t firstTask) {
405*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
406*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
407*b7893ccfSSadaf Ebrahimi }
408*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride)409*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
410*b7893ccfSSadaf Ebrahimi                                                            uint32_t drawCount, uint32_t stride) {
411*b7893ccfSSadaf Ebrahimi     bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
412*b7893ccfSSadaf Ebrahimi                                     "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT,
413*b7893ccfSSadaf Ebrahimi                                     "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
414*b7893ccfSSadaf Ebrahimi                                     "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass", "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
415*b7893ccfSSadaf Ebrahimi                                     "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701");
416*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *buffer_state = GetBufferState(buffer);
417*b7893ccfSSadaf Ebrahimi     skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
418*b7893ccfSSadaf Ebrahimi                                           "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
419*b7893ccfSSadaf Ebrahimi     skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
420*b7893ccfSSadaf Ebrahimi                                      "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
421*b7893ccfSSadaf Ebrahimi                                      "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
422*b7893ccfSSadaf Ebrahimi     if (drawCount > 1) {
423*b7893ccfSSadaf Ebrahimi         skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
424*b7893ccfSSadaf Ebrahimi                                                 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
425*b7893ccfSSadaf Ebrahimi                                                 drawCount, offset, buffer_state);
426*b7893ccfSSadaf Ebrahimi     }
427*b7893ccfSSadaf Ebrahimi     return skip;
428*b7893ccfSSadaf Ebrahimi }
429*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride)430*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
431*b7893ccfSSadaf Ebrahimi                                                                      VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
432*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
433*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
434*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *buffer_state = GetBufferState(buffer);
435*b7893ccfSSadaf Ebrahimi     if (buffer_state) {
436*b7893ccfSSadaf Ebrahimi         AddCommandBufferBindingBuffer(cb_state, buffer_state);
437*b7893ccfSSadaf Ebrahimi     }
438*b7893ccfSSadaf Ebrahimi }
439*b7893ccfSSadaf Ebrahimi 
PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride)440*b7893ccfSSadaf Ebrahimi bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
441*b7893ccfSSadaf Ebrahimi                                                                 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
442*b7893ccfSSadaf Ebrahimi                                                                 uint32_t maxDrawCount, uint32_t stride) {
443*b7893ccfSSadaf Ebrahimi     bool skip = ValidateCmdDrawType(
444*b7893ccfSSadaf Ebrahimi         commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
445*b7893ccfSSadaf Ebrahimi         "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT,
446*b7893ccfSSadaf Ebrahimi         "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool", "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
447*b7893ccfSSadaf Ebrahimi         "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700", "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701");
448*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *buffer_state = GetBufferState(buffer);
449*b7893ccfSSadaf Ebrahimi     const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
450*b7893ccfSSadaf Ebrahimi     skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
451*b7893ccfSSadaf Ebrahimi                                           "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
452*b7893ccfSSadaf Ebrahimi     skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
453*b7893ccfSSadaf Ebrahimi                                           "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
454*b7893ccfSSadaf Ebrahimi     skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
455*b7893ccfSSadaf Ebrahimi                                      "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawIndexedIndirectCountKHR()",
456*b7893ccfSSadaf Ebrahimi                                      "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
457*b7893ccfSSadaf Ebrahimi     skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
458*b7893ccfSSadaf Ebrahimi                                      "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
459*b7893ccfSSadaf Ebrahimi                                      "vkCmdDrawIndexedIndirectCountKHR()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
460*b7893ccfSSadaf Ebrahimi     skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
461*b7893ccfSSadaf Ebrahimi                                             "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
462*b7893ccfSSadaf Ebrahimi     if (maxDrawCount > 1) {
463*b7893ccfSSadaf Ebrahimi         skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
464*b7893ccfSSadaf Ebrahimi                                                 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
465*b7893ccfSSadaf Ebrahimi                                                 maxDrawCount, offset, buffer_state);
466*b7893ccfSSadaf Ebrahimi     }
467*b7893ccfSSadaf Ebrahimi     return skip;
468*b7893ccfSSadaf Ebrahimi }
469*b7893ccfSSadaf Ebrahimi 
PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride)470*b7893ccfSSadaf Ebrahimi void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
471*b7893ccfSSadaf Ebrahimi                                                                           VkDeviceSize offset, VkBuffer countBuffer,
472*b7893ccfSSadaf Ebrahimi                                                                           VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
473*b7893ccfSSadaf Ebrahimi                                                                           uint32_t stride) {
474*b7893ccfSSadaf Ebrahimi     CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
475*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *buffer_state = GetBufferState(buffer);
476*b7893ccfSSadaf Ebrahimi     BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
477*b7893ccfSSadaf Ebrahimi     UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
478*b7893ccfSSadaf Ebrahimi     if (buffer_state) {
479*b7893ccfSSadaf Ebrahimi         AddCommandBufferBindingBuffer(cb_state, buffer_state);
480*b7893ccfSSadaf Ebrahimi     }
481*b7893ccfSSadaf Ebrahimi     if (count_buffer_state) {
482*b7893ccfSSadaf Ebrahimi         AddCommandBufferBindingBuffer(cb_state, count_buffer_state);
483*b7893ccfSSadaf Ebrahimi     }
484*b7893ccfSSadaf Ebrahimi }
485