blob: 455e3ed4322bca9e2299e9cc6094f2a1d280b878 [file] [log] [blame]
Tony-LunarG73719992020-01-15 10:20:28 -07001/* Copyright (c) 2015-2020 The Khronos Group Inc.
2 * Copyright (c) 2015-2020 Valve Corporation
3 * Copyright (c) 2015-2020 LunarG, Inc.
4 * Copyright (C) 2015-2020 Google Inc.
Jasper St. Pierre512613a2019-04-08 16:25:23 -07005 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * Author: Cody Northrop <cnorthrop@google.com>
19 * Author: Michael Lentine <mlentine@google.com>
20 * Author: Tobin Ehlis <tobine@google.com>
21 * Author: Chia-I Wu <olv@google.com>
22 * Author: Chris Forbes <chrisf@ijw.co.nz>
23 * Author: Mark Lobodzinski <mark@lunarg.com>
24 * Author: Ian Elliott <ianelliott@google.com>
25 * Author: Dave Houlton <daveh@lunarg.com>
26 * Author: Dustin Graves <dustin@lunarg.com>
27 * Author: Jeremy Hayes <jeremy@lunarg.com>
28 * Author: Jon Ashburn <jon@lunarg.com>
29 * Author: Karl Schultz <karl@lunarg.com>
30 * Author: Mark Young <marky@lunarg.com>
31 * Author: Mike Schuchardt <mikes@lunarg.com>
32 * Author: Mike Weiblen <mikew@lunarg.com>
33 * Author: Tony Barbour <tony@LunarG.com>
34 * Author: John Zulauf <jzulauf@lunarg.com>
35 * Author: Shannon McPherson <shannon@lunarg.com>
36 */
37
Jasper St. Pierre512613a2019-04-08 16:25:23 -070038#include "chassis.h"
39#include "core_validation.h"
40
Spencer Fricke507600b2020-03-22 13:23:06 -070041// This LUT is created to allow a static listing of each VUID that is covered by drawdispatch commands
42// clang-format off
43static const std::map<CMD_TYPE, DrawDispatchVuid> drawdispatch_vuid = {
44 {CMD_DRAW, {
45 "VUID-vkCmdDraw-commandBuffer-cmdpool",
46 "VUID-vkCmdDraw-renderpass",
47 "VUID-vkCmdDraw-None-02700",
48 "VUID-vkCmdDraw-commandBuffer-02701",
49 "VUID-vkCmdDraw-None-02720",
50 "VUID-vkCmdDraw-None-02697",
51 "VUID-vkCmdDraw-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070052 "VUID-vkCmdDraw-subpass-02685",
53 "VUID-vkCmdDraw-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -070054 }},
55 {CMD_DRAWINDEXED, {
56 "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
57 "VUID-vkCmdDrawIndexed-renderpass",
58 "VUID-vkCmdDrawIndexed-None-02700",
59 "VUID-vkCmdDrawIndexed-commandBuffer-02701",
60 "VUID-vkCmdDrawIndexed-None-02720",
61 "VUID-vkCmdDrawIndexed-None-02697",
62 "VUID-vkCmdDrawIndexed-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070063 "VUID-vkCmdDrawIndexed-subpass-02685",
64 "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -070065 }},
66 {CMD_DRAWINDIRECT, {
67 "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
68 "VUID-vkCmdDrawIndirect-renderpass",
69 "VUID-vkCmdDrawIndirect-None-02700",
70 "VUID-vkCmdDrawIndirect-commandBuffer-02701",
71 "VUID-vkCmdDrawIndirect-None-02720",
72 "VUID-vkCmdDrawIndirect-None-02697",
73 "VUID-vkCmdDrawIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070074 "VUID-vkCmdDrawIndirect-subpass-02685",
75 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -070076 }},
77 {CMD_DRAWINDEXEDINDIRECT, {
78 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool",
79 "VUID-vkCmdDrawIndexedIndirect-renderpass",
80 "VUID-vkCmdDrawIndexedIndirect-None-02700",
81 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
82 "VUID-vkCmdDrawIndexedIndirect-None-02720",
83 "VUID-vkCmdDrawIndexedIndirect-None-02697",
84 "VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070085 "VUID-vkCmdDrawIndexedIndirect-subpass-02685",
86 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -070087 }},
88 {CMD_DISPATCH, {
89 "VUID-vkCmdDispatch-commandBuffer-cmdpool",
90 "VUID-vkCmdDispatch-renderpass",
91 "VUID-vkCmdDispatch-None-02700",
92 kVUIDUndefined, // dynamic_state
93 kVUIDUndefined, // vertex_binding
94 "VUID-vkCmdDispatch-None-02697",
95 kVUIDUndefined, // render_pass_compatible
96 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -070097 kVUIDUndefined, // sample_location
Spencer Fricke507600b2020-03-22 13:23:06 -070098 }},
99 {CMD_DISPATCHINDIRECT, {
100 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
101 "VUID-vkCmdDispatchIndirect-renderpass",
102 "VUID-vkCmdDispatchIndirect-None-02700",
103 kVUIDUndefined, // dynamic_state
104 kVUIDUndefined, // vertex_binding
105 "VUID-vkCmdDispatchIndirect-None-02697",
106 kVUIDUndefined, // render_pass_compatible
107 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700108 kVUIDUndefined, // sample_location
Spencer Fricke507600b2020-03-22 13:23:06 -0700109 }},
110 {CMD_DRAWINDIRECTCOUNT, {
111 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
112 "VUID-vkCmdDrawIndirectCount-renderpass",
113 "VUID-vkCmdDrawIndirectCount-None-02700",
114 "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
115 "VUID-vkCmdDrawIndirectCount-None-02720",
116 "VUID-vkCmdDrawIndirectCount-None-02697",
117 "VUID-vkCmdDrawIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700118 "VUID-vkCmdDrawIndirectCount-subpass-02685",
119 "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700120 }},
121 {CMD_DRAWINDEXEDINDIRECTCOUNT,{
122 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
123 "VUID-vkCmdDrawIndexedIndirectCount-renderpass",
124 "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
125 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
126 "VUID-vkCmdDrawIndexedIndirectCount-None-02720",
127 "VUID-vkCmdDrawIndexedIndirectCount-None-02697",
128 "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700129 "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685",
130 "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700131 }},
132 {CMD_TRACERAYSNV, {
133 "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool",
134 "VUID-vkCmdTraceRaysNV-renderpass",
135 "VUID-vkCmdTraceRaysNV-None-02700",
136 "VUID-vkCmdTraceRaysNV-commandBuffer-02701",
137 kVUIDUndefined, // vertex_binding
138 "VUID-vkCmdTraceRaysNV-None-02697",
139 kVUIDUndefined, // render_pass_compatible
140 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700141 kVUIDUndefined, // sample_location
Spencer Fricke507600b2020-03-22 13:23:06 -0700142 }},
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500143 {CMD_TRACERAYSKHR, {
144 "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool",
145 "VUID-vkCmdTraceRaysKHR-renderpass",
146 "VUID-vkCmdTraceRaysKHR-None-02700",
147 "VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
148 kVUIDUndefined, // vertex_binding
149 "VUID-vkCmdTraceRaysKHR-None-02697",
150 kVUIDUndefined, // render_pass_compatible
151 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700152 kVUIDUndefined, // sample_location
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500153 }},
154 {CMD_TRACERAYSINDIRECTKHR, {
155 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool",
156 "VUID-vkCmdTraceRaysIndirectKHR-renderpass",
157 "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
158 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
159 kVUIDUndefined, // vertex_binding
160 "VUID-vkCmdTraceRaysIndirectKHR-None-02697",
161 kVUIDUndefined, // render_pass_compatible
162 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700163 kVUIDUndefined, // sample_location
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500164 }},
Spencer Fricke507600b2020-03-22 13:23:06 -0700165 {CMD_DRAWMESHTASKSNV, {
166 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool",
167 "VUID-vkCmdDrawMeshTasksNV-renderpass",
168 "VUID-vkCmdDrawMeshTasksNV-None-02700",
169 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
170 kVUIDUndefined, // vertex_binding
171 "VUID-vkCmdDrawMeshTasksNV-None-02697",
172 "VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700173 "VUID-vkCmdDrawMeshTasksNV-subpass-02685",
174 "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700175 }},
176 {CMD_DRAWMESHTASKSINDIRECTNV, {
177 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
178 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass",
179 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
180 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701",
181 kVUIDUndefined, // vertex_binding
182 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02697",
183 "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700184 "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685",
185 "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700186 }},
187 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, {
188 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
189 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
190 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
191 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
192 kVUIDUndefined, // vertex_binding
193 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697",
194 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700195 "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685",
196 "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700197 }},
198 // Used if invalid cmd_type is used
sfricke-samsung8f658d42020-05-03 20:12:24 -0700199 {CMD_NONE, {kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined}}
Spencer Fricke507600b2020-03-22 13:23:06 -0700200};
201// clang-format on
202
203// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
204const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
205 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
206 return drawdispatch_vuid.at(cmd_type);
207 } else {
208 return drawdispatch_vuid.at(CMD_NONE);
209 }
210}
211
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700212// Generic function to handle validation for all CmdDraw* type functions
213bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700214 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700215 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700216 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600217 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700218 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700219 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700220 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700221 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
222 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
223 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700224 }
225 return skip;
226}
227
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700228bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500229 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700230 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700231 VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700232}
233
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700234bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500235 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700236 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700237 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500238 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700239 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
240 unsigned int index_size = 0;
241 const auto &index_buffer_binding = cb_state->index_buffer_binding;
242 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
243 index_size = 2;
244 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
245 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600246 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
247 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700248 }
249 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
250 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700251 skip |=
252 LogError(index_buffer_binding.buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
253 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
254 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
255 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
256 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700257 }
258 }
259 return skip;
260}
261
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700262bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500263 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700264 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700265 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600266 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600267 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirect()", "VUID-vkCmdDrawIndirect-buffer-02708");
268 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDrawIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700269 "vkCmdDrawIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600270 if (count > 1) {
271 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
272 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
273 skip |=
274 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
275 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
276 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700277 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
278 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
279 return skip;
280}
281
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700282bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500283 uint32_t count, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700284 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
285 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600286 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600287 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirect()", "VUID-vkCmdDrawIndexedIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700288 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600289 "VUID-vkCmdDrawIndexedIndirect-buffer-02709", "vkCmdDrawIndexedIndirect()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700290 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600291 if (count > 1) {
292 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
293 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
294 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
295 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
296 buffer_state);
297 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700298 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
299 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
300 // 'buffer'.
301 return skip;
302}
303
Jeff Bolz5c801d12019-10-09 10:38:45 -0500304bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600305 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600306 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700307 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600308 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700309}
310
Jeff Bolz5c801d12019-10-09 10:38:45 -0500311bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700312 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700313 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600314 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600315 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDispatchIndirect()", "VUID-vkCmdDispatchIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700316 skip |=
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600317 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDispatchIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700318 "vkCmdDispatchIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700319 return skip;
320}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700321bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
322 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700323 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700324 bool skip = false;
325 if (offset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700326 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-offset-02710",
327 "%s() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName, offset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700328 }
329
330 if (countBufferOffset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700331 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716",
332 "%s() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName,
333 countBufferOffset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700334 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700335 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
336 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600337 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600338 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700339 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
340 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700341 }
342
Tony-LunarG83544c72020-01-17 12:30:19 -0700343 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700344 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600345 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
346 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700347 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-buffer-02708");
348 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700349 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarG83544c72020-01-17 12:30:19 -0700350 "VUID-vkCmdDrawIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
351 skip |=
352 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
353 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700354 return skip;
355}
356
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700357bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
358 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
359 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700360 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
361 "VkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700362}
363
364bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
365 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
366 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700367 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
368 "VkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700369}
370
371bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
372 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
373 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700374 bool skip = false;
375 if (offset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700376 skip |= LogError(
377 commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710",
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700378 "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", offset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700379 }
380
381 if (countBufferOffset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700382 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716",
383 "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
384 "), is not a multiple of 4.",
385 countBufferOffset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700386 }
387
Mike Schuchardt65847d92019-12-20 13:50:47 -0800388 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride,
Lockee68ac652019-05-06 10:17:33 -0600389 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
390 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600391 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800392 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
Lockee68ac652019-05-06 10:17:33 -0600393 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset,
394 buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700395 }
396
Spencer Fricke507600b2020-03-22 13:23:06 -0700397 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT,
398 "vkCmdDrawIndexedIndirectCount()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600399 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
400 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700401 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800402 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700403 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800404 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700405 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700406 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700407 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
408 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700409 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800410 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700411 return skip;
412}
413
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700414bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
415 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
416 uint32_t maxDrawCount, uint32_t stride) const {
417 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
418}
419
420bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
421 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
422 uint32_t maxDrawCount, uint32_t stride) const {
423 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
424}
425
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500426bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
427 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
428 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
429 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
430 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
431 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
432 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700433 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
434 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500435 return skip;
436}
437
Jason Macnak67407e72019-07-11 11:05:09 -0700438void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
439 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
440 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
441 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
442 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
443 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
444 uint32_t width, uint32_t height, uint32_t depth) {
445 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
446 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
447 cb_state->hasTraceRaysCmd = true;
448}
449
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500450bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
451 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
452 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
453 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
454 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
455 uint32_t height, uint32_t depth) const {
456 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
457 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
458 return skip;
459}
460
461void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
462 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
463 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
464 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
465 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
466 uint32_t height, uint32_t depth) {
467 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
468 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
469 cb_state->hasTraceRaysCmd = true;
470}
471
472bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
473 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
474 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
475 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
476 const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
477 VkBuffer buffer, VkDeviceSize offset) const {
478 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
479 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
480 return skip;
481}
482
483void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
484 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
485 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
486 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
487 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
488 VkDeviceSize offset) {
489 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
490 BUFFER_STATE *buffer_state = GetBufferState(buffer);
491 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
492 cb_state->hasTraceRaysCmd = true;
493 AddCommandBufferBindingBuffer(cb_state, buffer_state);
494}
495
Jeff Bolz5c801d12019-10-09 10:38:45 -0500496bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700497 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
498 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700499 return skip;
500}
501
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700502bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500503 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700504 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700505 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600506 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700507 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600508 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700509 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600510 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700511 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600512 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600513 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
514 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
515 drawCount, offset, buffer_state);
516 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700517 return skip;
518}
519
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700520bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
521 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500522 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700523 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700524 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600525 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
526 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700527 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600528 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700529 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600530 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700531 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700532 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700533 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
534 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700535 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
536 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600537 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
538 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
539 if (maxDrawCount > 1) {
540 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
541 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
542 maxDrawCount, offset, buffer_state);
543 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700544 return skip;
545}