blob: 25bcd8e87a6e623ce0272115e6b128e20d8bbc0f [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>
Jeremy Kniagere6827432020-04-01 09:05:56 -060036 * Author: Jeremy Kniager <jeremyk@lunarg.com>
Mark Lobodzinskiddf43612020-11-17 11:28:02 -070037 * Author: Nathaniel Cesario <nathaniel@lunarg.com>
Jasper St. Pierre512613a2019-04-08 16:25:23 -070038 */
39
Jasper St. Pierre512613a2019-04-08 16:25:23 -070040#include "chassis.h"
41#include "core_validation.h"
42
Spencer Fricke507600b2020-03-22 13:23:06 -070043// clang-format off
Mark Lobodzinskiddf43612020-11-17 11:28:02 -070044struct DispatchVuidsCmdDraw : DrawDispatchVuid {
45 DispatchVuidsCmdDraw() : DrawDispatchVuid() {
46 queue_flag = "VUID-vkCmdDraw-commandBuffer-cmdpool";
47 inside_renderpass = "VUID-vkCmdDraw-renderpass";
48 pipeline_bound = "VUID-vkCmdDraw-None-02700";
49 dynamic_state = "VUID-vkCmdDraw-commandBuffer-02701";
50 vertex_binding = "VUID-vkCmdDraw-None-04007";
51 vertex_binding_null = "VUID-vkCmdDraw-None-04008";
52 compatible_pipeline = "VUID-vkCmdDraw-None-02697";
53 render_pass_compatible = "VUID-vkCmdDraw-renderPass-02684";
54 subpass_index = "VUID-vkCmdDraw-subpass-02685";
55 sample_location = "VUID-vkCmdDraw-sampleLocationsEnable-02689";
56 linear_sampler = "VUID-vkCmdDraw-magFilter-04553";
57 cubic_sampler = "VUID-vkCmdDraw-None-02692";
58 viewport_count = "VUID-vkCmdDraw-viewportCount-03417";
59 scissor_count = "VUID-vkCmdDraw-scissorCount-03418";
60 viewport_scissor_count = "VUID-vkCmdDraw-viewportCount-03419";
61 primitive_topology = "VUID-vkCmdDraw-primitiveTopology-03420";
62 corner_sampled_address_mode = "VUID-vkCmdDraw-flags-02696";
63 subpass_input = "VUID-vkCmdDraw-None-02686";
64 imageview_atomic = "VUID-vkCmdDraw-None-02691";
65 push_constants_set = "VUID-vkCmdDraw-None-02698";
66 image_subresources = "VUID-vkCmdDraw-None-04584";
67 descriptor_valid = "VUID-vkCmdDraw-None-02699";
68 sampler_imageview_type = "VUID-vkCmdDraw-None-02702";
69 sampler_implicitLod_dref_proj = "VUID-vkCmdDraw-None-02703";
70 sampler_bias_offset = "VUID-vkCmdDraw-None-02704";
71 vertex_binding_attribute = "VUID-vkCmdDraw-None-02721";
72 dynamic_state_setting_commands = "VUID-vkCmdDraw-None-02859";
73 unprotected_command_buffer = "VUID-vkCmdDraw-commandBuffer-02707";
74 protected_command_buffer = "VUID-vkCmdDraw-commandBuffer-02712";
75 max_multiview_instance_index = "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688";
76 filter_cubic = "VUID-vkCmdDraw-filterCubic-02694";
77 filter_cubic_min_max = "VUID-vkCmdDraw-filterCubicMinmax-02695";
78 }
79};
80
81struct DispatchVuidsCmdDrawIndexed : DrawDispatchVuid {
82 DispatchVuidsCmdDrawIndexed() : DrawDispatchVuid() {
83 queue_flag = "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool";
84 inside_renderpass = "VUID-vkCmdDrawIndexed-renderpass";
85 pipeline_bound = "VUID-vkCmdDrawIndexed-None-02700";
86 dynamic_state = "VUID-vkCmdDrawIndexed-commandBuffer-02701";
87 vertex_binding = "VUID-vkCmdDrawIndexed-None-04007";
88 vertex_binding_null = "VUID-vkCmdDrawIndexed-None-04008";
89 compatible_pipeline = "VUID-vkCmdDrawIndexed-None-02697";
90 render_pass_compatible = "VUID-vkCmdDrawIndexed-renderPass-02684";
91 subpass_index = "VUID-vkCmdDrawIndexed-subpass-02685";
92 sample_location = "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689";
93 linear_sampler = "VUID-vkCmdDrawIndexed-magFilter-04553";
94 cubic_sampler = "VUID-vkCmdDrawIndexed-None-02692";
95 viewport_count = "VUID-vkCmdDrawIndexed-viewportCount-03417";
96 scissor_count = "VUID-vkCmdDrawIndexed-scissorCount-03418";
97 viewport_scissor_count = "VUID-vkCmdDrawIndexed-viewportCount-03419";
98 primitive_topology = "VUID-vkCmdDrawIndexed-primitiveTopology-03420";
99 corner_sampled_address_mode = "VUID-vkCmdDrawIndexed-flags-02696";
100 subpass_input = "VUID-vkCmdDrawIndexed-None-02686";
101 imageview_atomic = "VUID-vkCmdDrawIndexed-None-02691";
102 push_constants_set = "VUID-vkCmdDrawIndexed-None-02698";
103 image_subresources = "VUID-vkCmdDrawIndexed-None-04584";
104 descriptor_valid = "VUID-vkCmdDrawIndexed-None-02699";
105 sampler_imageview_type = "VUID-vkCmdDrawIndexed-None-02702";
106 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndexed-None-02703";
107 sampler_bias_offset = "VUID-vkCmdDrawIndexed-None-02704";
108 vertex_binding_attribute = "VUID-vkCmdDrawIndexed-None-02721";
109 dynamic_state_setting_commands = "VUID-vkCmdDrawIndexed-None-02859";
110 unprotected_command_buffer = "VUID-vkCmdDrawIndexed-commandBuffer-02707";
111 protected_command_buffer = "VUID-vkCmdDrawIndexed-commandBuffer-02712";
112 max_multiview_instance_index = "VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-02688";
113 filter_cubic = "VUID-vkCmdDrawIndexed-filterCubic-02694";
114 filter_cubic_min_max = "VUID-vkCmdDrawIndexed-filterCubicMinmax-02695";
115 }
116};
117
118struct DispatchVuidsCmdDrawIndirect : DrawDispatchVuid {
119 DispatchVuidsCmdDrawIndirect() : DrawDispatchVuid() {
120 queue_flag = "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool";
121 inside_renderpass = "VUID-vkCmdDrawIndirect-renderpass";
122 pipeline_bound = "VUID-vkCmdDrawIndirect-None-02700";
123 dynamic_state = "VUID-vkCmdDrawIndirect-commandBuffer-02701";
124 vertex_binding = "VUID-vkCmdDrawIndirect-None-04007";
125 vertex_binding_null = "VUID-vkCmdDrawIndirect-None-04008";
126 compatible_pipeline = "VUID-vkCmdDrawIndirect-None-02697";
127 render_pass_compatible = "VUID-vkCmdDrawIndirect-renderPass-02684";
128 subpass_index = "VUID-vkCmdDrawIndirect-subpass-02685";
129 sample_location = "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689";
130 linear_sampler = "VUID-vkCmdDrawIndirect-magFilter-04553";
131 cubic_sampler = "VUID-vkCmdDrawIndirect-None-02692";
132 indirect_protected_cb = "VUID-vkCmdDrawIndirect-commandBuffer-02711";
133 indirect_contiguous_memory = "VUID-vkCmdDrawIndirect-buffer-02708";
134 indirect_buffer_bit = "VUID-vkCmdDrawIndirect-buffer-02709";
135 viewport_count = "VUID-vkCmdDrawIndirect-viewportCount-03417";
136 scissor_count = "VUID-vkCmdDrawIndirect-scissorCount-03418";
137 viewport_scissor_count = "VUID-vkCmdDrawIndirect-viewportCount-03419";
138 primitive_topology = "VUID-vkCmdDrawIndirect-primitiveTopology-03420";
139 corner_sampled_address_mode = "VUID-vkCmdDrawIndirect-flags-02696";
140 subpass_input = "VUID-vkCmdDrawIndirect-None-02686";
141 imageview_atomic = "VUID-vkCmdDrawIndirect-None-02691";
142 push_constants_set = "VUID-vkCmdDrawIndirect-None-02698";
143 image_subresources = "VUID-vkCmdDrawIndirect-None-04584";
144 descriptor_valid = "VUID-vkCmdDrawIndirect-None-02699";
145 sampler_imageview_type = "VUID-vkCmdDrawIndirect-None-02702";
146 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndirect-None-02703";
147 sampler_bias_offset = "VUID-vkCmdDrawIndirect-None-02704";
148 vertex_binding_attribute = "VUID-vkCmdDrawIndirect-None-02721";
149 dynamic_state_setting_commands = "VUID-vkCmdDrawIndirect-None-02859";
150 unprotected_command_buffer = "VUID-vkCmdDrawIndirect-commandBuffer-02707";
151 max_multiview_instance_index = "VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-02688";
152 filter_cubic = "VUID-vkCmdDrawIndirect-filterCubic-02694";
153 filter_cubic_min_max = "VUID-vkCmdDrawIndirect-filterCubicMinmax-02695";
154 }
155};
156
157struct DispatchVuidsCmdDrawIndexedIndirect : DrawDispatchVuid {
158 DispatchVuidsCmdDrawIndexedIndirect() : DrawDispatchVuid() {
159 queue_flag = "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool";
160 inside_renderpass = "VUID-vkCmdDrawIndexedIndirect-renderpass";
161 pipeline_bound = "VUID-vkCmdDrawIndexedIndirect-None-02700";
162 dynamic_state = "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701";
163 vertex_binding = "VUID-vkCmdDrawIndexedIndirect-None-04007";
164 vertex_binding_null = "VUID-vkCmdDrawIndexedIndirect-None-04008";
165 compatible_pipeline = "VUID-vkCmdDrawIndexedIndirect-None-02697";
166 render_pass_compatible = "VUID-vkCmdDrawIndexedIndirect-renderPass-02684";
167 subpass_index = "VUID-vkCmdDrawIndexedIndirect-subpass-02685";
168 sample_location = "VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689";
169 linear_sampler = "VUID-vkCmdDrawIndexedIndirect-magFilter-04553";
170 cubic_sampler = "VUID-vkCmdDrawIndexedIndirect-None-02692";
171 indirect_protected_cb = "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711";
172 indirect_contiguous_memory = "VUID-vkCmdDrawIndexedIndirect-buffer-02708";
173 indirect_buffer_bit = "VUID-vkCmdDrawIndexedIndirect-buffer-02709";
174 viewport_count = "VUID-vkCmdDrawIndexedIndirect-viewportCount-03417";
175 scissor_count = "VUID-vkCmdDrawIndexedIndirect-scissorCount-03418";
176 viewport_scissor_count = "VUID-vkCmdDrawIndexedIndirect-viewportCount-03419";
177 primitive_topology = "VUID-vkCmdDrawIndexedIndirect-primitiveTopology-03420";
178 corner_sampled_address_mode = "VUID-vkCmdDrawIndexedIndirect-flags-02696";
179 subpass_input = "VUID-vkCmdDrawIndexedIndirect-None-02686";
180 imageview_atomic = "VUID-vkCmdDrawIndexedIndirect-None-02691";
181 push_constants_set = "VUID-vkCmdDrawIndexedIndirect-None-02698";
182 image_subresources = "VUID-vkCmdDrawIndexedIndirect-None-04584";
183 descriptor_valid = "VUID-vkCmdDrawIndexedIndirect-None-02699";
184 sampler_imageview_type = "VUID-vkCmdDrawIndexedIndirect-None-02702";
185 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndexedIndirect-None-02703";
186 sampler_bias_offset = "VUID-vkCmdDrawIndexedIndirect-None-02704";
187 vertex_binding_attribute = "VUID-vkCmdDrawIndexedIndirect-None-02721";
188 dynamic_state_setting_commands = "VUID-vkCmdDrawIndexedIndirect-None-02859";
189 unprotected_command_buffer = "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02707";
190 max_multiview_instance_index = "VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-02688";
191 filter_cubic = "VUID-vkCmdDrawIndexedIndirect-filterCubic-02694";
192 filter_cubic_min_max = "VUID-vkCmdDrawIndexedIndirect-filterCubicMinmax-02695";
193 }
194};
195
196struct DispatchVuidsCmdDispatch : DrawDispatchVuid {
197 DispatchVuidsCmdDispatch() : DrawDispatchVuid() {
198 queue_flag = "VUID-vkCmdDispatch-commandBuffer-cmdpool";
199 inside_renderpass = "VUID-vkCmdDispatch-renderpass";
200 pipeline_bound = "VUID-vkCmdDispatch-None-02700";
201 compatible_pipeline = "VUID-vkCmdDispatch-None-02697";
202 linear_sampler = "VUID-vkCmdDispatch-magFilter-04553";
203 cubic_sampler = "VUID-vkCmdDispatch-None-02692";
204 corner_sampled_address_mode = "VUID-vkCmdDispatch-flags-02696";
205 imageview_atomic = "VUID-vkCmdDispatch-None-02691";
206 push_constants_set = "VUID-vkCmdDispatch-None-02698";
207 descriptor_valid = "VUID-vkCmdDispatch-None-02699";
208 sampler_imageview_type = "VUID-vkCmdDispatch-None-02702";
209 sampler_implicitLod_dref_proj = "VUID-vkCmdDispatch-None-02703";
210 sampler_bias_offset = "VUID-vkCmdDispatch-None-02704";
211 dynamic_state_setting_commands = "VUID-vkCmdDispatch-None-02859";
212 unprotected_command_buffer = "VUID-vkCmdDispatch-commandBuffer-02707";
213 protected_command_buffer = "VUID-vkCmdDispatch-commandBuffer-02712";
214 filter_cubic = "VUID-vkCmdDispatch-filterCubic-02694";
215 filter_cubic_min_max = "VUID-vkCmdDispatch-filterCubicMinmax-02695";
216 }
217};
218
219struct DispatchVuidsCmdDispatchIndirect : DrawDispatchVuid {
220 DispatchVuidsCmdDispatchIndirect() : DrawDispatchVuid() {
221 queue_flag = "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool";
222 inside_renderpass = "VUID-vkCmdDispatchIndirect-renderpass";
223 pipeline_bound = "VUID-vkCmdDispatchIndirect-None-02700";
224 compatible_pipeline = "VUID-vkCmdDispatchIndirect-None-02697";
225 linear_sampler = "VUID-vkCmdDispatchIndirect-magFilter-04553";
226 cubic_sampler = "VUID-vkCmdDispatchIndirect-None-02692";
227 indirect_protected_cb = "VUID-vkCmdDispatchIndirect-commandBuffer-02711";
228 indirect_contiguous_memory = "VUID-vkCmdDispatchIndirect-buffer-02708";
229 indirect_buffer_bit = "VUID-vkCmdDispatchIndirect-buffer-02709";
230 corner_sampled_address_mode = "VUID-vkCmdDispatchIndirect-flags-02696";
231 imageview_atomic = "VUID-vkCmdDispatchIndirect-None-02691";
232 push_constants_set = "VUID-vkCmdDispatchIndirect-None-02698";
233 descriptor_valid = "VUID-vkCmdDispatchIndirect-None-02699";
234 sampler_imageview_type = "VUID-vkCmdDispatchIndirect-None-02702";
235 sampler_implicitLod_dref_proj = "VUID-vkCmdDispatchIndirect-None-02703";
236 sampler_bias_offset = "VUID-vkCmdDispatchIndirect-None-02704";
237 dynamic_state_setting_commands = "VUID-vkCmdDispatchIndirect-None-02859";
238 unprotected_command_buffer = "VUID-vkCmdDispatchIndirect-commandBuffer-02707";
239 filter_cubic = "VUID-vkCmdDispatchIndirect-filterCubic-02694";
240 filter_cubic_min_max = "VUID-vkCmdDispatchIndirect-filterCubicMinmax-02695";
241 }
242};
243
244struct DispatchVuidsCmdDrawIndirectCount : DrawDispatchVuid {
245 DispatchVuidsCmdDrawIndirectCount() : DrawDispatchVuid() {
246 queue_flag = "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool";
247 inside_renderpass = "VUID-vkCmdDrawIndirectCount-renderpass";
248 pipeline_bound = "VUID-vkCmdDrawIndirectCount-None-02700";
249 dynamic_state = "VUID-vkCmdDrawIndirectCount-commandBuffer-02701";
250 vertex_binding = "VUID-vkCmdDrawIndirectCount-None-04007";
251 vertex_binding_null = "VUID-vkCmdDrawIndirectCount-None-04008";
252 compatible_pipeline = "VUID-vkCmdDrawIndirectCount-None-02697";
253 render_pass_compatible = "VUID-vkCmdDrawIndirectCount-renderPass-02684";
254 subpass_index = "VUID-vkCmdDrawIndirectCount-subpass-02685";
255 sample_location = "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689";
256 linear_sampler = "VUID-vkCmdDrawIndirectCount-magFilter-04553";
257 cubic_sampler = "VUID-vkCmdDrawIndirectCount-None-02692";
258 indirect_protected_cb = "VUID-vkCmdDrawIndirectCount-commandBuffer-02711";
259 indirect_contiguous_memory = "VUID-vkCmdDrawIndirectCount-buffer-02708";
260 indirect_buffer_bit = "VUID-vkCmdDrawIndirectCount-buffer-02709";
261 viewport_count = "VUID-vkCmdDrawIndirectCount-viewportCount-03417";
262 scissor_count = "VUID-vkCmdDrawIndirectCount-scissorCount-03418";
263 viewport_scissor_count = "VUID-vkCmdDrawIndirectCount-viewportCount-03419";
264 primitive_topology = "VUID-vkCmdDrawIndirectCount-primitiveTopology-03420";
265 corner_sampled_address_mode = "VUID-vkCmdDrawIndirectCount-flags-02696";
266 subpass_input = "VUID-vkCmdDrawIndirectCount-None-02686";
267 imageview_atomic = "VUID-vkCmdDrawIndirectCount-None-02691";
268 push_constants_set = "VUID-vkCmdDrawIndirectCount-None-02698";
269 image_subresources = "VUID-vkCmdDrawIndirectCount-None-04584";
270 descriptor_valid = "VUID-vkCmdDrawIndirectCount-None-02699";
271 sampler_imageview_type = "VUID-vkCmdDrawIndirectCount-None-02702";
272 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndirectCount-None-02703";
273 sampler_bias_offset = "VUID-vkCmdDrawIndirectCount-None-02704";
274 vertex_binding_attribute = "VUID-vkCmdDrawIndirectCount-None-02721";
275 dynamic_state_setting_commands = "VUID-vkCmdDrawIndirectCount-None-02859";
276 unprotected_command_buffer = "VUID-vkCmdDrawIndirectCount-commandBuffer-02707";
277 max_multiview_instance_index = "VUID-vkCmdDrawIndirectCount-maxMultiviewInstanceIndex-02688";
278 filter_cubic = "VUID-vkCmdDrawIndirectCount-filterCubic-02694";
279 filter_cubic_min_max = "VUID-vkCmdDrawIndirectCount-filterCubicMinmax-02695";
280 }
281};
282
283struct DispatchVuidsCmdDrawIndexedIndirectCount : DrawDispatchVuid {
284 DispatchVuidsCmdDrawIndexedIndirectCount() : DrawDispatchVuid() {
285 queue_flag = "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool";
286 inside_renderpass = "VUID-vkCmdDrawIndexedIndirectCount-renderpass";
287 pipeline_bound = "VUID-vkCmdDrawIndexedIndirectCount-None-02700";
288 dynamic_state = "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701";
289 vertex_binding = "VUID-vkCmdDrawIndexedIndirectCount-None-04007";
290 vertex_binding_null = "VUID-vkCmdDrawIndexedIndirectCount-None-04008";
291 compatible_pipeline = "VUID-vkCmdDrawIndexedIndirectCount-None-02697";
292 render_pass_compatible = "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684";
293 subpass_index = "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685";
294 sample_location = "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689";
295 linear_sampler = "VUID-vkCmdDrawIndexedIndirectCount-magFilter-04553";
296 cubic_sampler = "VUID-vkCmdDrawIndexedIndirectCount-None-02692";
297 indirect_protected_cb = "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711";
298 indirect_contiguous_memory = "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708";
299 indirect_buffer_bit = "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709";
300 viewport_count = "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03417";
301 scissor_count = "VUID-vkCmdDrawIndexedIndirectCount-scissorCount-03418";
302 viewport_scissor_count = "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03419";
303 primitive_topology = "VUID-vkCmdDrawIndexedIndirectCount-primitiveTopology-03420";
304 corner_sampled_address_mode = "VUID-vkCmdDrawIndexedIndirectCount-flags-02696";
305 subpass_input = "VUID-vkCmdDrawIndexedIndirectCount-None-02686";
306 imageview_atomic = "VUID-vkCmdDrawIndexedIndirectCount-None-02691";
307 push_constants_set = "VUID-vkCmdDrawIndexedIndirectCount-None-02698";
308 image_subresources = "VUID-vkCmdDrawIndexedIndirectCount-None-04584";
309 descriptor_valid = "VUID-vkCmdDrawIndexedIndirectCount-None-02699";
310 sampler_imageview_type = "VUID-vkCmdDrawIndexedIndirectCount-None-02702";
311 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndexedIndirectCount-None-02703";
312 sampler_bias_offset = "VUID-vkCmdDrawIndexedIndirectCount-None-02704";
313 vertex_binding_attribute = "VUID-vkCmdDrawIndexedIndirectCount-None-02721";
314 dynamic_state_setting_commands = "VUID-vkCmdDrawIndexedIndirectCount-None-02859";
315 unprotected_command_buffer = "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02707";
316 max_multiview_instance_index = "VUID-vkCmdDrawIndexedIndirectCount-maxMultiviewInstanceIndex-02688";
317 filter_cubic = "VUID-vkCmdDrawIndexedIndirectCount-filterCubic-02694";
318 filter_cubic_min_max = "VUID-vkCmdDrawIndexedIndirectCount-filterCubicMinmax-02695";
319 }
320};
321
322struct DispatchVuidsCmdTraceRaysNV: DrawDispatchVuid {
323 DispatchVuidsCmdTraceRaysNV() : DrawDispatchVuid() {
324 queue_flag = "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool";
325 inside_renderpass = "VUID-vkCmdTraceRaysNV-renderpass";
326 pipeline_bound = "VUID-vkCmdTraceRaysNV-None-02700";
327 dynamic_state = "VUID-vkCmdTraceRaysNV-commandBuffer-02701";
328 compatible_pipeline = "VUID-vkCmdTraceRaysNV-None-02697";
329 linear_sampler = "VUID-vkCmdTraceRaysNV-magFilter-04553";
330 cubic_sampler = "VUID-vkCmdTraceRaysNV-None-02692";
331 corner_sampled_address_mode = "VUID-vkCmdTraceRaysNV-flags-02696";
332 imageview_atomic = "VUID-vkCmdTraceRaysNV-None-02691";
333 push_constants_set = "VUID-vkCmdTraceRaysNV-None-02698";
334 descriptor_valid = "VUID-vkCmdTraceRaysNV-None-02699";
335 sampler_imageview_type = "VUID-vkCmdTraceRaysNV-None-02702";
336 sampler_implicitLod_dref_proj = "VUID-vkCmdTraceRaysNV-None-02703";
337 sampler_bias_offset = "VUID-vkCmdTraceRaysNV-None-02704";
338 dynamic_state_setting_commands = "VUID-vkCmdTraceRaysNV-None-02859";
339 unprotected_command_buffer = "VUID-vkCmdTraceRaysNV-commandBuffer-02707";
340 protected_command_buffer = "VUID-vkCmdTraceRaysNV-commandBuffer-02712";
341 filter_cubic = "VUID-vkCmdTraceRaysNV-filterCubic-02694";
342 filter_cubic_min_max = "VUID-vkCmdTraceRaysNV-filterCubicMinmax-02695";
343 }
344};
345
346struct DispatchVuidsCmdTraceRaysKHR: DrawDispatchVuid {
347 DispatchVuidsCmdTraceRaysKHR() : DrawDispatchVuid() {
348 queue_flag = "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool";
349 inside_renderpass = "VUID-vkCmdTraceRaysKHR-renderpass";
350 pipeline_bound = "VUID-vkCmdTraceRaysKHR-None-02700";
351 dynamic_state = "VUID-vkCmdTraceRaysKHR-commandBuffer-02701";
352 compatible_pipeline = "VUID-vkCmdTraceRaysKHR-None-02697";
353 linear_sampler = "VUID-vkCmdTraceRaysKHR-magFilter-04553";
354 cubic_sampler = "VUID-vkCmdTraceRaysKHR-None-02692";
355 corner_sampled_address_mode = "VUID-vkCmdTraceRaysKHR-flags-02696";
356 imageview_atomic = "VUID-vkCmdTraceRaysKHR-None-02691";
357 push_constants_set = "VUID-vkCmdTraceRaysKHR-None-02698";
358 descriptor_valid = "VUID-vkCmdTraceRaysKHR-None-02699";
359 sampler_imageview_type = "VUID-vkCmdTraceRaysKHR-None-02702";
360 sampler_implicitLod_dref_proj = "VUID-vkCmdTraceRaysKHR-None-02703";
361 sampler_bias_offset = "VUID-vkCmdTraceRaysKHR-None-02704";
362 dynamic_state_setting_commands = "VUID-vkCmdTraceRaysKHR-None-02859";
363 unprotected_command_buffer = "VUID-vkCmdTraceRaysKHR-commandBuffer-02707";
364 protected_command_buffer = "VUID-vkCmdTraceRaysKHR-commandBuffer-02712";
365 filter_cubic = "VUID-vkCmdTraceRaysKHR-filterCubic-02694";
366 filter_cubic_min_max = "VUID-vkCmdTraceRaysKHR-filterCubicMinmax-02695";
367 }
368};
369
370struct DispatchVuidsCmdTraceRaysIndirectKHR: DrawDispatchVuid {
371 DispatchVuidsCmdTraceRaysIndirectKHR() : DrawDispatchVuid() {
372 queue_flag = "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool";
373 inside_renderpass = "VUID-vkCmdTraceRaysIndirectKHR-renderpass";
374 pipeline_bound = "VUID-vkCmdTraceRaysIndirectKHR-None-02700";
375 dynamic_state = "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701";
376 compatible_pipeline = "VUID-vkCmdTraceRaysIndirectKHR-None-02697";
377 linear_sampler = "VUID-vkCmdTraceRaysIndirectKHR-magFilter-04553";
378 cubic_sampler = "VUID-vkCmdTraceRaysIndirectKHR-None-02692";
379 indirect_protected_cb = "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711";
380 indirect_contiguous_memory = "VUID-vkCmdTraceRaysIndirectKHR-buffer-02708";
381 indirect_buffer_bit = "VUID-vkCmdTraceRaysIndirectKHR-buffer-02709";
382 corner_sampled_address_mode = "VUID-vkCmdTraceRaysIndirectKHR-flags-02696";
383 imageview_atomic = "VUID-vkCmdTraceRaysIndirectKHR-None-02691";
384 push_constants_set = "VUID-vkCmdTraceRaysIndirectKHR-None-02698";
385 descriptor_valid = "VUID-vkCmdTraceRaysIndirectKHR-None-02699";
386 sampler_imageview_type = "VUID-vkCmdTraceRaysIndirectKHR-None-02702";
387 sampler_implicitLod_dref_proj = "VUID-vkCmdTraceRaysIndirectKHR-None-02703";
388 sampler_bias_offset = "VUID-vkCmdTraceRaysIndirectKHR-None-02704";
389 dynamic_state_setting_commands = "VUID-vkCmdTraceRaysIndirectKHR-None-02859";
390 unprotected_command_buffer = "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02707";
391 filter_cubic = "VUID-vkCmdTraceRaysIndirectKHR-filterCubic-02694";
392 filter_cubic_min_max = "VUID-vkCmdTraceRaysIndirectKHR-filterCubicMinmax-02695";
393 }
394};
395
396struct DispatchVuidsCmdDrawMeshTasksNV: DrawDispatchVuid {
397 DispatchVuidsCmdDrawMeshTasksNV() : DrawDispatchVuid() {
398 queue_flag = "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool";
399 inside_renderpass = "VUID-vkCmdDrawMeshTasksNV-renderpass";
400 pipeline_bound = "VUID-vkCmdDrawMeshTasksNV-None-02700";
401 dynamic_state = "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701";
402 compatible_pipeline = "VUID-vkCmdDrawMeshTasksNV-None-02697";
403 render_pass_compatible = "VUID-vkCmdDrawMeshTasksNV-renderPass-02684";
404 subpass_index = "VUID-vkCmdDrawMeshTasksNV-subpass-02685";
405 sample_location = "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689";
406 linear_sampler = "VUID-vkCmdDrawMeshTasksNV-magFilter-04553";
407 cubic_sampler = "VUID-vkCmdDrawMeshTasksNV-None-02692";
408 viewport_count = "VUID-vkCmdDrawMeshTasksNV-viewportCount-03417";
409 scissor_count = "VUID-vkCmdDrawMeshTasksNV-scissorCount-03418";
410 viewport_scissor_count = "VUID-vkCmdDrawMeshTasksNV-viewportCount-03419";
411 primitive_topology = "VUID-vkCmdDrawMeshTasksNV-primitiveTopology-03420";
412 corner_sampled_address_mode = "VUID-vkCmdDrawMeshTasksNV-flags-02696";
413 subpass_input = "VUID-vkCmdDrawMeshTasksNV-None-02686";
414 imageview_atomic = "VUID-vkCmdDrawMeshTasksNV-None-02691";
415 push_constants_set = "VUID-vkCmdDrawMeshTasksNV-None-02698";
416 image_subresources = "VUID-vkCmdDrawMeshTasksNV-None-04584";
417 descriptor_valid = "VUID-vkCmdDrawMeshTasksNV-None-02699";
418 sampler_imageview_type = "VUID-vkCmdDrawMeshTasksNV-None-02702";
419 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawMeshTasksNV-None-02703";
420 sampler_bias_offset = "VUID-vkCmdDrawMeshTasksNV-None-02704";
421 dynamic_state_setting_commands = "VUID-vkCmdDrawMeshTasksNV-None-02859";
422 unprotected_command_buffer = "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02707";
423 max_multiview_instance_index = "VUID-vkCmdDrawMeshTasksNV-maxMultiviewInstanceIndex-02688";
424 filter_cubic = "VUID-vkCmdDrawMeshTasksNV-filterCubic-02694";
425 filter_cubic_min_max = "VUID-vkCmdDrawMeshTasksNV-filterCubicMinmax-02695";
426 }
427};
428
429struct DispatchVuidsCmdDrawMeshTasksIndirectNV: DrawDispatchVuid {
430 DispatchVuidsCmdDrawMeshTasksIndirectNV() : DrawDispatchVuid() {
431 queue_flag = "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool";
432 inside_renderpass = "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass";
433 pipeline_bound = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700";
434 dynamic_state = "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701";
435 compatible_pipeline = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02697";
436 render_pass_compatible = "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684";
437 subpass_index = "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685";
438 sample_location = "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689";
439 linear_sampler = "VUID-vkCmdDrawMeshTasksIndirectNV-magFilter-04553";
440 cubic_sampler = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02692";
441 indirect_protected_cb = "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711";
442 indirect_contiguous_memory = "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708";
443 indirect_buffer_bit = "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709";
444 viewport_count = "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03417";
445 scissor_count = "VUID-vkCmdDrawMeshTasksIndirectNV-scissorCount-03418";
446 viewport_scissor_count = "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03419";
447 primitive_topology = "VUID-vkCmdDrawMeshTasksIndirectNV-primitiveTopology-03420";
448 corner_sampled_address_mode = "VUID-vkCmdDrawMeshTasksIndirectNV-flags-02696";
449 subpass_input = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02686";
450 imageview_atomic = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02691";
451 push_constants_set = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02698";
452 image_subresources = "VUID-vkCmdDrawMeshTasksIndirectNV-None-04584";
453 descriptor_valid = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02699";
454 sampler_imageview_type = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02702";
455 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02703";
456 sampler_bias_offset = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02704";
457 dynamic_state_setting_commands = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02859";
458 unprotected_command_buffer = "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02707";
459 max_multiview_instance_index = "VUID-vkCmdDrawMeshTasksIndirectNV-maxMultiviewInstanceIndex-02688";
460 filter_cubic = "VUID-vkCmdDrawMeshTasksIndirectNV-filterCubic-02694";
461 filter_cubic_min_max = "VUID-vkCmdDrawMeshTasksIndirectNV-filterCubicMinmax-02695";
462 }
463};
464
465struct DispatchVuidsCmdDrawMeshTasksIndirectCountNV : DrawDispatchVuid {
466 DispatchVuidsCmdDrawMeshTasksIndirectCountNV() : DrawDispatchVuid() {
467 queue_flag = "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool";
468 inside_renderpass = "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass";
469 pipeline_bound = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700";
470 dynamic_state = "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701";
471 compatible_pipeline = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697";
472 render_pass_compatible = "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684";
473 subpass_index = "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685";
474 sample_location = "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689";
475 linear_sampler = "VUID-vkCmdDrawMeshTasksIndirectCountNV-magFilter-04553";
476 cubic_sampler = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692";
477 indirect_protected_cb = "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711";
478 indirect_contiguous_memory = "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708";
479 indirect_buffer_bit = "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709";
480 viewport_count = "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03417";
481 scissor_count = "VUID-vkCmdDrawMeshTasksIndirectCountNV-scissorCount-03418";
482 viewport_scissor_count = "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03419";
483 primitive_topology = "VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveTopology-03420";
484 corner_sampled_address_mode = "VUID-vkCmdDrawMeshTasksIndirectCountNV-flags-02696";
485 subpass_input = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02686";
486 imageview_atomic = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02691";
487 push_constants_set = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02698";
488 image_subresources = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-04584";
489 descriptor_valid = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02699";
490 sampler_imageview_type = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02702";
491 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02703";
492 sampler_bias_offset = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02704";
493 dynamic_state_setting_commands = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02859";
494 unprotected_command_buffer = "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02707";
495 max_multiview_instance_index = "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxMultiviewInstanceIndex-02688";
496 filter_cubic = "VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubic-02694";
497 filter_cubic_min_max = "VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubicMinmax-02695";
498 }
499};
500
501struct DispatchVuidsCmdDrawIndirectByteCountEXT: DrawDispatchVuid {
502 DispatchVuidsCmdDrawIndirectByteCountEXT() : DrawDispatchVuid() {
503 queue_flag = "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-cmdpool";
504 inside_renderpass = "VUID-vkCmdDrawIndirectByteCountEXT-renderpass";
505 pipeline_bound = "VUID-vkCmdDrawIndirectByteCountEXT-None-02700";
506 dynamic_state = "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02701";
507 vertex_binding = "VUID-vkCmdDrawIndirectByteCountEXT-None-04007";
508 vertex_binding_null = "VUID-vkCmdDrawIndirectByteCountEXT-None-04008";
509 compatible_pipeline = "VUID-vkCmdDrawIndirectByteCountEXT-None-02697";
510 render_pass_compatible = "VUID-vkCmdDrawIndirectByteCountEXT-renderPass-02684";
511 subpass_index = "VUID-vkCmdDrawIndirectByteCountEXT-subpass-02685";
512 sample_location = "VUID-vkCmdDrawIndirectByteCountEXT-sampleLocationsEnable-02689";
513 linear_sampler = "VUID-vkCmdDrawIndirectByteCountEXT-magFilter-04553";
514 cubic_sampler = "VUID-vkCmdDrawIndirectByteCountEXT-None-02692";
515 indirect_protected_cb = "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02646";
516 indirect_contiguous_memory = "UNASSIGNED-vkCmdDrawIndirectByteCountEXT-buffer", // TODO - Update when header are updated
517 indirect_buffer_bit = "VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-02290";
518 viewport_count = "VUID-vkCmdDrawIndirectByteCountEXT-viewportCount-03417";
519 scissor_count = "VUID-vkCmdDrawIndirectByteCountEXT-scissorCount-03418";
520 viewport_scissor_count = "VUID-vkCmdDrawIndirectByteCountEXT-viewportCount-03419";
521 primitive_topology = "VUID-vkCmdDrawIndirectByteCountEXT-primitiveTopology-03420";
522 corner_sampled_address_mode = "VUID-vkCmdDrawIndirectByteCountEXT-flags-02696";
523 subpass_input = "VUID-vkCmdDrawIndirectByteCountEXT-None-02686";
524 imageview_atomic = "VUID-vkCmdDrawIndirectByteCountEXT-None-02691";
525 push_constants_set = "VUID-vkCmdDrawIndirectByteCountEXT-None-02698";
526 image_subresources = "VUID-vkCmdDrawIndirectByteCountEXT-None-04584";
527 descriptor_valid = "VUID-vkCmdDrawIndirectByteCountEXT-None-02699";
528 sampler_imageview_type = "VUID-vkCmdDrawIndirectByteCountEXT-None-02702";
529 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndirectByteCountEXT-None-02703";
530 sampler_bias_offset = "VUID-vkCmdDrawIndirectByteCountEXT-None-02704";
531 vertex_binding_attribute = "VUID-vkCmdDrawIndirectByteCountEXT-None-02721";
532 dynamic_state_setting_commands = "VUID-vkCmdDrawIndirectByteCountEXT-None-02859";
533 unprotected_command_buffer = "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02707";
534 max_multiview_instance_index = "VUID-vkCmdDrawIndirectByteCountEXT-maxMultiviewInstanceIndex-02688";
535 filter_cubic = "VUID-vkCmdDrawIndirectByteCountEXT-filterCubic-02694";
536 filter_cubic_min_max = "VUID-vkCmdDrawIndirectByteCountEXT-filterCubicMinmax-02695";
537 }
538};
539
540struct DispatchVuidsCmdDispatchBase: DrawDispatchVuid {
541 DispatchVuidsCmdDispatchBase() : DrawDispatchVuid() {
542 queue_flag = "VUID-vkCmdDispatchBase-commandBuffer-cmdpool";
543 inside_renderpass = "VUID-vkCmdDispatchBase-renderpass";
544 pipeline_bound = "VUID-vkCmdDispatchBase-None-02700";
545 compatible_pipeline = "VUID-vkCmdDispatchBase-None-02697";
546 linear_sampler = "VUID-vkCmdDispatchBase-magFilter-04553";
547 cubic_sampler = "VUID-vkCmdDispatchBase-None-02692";
548 corner_sampled_address_mode = "VUID-vkCmdDispatchBase-flags-02696";
549 imageview_atomic = "VUID-vkCmdDispatchBase-None-02691";
550 push_constants_set = "VUID-vkCmdDispatchBase-None-02698";
551 descriptor_valid = "VUID-vkCmdDispatchBase-None-02699";
552 sampler_imageview_type = "VUID-vkCmdDispatchBase-None-02702";
553 sampler_implicitLod_dref_proj = "VUID-vkCmdDispatchBase-None-02703";
554 sampler_bias_offset = "VUID-vkCmdDispatchBase-None-02704";
555 dynamic_state_setting_commands = "VUID-vkCmdDispatchBase-None-02859";
556 unprotected_command_buffer = "VUID-vkCmdDispatchBase-commandBuffer-02707";
557 filter_cubic = "VUID-vkCmdDispatchBase-filterCubic-02694";
558 filter_cubic_min_max = "VUID-vkCmdDispatchBase-filterCubicMinmax-02695";
559 }
560};
561
562// This LUT is created to allow a static listing of each VUID that is covered by drawdispatch commands
Spencer Fricke507600b2020-03-22 13:23:06 -0700563static const std::map<CMD_TYPE, DrawDispatchVuid> drawdispatch_vuid = {
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700564 {CMD_DRAW, DispatchVuidsCmdDraw()},
565 {CMD_DRAWINDEXED, DispatchVuidsCmdDrawIndexed()},
566 {CMD_DRAWINDIRECT, DispatchVuidsCmdDrawIndirect()},
567 {CMD_DRAWINDEXEDINDIRECT, DispatchVuidsCmdDrawIndexedIndirect()},
568 {CMD_DISPATCH, DispatchVuidsCmdDispatch()},
569 {CMD_DISPATCHINDIRECT, DispatchVuidsCmdDispatchIndirect()},
570 {CMD_DRAWINDIRECTCOUNT, DispatchVuidsCmdDrawIndirectCount()},
571 {CMD_DRAWINDEXEDINDIRECTCOUNT, DispatchVuidsCmdDrawIndexedIndirectCount()},
572 {CMD_TRACERAYSNV, DispatchVuidsCmdTraceRaysNV()},
573 {CMD_TRACERAYSKHR, DispatchVuidsCmdTraceRaysKHR()},
574 {CMD_TRACERAYSINDIRECTKHR, DispatchVuidsCmdTraceRaysIndirectKHR()},
575 {CMD_DRAWMESHTASKSNV, DispatchVuidsCmdDrawMeshTasksNV()},
576 {CMD_DRAWMESHTASKSINDIRECTNV, DispatchVuidsCmdDrawMeshTasksIndirectNV()},
577 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, DispatchVuidsCmdDrawMeshTasksIndirectCountNV()},
578 {CMD_DRAWINDIRECTBYTECOUNTEXT, DispatchVuidsCmdDrawIndirectByteCountEXT()},
579 {CMD_DISPATCHBASE, DispatchVuidsCmdDispatchBase()},
Spencer Fricke507600b2020-03-22 13:23:06 -0700580 // Used if invalid cmd_type is used
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700581 {CMD_NONE, DrawDispatchVuid()}
Spencer Fricke507600b2020-03-22 13:23:06 -0700582};
583// clang-format on
584
585// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
586const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
587 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
588 return drawdispatch_vuid.at(cmd_type);
589 } else {
590 return drawdispatch_vuid.at(CMD_NONE);
591 }
592}
593
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700594// Generic function to handle validation for all CmdDraw* type functions
595bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700596 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700597 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700598 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600599 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700600 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700601 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700602 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700603 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
604 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
605 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700606 }
607 return skip;
608}
609
locke-lunarg3fa463a2020-10-23 16:39:04 -0600610bool CoreChecks::ValidateCmdDrawInstance(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance,
611 CMD_TYPE cmd_type, const char *caller) const {
612 bool skip = false;
613 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
614 const auto *cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
615 if (!cb_node) return skip;
616
617 // Verify maxMultiviewInstanceIndex
618 if (cb_node->activeRenderPass && cb_node->activeRenderPass->renderPass && enabled_features.multiview_features.multiview &&
619 ((instanceCount + firstInstance) > phys_dev_ext_props.multiview_props.maxMultiviewInstanceIndex)) {
620 LogObjectList objlist(commandBuffer);
621 objlist.add(cb_node->activeRenderPass->renderPass);
622 skip |= LogError(objlist, vuid.max_multiview_instance_index,
623 "%s: multiview is enabled, and maxMultiviewInstanceIndex: %" PRIu32 ", but instanceCount: %" PRIu32
624 "and firstInstance: %" PRIu32 ".",
625 caller, report_data->FormatHandle(cb_node->activeRenderPass->renderPass).c_str(),
626 phys_dev_ext_props.multiview_props.maxMultiviewInstanceIndex, instanceCount, firstInstance);
627 }
628 return skip;
629}
630
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700631bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500632 uint32_t firstVertex, uint32_t firstInstance) const {
locke-lunarg3fa463a2020-10-23 16:39:04 -0600633 bool skip = false;
634 skip |= ValidateCmdDrawInstance(commandBuffer, instanceCount, firstInstance, CMD_DRAW, "vkCmdDraw()");
635 skip |=
636 ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()", VK_QUEUE_GRAPHICS_BIT);
637 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700638}
639
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700640bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500641 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
locke-lunarg3fa463a2020-10-23 16:39:04 -0600642 bool skip = false;
643 skip |= ValidateCmdDrawInstance(commandBuffer, instanceCount, firstInstance, CMD_DRAWINDEXED, "vkCmdDrawIndexed()");
644 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
645 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500646 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700647 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
648 unsigned int index_size = 0;
649 const auto &index_buffer_binding = cb_state->index_buffer_binding;
650 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
651 index_size = 2;
652 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
653 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600654 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
655 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700656 }
657 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
658 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700659 skip |=
locke-lunarg1ae57d62020-11-18 10:49:19 -0700660 LogError(index_buffer_binding.buffer_state->buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700661 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
662 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
663 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
664 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700665 }
666 }
667 return skip;
668}
669
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700670bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500671 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700672 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700673 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600674 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700675 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600676 if (count > 1) {
677 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
678 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
679 skip |=
680 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
681 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
682 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700683 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
684 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
685 return skip;
686}
687
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700688bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500689 uint32_t count, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700690 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
691 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600692 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700693 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600694 if (count > 1) {
695 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
696 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
697 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
698 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
699 buffer_state);
700 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700701 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
702 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
703 // 'buffer'.
704 return skip;
705}
706
Jeff Bolz5c801d12019-10-09 10:38:45 -0500707bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600708 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600709 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700710 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600711 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700712}
713
locke-lunarg25b6c352020-08-06 17:44:18 -0600714bool CoreChecks::PreCallValidateCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
715 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
716 uint32_t groupCountZ) const {
717 bool skip = false;
718 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHBASE, "vkCmdDispatchBase()",
719 VK_QUEUE_COMPUTE_BIT);
720 return skip;
721}
722
723bool CoreChecks::PreCallValidateCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
724 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
725 uint32_t groupCountZ) const {
726 bool skip = false;
727 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHBASE, "vkCmdDispatchBaseKHR()",
728 VK_QUEUE_COMPUTE_BIT);
729 return skip;
730}
731
Jeff Bolz5c801d12019-10-09 10:38:45 -0500732bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700733 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700734 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700735 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700736 return skip;
737}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700738bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
739 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700740 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700741 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700742 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
Shannon McPherson2c793ba2020-08-28 12:13:24 -0600743 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-04445",
sfricke-samsung27c70722020-05-02 08:42:39 -0700744 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
745 "call this command.",
746 apiName);
747 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700748 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
749 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600750 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600751 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700752 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
753 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700754 }
755
Tony-LunarG83544c72020-01-17 12:30:19 -0700756 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700757 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600758 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700759 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECTCOUNT, apiName);
Tony-LunarG83544c72020-01-17 12:30:19 -0700760 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Tony-LunarG83544c72020-01-17 12:30:19 -0700761 skip |=
762 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
763 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700764 return skip;
765}
766
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700767bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
768 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
769 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700770 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700771 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700772}
773
774bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
775 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
776 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700777 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700778 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700779}
780
781bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
782 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700783 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700784 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700785 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
Shannon McPherson2c793ba2020-08-28 12:13:24 -0600786 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-None-04445",
sfricke-samsung27c70722020-05-02 08:42:39 -0700787 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
788 "call this command.",
789 apiName);
790 }
sfricke-samsungf692b972020-05-02 08:00:45 -0700791 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
792 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600793 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600794 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800795 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700796 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700797 }
798
sfricke-samsungf692b972020-05-02 08:00:45 -0700799 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
800 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600801 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700802 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName);
sfricke-samsungf692b972020-05-02 08:00:45 -0700803 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700804 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700805 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800806 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700807 return skip;
808}
809
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700810bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
811 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
812 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700813 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
814 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700815}
816
817bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
818 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
819 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700820 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
821 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700822}
823
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600824bool CoreChecks::PreCallValidateCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount,
825 uint32_t firstInstance, VkBuffer counterBuffer,
826 VkDeviceSize counterBufferOffset, uint32_t counterOffset,
827 uint32_t vertexStride) const {
sfricke-samsungd5e9adb2020-10-26 03:59:29 -0700828 bool skip = false;
locke-lunarg3fa463a2020-10-23 16:39:04 -0600829 skip |= ValidateCmdDrawInstance(commandBuffer, instanceCount, firstInstance, CMD_DRAWINDIRECTBYTECOUNTEXT,
830 "vkCmdDrawIndirectByteCountEXT()");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -0700831 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTBYTECOUNTEXT,
832 "vkCmdDrawIndirectByteCountEXT()", VK_QUEUE_GRAPHICS_BIT);
833 skip |= ValidateIndirectCmd(commandBuffer, counterBuffer, CMD_DRAWINDIRECTBYTECOUNTEXT, "vkCmdDrawIndirectByteCountEXT()");
834 return skip;
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600835}
836
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500837bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
838 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
839 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
840 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
841 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
842 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
843 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700844 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
845 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
sourav parmard1521802020-06-07 21:49:02 -0700846 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
847 skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
848 auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
849 if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
850 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
851 "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
852 " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
853 callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
854 }
855 auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
856 if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
857 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
858 "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
859 " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
860 hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
861 }
862 auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
863 if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
864 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
865 "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
baldurk751594b2020-09-09 09:41:02 +0100866 " must be less than the size of missShaderBindingTableBuffer %" PRIu64 " .",
sourav parmard1521802020-06-07 21:49:02 -0700867 missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
868 }
869 auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
870 if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
871 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
872 "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
baldurk751594b2020-09-09 09:41:02 +0100873 " must be less than the size of raygenShaderBindingTableBuffer %" PRIu64 " .",
sourav parmard1521802020-06-07 21:49:02 -0700874 raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
875 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700876
877 for (const auto &object : cb_state->object_bindings) {
878 if (object.type == kVulkanObjectTypePipeline) {
879 auto pipeline_state = object.node ? (PIPELINE_STATE *)object.node : GetPipelineState(object.Cast<VkPipeline>());
880 const auto &pipeline_state_bind_point =
881 pipeline_state ? pipeline_state->getPipelineType() : VK_PIPELINE_BIND_POINT_MAX_ENUM;
882 if (!pipeline_state || (pipeline_state && !pipeline_state->pipeline) ||
883 pipeline_state_bind_point != VK_PIPELINE_BIND_POINT_RAY_TRACING_NV) {
884 skip |=
885 LogError(device, "VUID-vkCmdTraceRaysNV-None-02700",
886 "vkCmdTraceRaysNV: A valid pipeline must be bound to the pipeline bind point used by this command.");
887 }
888 }
889 }
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500890 return skip;
891}
892
Jason Macnak67407e72019-07-11 11:05:09 -0700893void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
894 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
895 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
896 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
897 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
898 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
899 uint32_t width, uint32_t height, uint32_t depth) {
900 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
locke-lunarg540b2252020-08-03 13:23:36 -0600901 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, "vkCmdTraceRaysNV()");
Jason Macnak67407e72019-07-11 11:05:09 -0700902 cb_state->hasTraceRaysCmd = true;
903}
904
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500905bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700906 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
907 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
908 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
909 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500910 uint32_t height, uint32_t depth) const {
911 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
912 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
sourav parmarcd5fb182020-07-17 12:58:44 -0700913 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Shannon McPherson9caca052020-11-25 11:34:38 -0700914 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
915 const PIPELINE_STATE *pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
sourav parmarcd5fb182020-07-17 12:58:44 -0700916 if (!pipeline_state || (pipeline_state && !pipeline_state->pipeline)) {
917 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-None-02700",
918 "vkCmdTraceRaysKHR: A valid pipeline must be bound to the pipeline bind point used by this command.");
919 } else { // bound to valid RT pipeline
920 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR) {
921 if (!pHitShaderBindingTable->deviceAddress) {
922 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03697",
923 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with flags "
924 "that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, the "
925 "deviceAddress member of pHitShaderBindingTable must not be zero.");
926 }
927 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
928 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03514",
929 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with "
930 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, "
931 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
932 "execute an intersection shader must not be set to zero.");
933 }
934 }
935 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR) {
936 if (!pHitShaderBindingTable->deviceAddress) {
937 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03696",
938 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with flags "
939 "that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, the "
940 "deviceAddress member of pHitShaderBindingTable must not be zero.");
941 }
942 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
943 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03513",
944 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with "
945 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, "
946 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
947 "execute a closest hit shader must not be set to zero.");
948 }
949 }
950 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR) {
951 if (!pHitShaderBindingTable->deviceAddress) {
952 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03695",
953 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with flags "
954 "that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, the "
955 "deviceAddress member of pHitShaderBindingTable must not be zero.");
956 }
957 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
958 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03512",
959 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with "
960 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, "
961 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
962 "execute an any hit shader must not be set to zero.");
963 }
964 }
965 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500966 return skip;
967}
968
969void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700970 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
971 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
972 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
973 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500974 uint32_t height, uint32_t depth) {
975 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
locke-lunarg540b2252020-08-03 13:23:36 -0600976 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, "vkCmdTraceRaysKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500977 cb_state->hasTraceRaysCmd = true;
978}
979
980bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700981 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
982 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
983 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
984 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
985 VkDeviceAddress indirectDeviceAddress) const {
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700986 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSINDIRECTKHR,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500987 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
sourav parmarcd5fb182020-07-17 12:58:44 -0700988 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Shannon McPherson9caca052020-11-25 11:34:38 -0700989 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
990 const PIPELINE_STATE *pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
sourav parmarcd5fb182020-07-17 12:58:44 -0700991 if (!pipeline_state || (pipeline_state && !pipeline_state->pipeline)) {
992 skip |=
993 LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
994 "vkCmdTraceRaysIndirectKHR: A valid pipeline must be bound to the pipeline bind point used by this command.");
995 } else { // valid bind point
996 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR) {
997 if (!pHitShaderBindingTable || pHitShaderBindingTable->deviceAddress == 0) {
998 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03697",
999 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1000 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, the "
1001 "deviceAddress member of pHitShaderBindingTable must not be zero.");
1002 }
1003 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
1004 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03514",
1005 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1006 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, "
1007 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
1008 "execute an intersection shader must not be set to zero.");
1009 }
1010 }
1011 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR) {
1012 if (!pHitShaderBindingTable || pHitShaderBindingTable->deviceAddress == 0) {
1013 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03696",
1014 "vkCmdTraceRaysIndirectKHR:If the currently bound ray tracing pipeline was created with "
1015 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, "
1016 "the deviceAddress member of pHitShaderBindingTable must not be zero.");
1017 }
1018 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
1019 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03513",
1020 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1021 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, "
1022 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
1023 "execute a closest hit shader must not be set to zero.");
1024 }
1025 }
1026 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR) {
1027 if (!pHitShaderBindingTable || pHitShaderBindingTable->deviceAddress == 0) {
1028 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03695",
1029 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1030 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, the "
1031 "deviceAddress member of pHitShaderBindingTable must not be zero.");
1032 }
1033 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
1034 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03512",
1035 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1036 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, "
1037 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
1038 "execute an any hit shader must not be set to zero.");
1039 }
1040 }
1041 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001042 return skip;
1043}
1044
1045void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -07001046 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
1047 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
1048 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
1049 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -07001050 VkDeviceAddress indirectDeviceAddress) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001051 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
locke-lunarg540b2252020-08-03 13:23:36 -06001052 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR,
1053 "vkCmdTraceRaysIndirectKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001054 cb_state->hasTraceRaysCmd = true;
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001055}
1056
Jeff Bolz5c801d12019-10-09 10:38:45 -05001057bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -07001058 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
1059 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001060 return skip;
1061}
1062
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001063bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001064 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001065 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -07001066 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -06001067 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -07001068 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTNV, "vkCmdDrawMeshTasksIndirectNV()");
Lockee68ac652019-05-06 10:17:33 -06001069 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -06001070 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
1071 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
1072 drawCount, offset, buffer_state);
1073 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001074 return skip;
1075}
1076
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001077bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1078 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001079 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -07001080 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -07001081 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -06001082 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
1083 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -07001084 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTCOUNTNV, "vkCmdDrawMeshTasksIndirectCountNV()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001085 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -06001086 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -07001087 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -07001088 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
1089 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -06001090 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
1091 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
1092 if (maxDrawCount > 1) {
1093 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
1094 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
1095 maxDrawCount, offset, buffer_state);
1096 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001097 return skip;
1098}