blob: da36ecc2094ec44b0fe8b1ddb2623493aad49237 [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;
Tony-LunarG83544c72020-01-17 12:30:19 -0700325 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
326 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600327 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600328 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700329 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
330 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700331 }
332
Tony-LunarG83544c72020-01-17 12:30:19 -0700333 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700334 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600335 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
336 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700337 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-buffer-02708");
338 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700339 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarG83544c72020-01-17 12:30:19 -0700340 "VUID-vkCmdDrawIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
341 skip |=
342 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
343 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700344 return skip;
345}
346
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700347bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
348 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
349 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700350 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700351 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700352}
353
354bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
355 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
356 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700357 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700358 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700359}
360
361bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
362 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700363 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700364 bool skip = false;
sfricke-samsungf692b972020-05-02 08:00:45 -0700365 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
366 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600367 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600368 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800369 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700370 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700371 }
372
sfricke-samsungf692b972020-05-02 08:00:45 -0700373 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
374 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600375 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
376 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsungf692b972020-05-02 08:00:45 -0700377 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
378 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
379 skip |=
380 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
381 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700382 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700383 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800384 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700385 return skip;
386}
387
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700388bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
389 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
390 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700391 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
392 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700393}
394
395bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
396 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
397 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700398 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
399 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700400}
401
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500402bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
403 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
404 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
405 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
406 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
407 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
408 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700409 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
410 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500411 return skip;
412}
413
Jason Macnak67407e72019-07-11 11:05:09 -0700414void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
415 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
416 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
417 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
418 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
419 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
420 uint32_t width, uint32_t height, uint32_t depth) {
421 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
422 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
423 cb_state->hasTraceRaysCmd = true;
424}
425
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500426bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
427 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
428 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
429 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
430 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
431 uint32_t height, uint32_t depth) const {
432 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
433 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
434 return skip;
435}
436
437void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
438 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
439 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
440 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
441 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
442 uint32_t height, uint32_t depth) {
443 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
444 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
445 cb_state->hasTraceRaysCmd = true;
446}
447
448bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
449 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
450 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
451 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
452 const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
453 VkBuffer buffer, VkDeviceSize offset) const {
454 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
455 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
456 return skip;
457}
458
459void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
460 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
461 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
462 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
463 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
464 VkDeviceSize offset) {
465 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
466 BUFFER_STATE *buffer_state = GetBufferState(buffer);
467 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
468 cb_state->hasTraceRaysCmd = true;
469 AddCommandBufferBindingBuffer(cb_state, buffer_state);
470}
471
Jeff Bolz5c801d12019-10-09 10:38:45 -0500472bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700473 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
474 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700475 return skip;
476}
477
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700478bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500479 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700480 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700481 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600482 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700483 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600484 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700485 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600486 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700487 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600488 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600489 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
490 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
491 drawCount, offset, buffer_state);
492 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700493 return skip;
494}
495
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700496bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
497 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500498 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700499 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700500 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600501 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
502 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700503 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600504 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700505 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600506 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700507 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700508 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawMeshTasksIndirectCountNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700509 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
510 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700511 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
512 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600513 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
514 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
515 if (maxDrawCount > 1) {
516 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
517 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
518 maxDrawCount, offset, buffer_state);
519 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700520 return skip;
521}