blob: 3c8a1baa6518e724d1352e3d8aa8ac3edcf0fa85 [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
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700670bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
671 uint32_t drawCount, 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()");
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700676 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600677 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
678 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700679 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
680 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), drawCount, offset,
681 buffer_state);
682 } else if ((drawCount == 1) && (offset + sizeof(VkDrawIndirectCommand)) > buffer_state->createInfo.size) {
683 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00487",
684 "CmdDrawIndirect: drawCount equals 1 and (offset + sizeof(VkDrawIndirectCommand)) (%u) is not less than "
685 "or equal to the size of buffer (%u).",
686 (offset + sizeof(VkDrawIndirectCommand)), buffer_state->createInfo.size);
Lockee68ac652019-05-06 10:17:33 -0600687 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700688 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
689 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
690 return skip;
691}
692
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700693bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700694 uint32_t drawCount, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700695 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
696 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600697 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700698 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()");
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700699 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600700 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
701 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
702 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700703 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), drawCount,
704 offset, buffer_state);
705 } else if ((drawCount == 1) && (offset + sizeof(VkDrawIndexedIndirectCommand)) > buffer_state->createInfo.size) {
706 skip |= LogError(
707 commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00539",
708 "CmdDrawIndexedIndirect: drawCount equals 1 and (offset + sizeof(VkDrawIndexedIndirectCommand)) (%u) is not less than "
709 "or equal to the size of buffer (%u).",
710 (offset + sizeof(VkDrawIndexedIndirectCommand)), buffer_state->createInfo.size);
Lockee68ac652019-05-06 10:17:33 -0600711 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700712 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
713 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
714 // 'buffer'.
715 return skip;
716}
717
Jeff Bolz5c801d12019-10-09 10:38:45 -0500718bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600719 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600720 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700721 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600722 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700723}
724
locke-lunarg25b6c352020-08-06 17:44:18 -0600725bool CoreChecks::PreCallValidateCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
726 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
727 uint32_t groupCountZ) const {
728 bool skip = false;
729 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHBASE, "vkCmdDispatchBase()",
730 VK_QUEUE_COMPUTE_BIT);
731 return skip;
732}
733
734bool CoreChecks::PreCallValidateCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
735 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
736 uint32_t groupCountZ) const {
737 bool skip = false;
738 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHBASE, "vkCmdDispatchBaseKHR()",
739 VK_QUEUE_COMPUTE_BIT);
740 return skip;
741}
742
Jeff Bolz5c801d12019-10-09 10:38:45 -0500743bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700744 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700745 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700746 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700747 return skip;
748}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700749bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
750 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700751 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700752 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700753 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
Shannon McPherson2c793ba2020-08-28 12:13:24 -0600754 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-04445",
sfricke-samsung27c70722020-05-02 08:42:39 -0700755 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
756 "call this command.",
757 apiName);
758 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700759 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
760 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600761 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600762 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700763 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
764 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700765 }
766
Tony-LunarG83544c72020-01-17 12:30:19 -0700767 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700768 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600769 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700770 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECTCOUNT, apiName);
Tony-LunarG83544c72020-01-17 12:30:19 -0700771 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Tony-LunarG83544c72020-01-17 12:30:19 -0700772 skip |=
773 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
774 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700775 return skip;
776}
777
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700778bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
779 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
780 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700781 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700782 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700783}
784
785bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
786 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
787 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700788 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700789 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700790}
791
792bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
793 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700794 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700795 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700796 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
Shannon McPherson2c793ba2020-08-28 12:13:24 -0600797 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-None-04445",
sfricke-samsung27c70722020-05-02 08:42:39 -0700798 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
799 "call this command.",
800 apiName);
801 }
sfricke-samsungf692b972020-05-02 08:00:45 -0700802 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
803 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600804 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600805 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800806 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700807 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700808 }
809
sfricke-samsungf692b972020-05-02 08:00:45 -0700810 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
811 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600812 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700813 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName);
sfricke-samsungf692b972020-05-02 08:00:45 -0700814 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700815 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700816 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800817 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700818 return skip;
819}
820
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700821bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
822 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
823 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700824 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
825 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700826}
827
828bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
829 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
830 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700831 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
832 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700833}
834
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600835bool CoreChecks::PreCallValidateCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount,
836 uint32_t firstInstance, VkBuffer counterBuffer,
837 VkDeviceSize counterBufferOffset, uint32_t counterOffset,
838 uint32_t vertexStride) const {
sfricke-samsungd5e9adb2020-10-26 03:59:29 -0700839 bool skip = false;
locke-lunarg3fa463a2020-10-23 16:39:04 -0600840 skip |= ValidateCmdDrawInstance(commandBuffer, instanceCount, firstInstance, CMD_DRAWINDIRECTBYTECOUNTEXT,
841 "vkCmdDrawIndirectByteCountEXT()");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -0700842 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTBYTECOUNTEXT,
843 "vkCmdDrawIndirectByteCountEXT()", VK_QUEUE_GRAPHICS_BIT);
844 skip |= ValidateIndirectCmd(commandBuffer, counterBuffer, CMD_DRAWINDIRECTBYTECOUNTEXT, "vkCmdDrawIndirectByteCountEXT()");
845 return skip;
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600846}
847
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500848bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
849 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
850 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
851 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
852 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
853 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
854 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700855 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
856 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
sourav parmard1521802020-06-07 21:49:02 -0700857 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
858 skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
859 auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
860 if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
861 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
862 "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
863 " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
864 callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
865 }
866 auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
867 if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
868 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
869 "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
870 " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
871 hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
872 }
873 auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
874 if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
875 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
876 "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
baldurk751594b2020-09-09 09:41:02 +0100877 " must be less than the size of missShaderBindingTableBuffer %" PRIu64 " .",
sourav parmard1521802020-06-07 21:49:02 -0700878 missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
879 }
880 auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
881 if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
882 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
883 "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
baldurk751594b2020-09-09 09:41:02 +0100884 " must be less than the size of raygenShaderBindingTableBuffer %" PRIu64 " .",
sourav parmard1521802020-06-07 21:49:02 -0700885 raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
886 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700887
888 for (const auto &object : cb_state->object_bindings) {
889 if (object.type == kVulkanObjectTypePipeline) {
890 auto pipeline_state = object.node ? (PIPELINE_STATE *)object.node : GetPipelineState(object.Cast<VkPipeline>());
891 const auto &pipeline_state_bind_point =
892 pipeline_state ? pipeline_state->getPipelineType() : VK_PIPELINE_BIND_POINT_MAX_ENUM;
893 if (!pipeline_state || (pipeline_state && !pipeline_state->pipeline) ||
894 pipeline_state_bind_point != VK_PIPELINE_BIND_POINT_RAY_TRACING_NV) {
895 skip |=
896 LogError(device, "VUID-vkCmdTraceRaysNV-None-02700",
897 "vkCmdTraceRaysNV: A valid pipeline must be bound to the pipeline bind point used by this command.");
898 }
899 }
900 }
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500901 return skip;
902}
903
Jason Macnak67407e72019-07-11 11:05:09 -0700904void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
905 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
906 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
907 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
908 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
909 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
910 uint32_t width, uint32_t height, uint32_t depth) {
911 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
locke-lunarg540b2252020-08-03 13:23:36 -0600912 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, "vkCmdTraceRaysNV()");
Jason Macnak67407e72019-07-11 11:05:09 -0700913 cb_state->hasTraceRaysCmd = true;
914}
915
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500916bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700917 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
918 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
919 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
920 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500921 uint32_t height, uint32_t depth) const {
922 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
923 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
sourav parmarcd5fb182020-07-17 12:58:44 -0700924 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Shannon McPherson9caca052020-11-25 11:34:38 -0700925 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
926 const PIPELINE_STATE *pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
sourav parmarcd5fb182020-07-17 12:58:44 -0700927 if (!pipeline_state || (pipeline_state && !pipeline_state->pipeline)) {
928 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-None-02700",
929 "vkCmdTraceRaysKHR: A valid pipeline must be bound to the pipeline bind point used by this command.");
930 } else { // bound to valid RT pipeline
931 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR) {
932 if (!pHitShaderBindingTable->deviceAddress) {
933 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03697",
934 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with flags "
935 "that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, the "
936 "deviceAddress member of pHitShaderBindingTable must not be zero.");
937 }
938 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
939 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03514",
940 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with "
941 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, "
942 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
943 "execute an intersection shader must not be set to zero.");
944 }
945 }
946 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR) {
947 if (!pHitShaderBindingTable->deviceAddress) {
948 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03696",
949 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with flags "
950 "that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, the "
951 "deviceAddress member of pHitShaderBindingTable must not be zero.");
952 }
953 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
954 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03513",
955 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with "
956 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, "
957 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
958 "execute a closest hit shader must not be set to zero.");
959 }
960 }
961 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR) {
962 if (!pHitShaderBindingTable->deviceAddress) {
963 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03695",
964 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with flags "
965 "that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, the "
966 "deviceAddress member of pHitShaderBindingTable must not be zero.");
967 }
968 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
969 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03512",
970 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with "
971 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, "
972 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
973 "execute an any hit shader must not be set to zero.");
974 }
975 }
976 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500977 return skip;
978}
979
980void CoreChecks::PostCallRecordCmdTraceRaysKHR(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, uint32_t width,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500985 uint32_t height, uint32_t depth) {
986 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
locke-lunarg540b2252020-08-03 13:23:36 -0600987 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, "vkCmdTraceRaysKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500988 cb_state->hasTraceRaysCmd = true;
989}
990
991bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700992 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
993 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
994 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
995 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
996 VkDeviceAddress indirectDeviceAddress) const {
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700997 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSINDIRECTKHR,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500998 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
sourav parmarcd5fb182020-07-17 12:58:44 -0700999 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Shannon McPherson9caca052020-11-25 11:34:38 -07001000 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
1001 const PIPELINE_STATE *pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
sourav parmarcd5fb182020-07-17 12:58:44 -07001002 if (!pipeline_state || (pipeline_state && !pipeline_state->pipeline)) {
1003 skip |=
1004 LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
1005 "vkCmdTraceRaysIndirectKHR: A valid pipeline must be bound to the pipeline bind point used by this command.");
1006 } else { // valid bind point
1007 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR) {
1008 if (!pHitShaderBindingTable || pHitShaderBindingTable->deviceAddress == 0) {
1009 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03697",
1010 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1011 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, the "
1012 "deviceAddress member of pHitShaderBindingTable must not be zero.");
1013 }
1014 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
1015 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03514",
1016 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1017 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, "
1018 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
1019 "execute an intersection shader must not be set to zero.");
1020 }
1021 }
1022 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR) {
1023 if (!pHitShaderBindingTable || pHitShaderBindingTable->deviceAddress == 0) {
1024 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03696",
1025 "vkCmdTraceRaysIndirectKHR:If the currently bound ray tracing pipeline was created with "
1026 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, "
1027 "the deviceAddress member of pHitShaderBindingTable must not be zero.");
1028 }
1029 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
1030 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03513",
1031 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1032 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, "
1033 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
1034 "execute a closest hit shader must not be set to zero.");
1035 }
1036 }
1037 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR) {
1038 if (!pHitShaderBindingTable || pHitShaderBindingTable->deviceAddress == 0) {
1039 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03695",
1040 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1041 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, the "
1042 "deviceAddress member of pHitShaderBindingTable must not be zero.");
1043 }
1044 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
1045 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03512",
1046 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1047 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, "
1048 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
1049 "execute an any hit shader must not be set to zero.");
1050 }
1051 }
1052 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001053 return skip;
1054}
1055
1056void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -07001057 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
1058 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
1059 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
1060 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -07001061 VkDeviceAddress indirectDeviceAddress) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001062 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
locke-lunarg540b2252020-08-03 13:23:36 -06001063 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR,
1064 "vkCmdTraceRaysIndirectKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001065 cb_state->hasTraceRaysCmd = true;
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001066}
1067
Jeff Bolz5c801d12019-10-09 10:38:45 -05001068bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -07001069 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
1070 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001071 return skip;
1072}
1073
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001074bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001075 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001076 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -07001077 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -06001078 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -07001079 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTNV, "vkCmdDrawMeshTasksIndirectNV()");
Lockee68ac652019-05-06 10:17:33 -06001080 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -06001081 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
1082 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
1083 drawCount, offset, buffer_state);
1084 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001085 return skip;
1086}
1087
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001088bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1089 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001090 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -07001091 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -07001092 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -06001093 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
1094 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -07001095 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTCOUNTNV, "vkCmdDrawMeshTasksIndirectCountNV()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001096 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -06001097 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -07001098 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -07001099 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
1100 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -06001101 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
1102 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
1103 if (maxDrawCount > 1) {
1104 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
1105 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
1106 maxDrawCount, offset, buffer_state);
1107 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001108 return skip;
1109}