blob: 57057940a6c7c08357b95af9ce007dd4c33a2148 [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.
Tobias Hector6663c9b2020-11-05 10:18:02 +00005 * Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
Jasper St. Pierre512613a2019-04-08 16:25:23 -07006 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * Author: Cody Northrop <cnorthrop@google.com>
20 * Author: Michael Lentine <mlentine@google.com>
21 * Author: Tobin Ehlis <tobine@google.com>
22 * Author: Chia-I Wu <olv@google.com>
23 * Author: Chris Forbes <chrisf@ijw.co.nz>
24 * Author: Mark Lobodzinski <mark@lunarg.com>
25 * Author: Ian Elliott <ianelliott@google.com>
26 * Author: Dave Houlton <daveh@lunarg.com>
27 * Author: Dustin Graves <dustin@lunarg.com>
28 * Author: Jeremy Hayes <jeremy@lunarg.com>
29 * Author: Jon Ashburn <jon@lunarg.com>
30 * Author: Karl Schultz <karl@lunarg.com>
31 * Author: Mark Young <marky@lunarg.com>
32 * Author: Mike Schuchardt <mikes@lunarg.com>
33 * Author: Mike Weiblen <mikew@lunarg.com>
34 * Author: Tony Barbour <tony@LunarG.com>
35 * Author: John Zulauf <jzulauf@lunarg.com>
36 * Author: Shannon McPherson <shannon@lunarg.com>
Jeremy Kniagere6827432020-04-01 09:05:56 -060037 * Author: Jeremy Kniager <jeremyk@lunarg.com>
Mark Lobodzinskiddf43612020-11-17 11:28:02 -070038 * Author: Nathaniel Cesario <nathaniel@lunarg.com>
Tobias Hector6663c9b2020-11-05 10:18:02 +000039 * Author: Tobias Hector <tobias.hector@amd.com>
Jasper St. Pierre512613a2019-04-08 16:25:23 -070040 */
41
Jasper St. Pierre512613a2019-04-08 16:25:23 -070042#include "chassis.h"
43#include "core_validation.h"
44
Spencer Fricke507600b2020-03-22 13:23:06 -070045// clang-format off
Mark Lobodzinskiddf43612020-11-17 11:28:02 -070046struct DispatchVuidsCmdDraw : DrawDispatchVuid {
47 DispatchVuidsCmdDraw() : DrawDispatchVuid() {
48 queue_flag = "VUID-vkCmdDraw-commandBuffer-cmdpool";
49 inside_renderpass = "VUID-vkCmdDraw-renderpass";
50 pipeline_bound = "VUID-vkCmdDraw-None-02700";
51 dynamic_state = "VUID-vkCmdDraw-commandBuffer-02701";
52 vertex_binding = "VUID-vkCmdDraw-None-04007";
53 vertex_binding_null = "VUID-vkCmdDraw-None-04008";
54 compatible_pipeline = "VUID-vkCmdDraw-None-02697";
55 render_pass_compatible = "VUID-vkCmdDraw-renderPass-02684";
56 subpass_index = "VUID-vkCmdDraw-subpass-02685";
57 sample_location = "VUID-vkCmdDraw-sampleLocationsEnable-02689";
58 linear_sampler = "VUID-vkCmdDraw-magFilter-04553";
59 cubic_sampler = "VUID-vkCmdDraw-None-02692";
60 viewport_count = "VUID-vkCmdDraw-viewportCount-03417";
61 scissor_count = "VUID-vkCmdDraw-scissorCount-03418";
62 viewport_scissor_count = "VUID-vkCmdDraw-viewportCount-03419";
63 primitive_topology = "VUID-vkCmdDraw-primitiveTopology-03420";
64 corner_sampled_address_mode = "VUID-vkCmdDraw-flags-02696";
65 subpass_input = "VUID-vkCmdDraw-None-02686";
66 imageview_atomic = "VUID-vkCmdDraw-None-02691";
67 push_constants_set = "VUID-vkCmdDraw-None-02698";
68 image_subresources = "VUID-vkCmdDraw-None-04584";
69 descriptor_valid = "VUID-vkCmdDraw-None-02699";
70 sampler_imageview_type = "VUID-vkCmdDraw-None-02702";
71 sampler_implicitLod_dref_proj = "VUID-vkCmdDraw-None-02703";
72 sampler_bias_offset = "VUID-vkCmdDraw-None-02704";
73 vertex_binding_attribute = "VUID-vkCmdDraw-None-02721";
74 dynamic_state_setting_commands = "VUID-vkCmdDraw-None-02859";
75 unprotected_command_buffer = "VUID-vkCmdDraw-commandBuffer-02707";
76 protected_command_buffer = "VUID-vkCmdDraw-commandBuffer-02712";
77 max_multiview_instance_index = "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688";
78 filter_cubic = "VUID-vkCmdDraw-filterCubic-02694";
79 filter_cubic_min_max = "VUID-vkCmdDraw-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +000080 viewport_count_primitive_shading_rate = "VUID-vkCmdDraw-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -070081 }
82};
83
84struct DispatchVuidsCmdDrawIndexed : DrawDispatchVuid {
85 DispatchVuidsCmdDrawIndexed() : DrawDispatchVuid() {
86 queue_flag = "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool";
87 inside_renderpass = "VUID-vkCmdDrawIndexed-renderpass";
88 pipeline_bound = "VUID-vkCmdDrawIndexed-None-02700";
89 dynamic_state = "VUID-vkCmdDrawIndexed-commandBuffer-02701";
90 vertex_binding = "VUID-vkCmdDrawIndexed-None-04007";
91 vertex_binding_null = "VUID-vkCmdDrawIndexed-None-04008";
92 compatible_pipeline = "VUID-vkCmdDrawIndexed-None-02697";
93 render_pass_compatible = "VUID-vkCmdDrawIndexed-renderPass-02684";
94 subpass_index = "VUID-vkCmdDrawIndexed-subpass-02685";
95 sample_location = "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689";
96 linear_sampler = "VUID-vkCmdDrawIndexed-magFilter-04553";
97 cubic_sampler = "VUID-vkCmdDrawIndexed-None-02692";
98 viewport_count = "VUID-vkCmdDrawIndexed-viewportCount-03417";
99 scissor_count = "VUID-vkCmdDrawIndexed-scissorCount-03418";
100 viewport_scissor_count = "VUID-vkCmdDrawIndexed-viewportCount-03419";
101 primitive_topology = "VUID-vkCmdDrawIndexed-primitiveTopology-03420";
102 corner_sampled_address_mode = "VUID-vkCmdDrawIndexed-flags-02696";
103 subpass_input = "VUID-vkCmdDrawIndexed-None-02686";
104 imageview_atomic = "VUID-vkCmdDrawIndexed-None-02691";
105 push_constants_set = "VUID-vkCmdDrawIndexed-None-02698";
106 image_subresources = "VUID-vkCmdDrawIndexed-None-04584";
107 descriptor_valid = "VUID-vkCmdDrawIndexed-None-02699";
108 sampler_imageview_type = "VUID-vkCmdDrawIndexed-None-02702";
109 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndexed-None-02703";
110 sampler_bias_offset = "VUID-vkCmdDrawIndexed-None-02704";
111 vertex_binding_attribute = "VUID-vkCmdDrawIndexed-None-02721";
112 dynamic_state_setting_commands = "VUID-vkCmdDrawIndexed-None-02859";
113 unprotected_command_buffer = "VUID-vkCmdDrawIndexed-commandBuffer-02707";
114 protected_command_buffer = "VUID-vkCmdDrawIndexed-commandBuffer-02712";
115 max_multiview_instance_index = "VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-02688";
116 filter_cubic = "VUID-vkCmdDrawIndexed-filterCubic-02694";
117 filter_cubic_min_max = "VUID-vkCmdDrawIndexed-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +0000118 viewport_count_primitive_shading_rate = "VUID-vkCmdDrawIndexed-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700119 }
120};
121
122struct DispatchVuidsCmdDrawIndirect : DrawDispatchVuid {
123 DispatchVuidsCmdDrawIndirect() : DrawDispatchVuid() {
124 queue_flag = "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool";
125 inside_renderpass = "VUID-vkCmdDrawIndirect-renderpass";
126 pipeline_bound = "VUID-vkCmdDrawIndirect-None-02700";
127 dynamic_state = "VUID-vkCmdDrawIndirect-commandBuffer-02701";
128 vertex_binding = "VUID-vkCmdDrawIndirect-None-04007";
129 vertex_binding_null = "VUID-vkCmdDrawIndirect-None-04008";
130 compatible_pipeline = "VUID-vkCmdDrawIndirect-None-02697";
131 render_pass_compatible = "VUID-vkCmdDrawIndirect-renderPass-02684";
132 subpass_index = "VUID-vkCmdDrawIndirect-subpass-02685";
133 sample_location = "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689";
134 linear_sampler = "VUID-vkCmdDrawIndirect-magFilter-04553";
135 cubic_sampler = "VUID-vkCmdDrawIndirect-None-02692";
136 indirect_protected_cb = "VUID-vkCmdDrawIndirect-commandBuffer-02711";
137 indirect_contiguous_memory = "VUID-vkCmdDrawIndirect-buffer-02708";
138 indirect_buffer_bit = "VUID-vkCmdDrawIndirect-buffer-02709";
139 viewport_count = "VUID-vkCmdDrawIndirect-viewportCount-03417";
140 scissor_count = "VUID-vkCmdDrawIndirect-scissorCount-03418";
141 viewport_scissor_count = "VUID-vkCmdDrawIndirect-viewportCount-03419";
142 primitive_topology = "VUID-vkCmdDrawIndirect-primitiveTopology-03420";
143 corner_sampled_address_mode = "VUID-vkCmdDrawIndirect-flags-02696";
144 subpass_input = "VUID-vkCmdDrawIndirect-None-02686";
145 imageview_atomic = "VUID-vkCmdDrawIndirect-None-02691";
146 push_constants_set = "VUID-vkCmdDrawIndirect-None-02698";
147 image_subresources = "VUID-vkCmdDrawIndirect-None-04584";
148 descriptor_valid = "VUID-vkCmdDrawIndirect-None-02699";
149 sampler_imageview_type = "VUID-vkCmdDrawIndirect-None-02702";
150 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndirect-None-02703";
151 sampler_bias_offset = "VUID-vkCmdDrawIndirect-None-02704";
152 vertex_binding_attribute = "VUID-vkCmdDrawIndirect-None-02721";
153 dynamic_state_setting_commands = "VUID-vkCmdDrawIndirect-None-02859";
154 unprotected_command_buffer = "VUID-vkCmdDrawIndirect-commandBuffer-02707";
155 max_multiview_instance_index = "VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-02688";
156 filter_cubic = "VUID-vkCmdDrawIndirect-filterCubic-02694";
157 filter_cubic_min_max = "VUID-vkCmdDrawIndirect-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +0000158 viewport_count_primitive_shading_rate = "VUID-vkCmdDrawIndirect-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700159 }
160};
161
162struct DispatchVuidsCmdDrawIndexedIndirect : DrawDispatchVuid {
163 DispatchVuidsCmdDrawIndexedIndirect() : DrawDispatchVuid() {
164 queue_flag = "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool";
165 inside_renderpass = "VUID-vkCmdDrawIndexedIndirect-renderpass";
166 pipeline_bound = "VUID-vkCmdDrawIndexedIndirect-None-02700";
167 dynamic_state = "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701";
168 vertex_binding = "VUID-vkCmdDrawIndexedIndirect-None-04007";
169 vertex_binding_null = "VUID-vkCmdDrawIndexedIndirect-None-04008";
170 compatible_pipeline = "VUID-vkCmdDrawIndexedIndirect-None-02697";
171 render_pass_compatible = "VUID-vkCmdDrawIndexedIndirect-renderPass-02684";
172 subpass_index = "VUID-vkCmdDrawIndexedIndirect-subpass-02685";
173 sample_location = "VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689";
174 linear_sampler = "VUID-vkCmdDrawIndexedIndirect-magFilter-04553";
175 cubic_sampler = "VUID-vkCmdDrawIndexedIndirect-None-02692";
176 indirect_protected_cb = "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711";
177 indirect_contiguous_memory = "VUID-vkCmdDrawIndexedIndirect-buffer-02708";
178 indirect_buffer_bit = "VUID-vkCmdDrawIndexedIndirect-buffer-02709";
179 viewport_count = "VUID-vkCmdDrawIndexedIndirect-viewportCount-03417";
180 scissor_count = "VUID-vkCmdDrawIndexedIndirect-scissorCount-03418";
181 viewport_scissor_count = "VUID-vkCmdDrawIndexedIndirect-viewportCount-03419";
182 primitive_topology = "VUID-vkCmdDrawIndexedIndirect-primitiveTopology-03420";
183 corner_sampled_address_mode = "VUID-vkCmdDrawIndexedIndirect-flags-02696";
184 subpass_input = "VUID-vkCmdDrawIndexedIndirect-None-02686";
185 imageview_atomic = "VUID-vkCmdDrawIndexedIndirect-None-02691";
186 push_constants_set = "VUID-vkCmdDrawIndexedIndirect-None-02698";
187 image_subresources = "VUID-vkCmdDrawIndexedIndirect-None-04584";
188 descriptor_valid = "VUID-vkCmdDrawIndexedIndirect-None-02699";
189 sampler_imageview_type = "VUID-vkCmdDrawIndexedIndirect-None-02702";
190 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndexedIndirect-None-02703";
191 sampler_bias_offset = "VUID-vkCmdDrawIndexedIndirect-None-02704";
192 vertex_binding_attribute = "VUID-vkCmdDrawIndexedIndirect-None-02721";
193 dynamic_state_setting_commands = "VUID-vkCmdDrawIndexedIndirect-None-02859";
194 unprotected_command_buffer = "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02707";
195 max_multiview_instance_index = "VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-02688";
196 filter_cubic = "VUID-vkCmdDrawIndexedIndirect-filterCubic-02694";
197 filter_cubic_min_max = "VUID-vkCmdDrawIndexedIndirect-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +0000198 viewport_count_primitive_shading_rate = "VUID-vkCmdDrawIndexedIndirect-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700199 }
200};
201
202struct DispatchVuidsCmdDispatch : DrawDispatchVuid {
203 DispatchVuidsCmdDispatch() : DrawDispatchVuid() {
204 queue_flag = "VUID-vkCmdDispatch-commandBuffer-cmdpool";
205 inside_renderpass = "VUID-vkCmdDispatch-renderpass";
206 pipeline_bound = "VUID-vkCmdDispatch-None-02700";
207 compatible_pipeline = "VUID-vkCmdDispatch-None-02697";
208 linear_sampler = "VUID-vkCmdDispatch-magFilter-04553";
209 cubic_sampler = "VUID-vkCmdDispatch-None-02692";
210 corner_sampled_address_mode = "VUID-vkCmdDispatch-flags-02696";
211 imageview_atomic = "VUID-vkCmdDispatch-None-02691";
212 push_constants_set = "VUID-vkCmdDispatch-None-02698";
213 descriptor_valid = "VUID-vkCmdDispatch-None-02699";
214 sampler_imageview_type = "VUID-vkCmdDispatch-None-02702";
215 sampler_implicitLod_dref_proj = "VUID-vkCmdDispatch-None-02703";
216 sampler_bias_offset = "VUID-vkCmdDispatch-None-02704";
217 dynamic_state_setting_commands = "VUID-vkCmdDispatch-None-02859";
218 unprotected_command_buffer = "VUID-vkCmdDispatch-commandBuffer-02707";
219 protected_command_buffer = "VUID-vkCmdDispatch-commandBuffer-02712";
220 filter_cubic = "VUID-vkCmdDispatch-filterCubic-02694";
221 filter_cubic_min_max = "VUID-vkCmdDispatch-filterCubicMinmax-02695";
222 }
223};
224
225struct DispatchVuidsCmdDispatchIndirect : DrawDispatchVuid {
226 DispatchVuidsCmdDispatchIndirect() : DrawDispatchVuid() {
227 queue_flag = "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool";
228 inside_renderpass = "VUID-vkCmdDispatchIndirect-renderpass";
229 pipeline_bound = "VUID-vkCmdDispatchIndirect-None-02700";
230 compatible_pipeline = "VUID-vkCmdDispatchIndirect-None-02697";
231 linear_sampler = "VUID-vkCmdDispatchIndirect-magFilter-04553";
232 cubic_sampler = "VUID-vkCmdDispatchIndirect-None-02692";
233 indirect_protected_cb = "VUID-vkCmdDispatchIndirect-commandBuffer-02711";
234 indirect_contiguous_memory = "VUID-vkCmdDispatchIndirect-buffer-02708";
235 indirect_buffer_bit = "VUID-vkCmdDispatchIndirect-buffer-02709";
236 corner_sampled_address_mode = "VUID-vkCmdDispatchIndirect-flags-02696";
237 imageview_atomic = "VUID-vkCmdDispatchIndirect-None-02691";
238 push_constants_set = "VUID-vkCmdDispatchIndirect-None-02698";
239 descriptor_valid = "VUID-vkCmdDispatchIndirect-None-02699";
240 sampler_imageview_type = "VUID-vkCmdDispatchIndirect-None-02702";
241 sampler_implicitLod_dref_proj = "VUID-vkCmdDispatchIndirect-None-02703";
242 sampler_bias_offset = "VUID-vkCmdDispatchIndirect-None-02704";
243 dynamic_state_setting_commands = "VUID-vkCmdDispatchIndirect-None-02859";
244 unprotected_command_buffer = "VUID-vkCmdDispatchIndirect-commandBuffer-02707";
245 filter_cubic = "VUID-vkCmdDispatchIndirect-filterCubic-02694";
246 filter_cubic_min_max = "VUID-vkCmdDispatchIndirect-filterCubicMinmax-02695";
247 }
248};
249
250struct DispatchVuidsCmdDrawIndirectCount : DrawDispatchVuid {
251 DispatchVuidsCmdDrawIndirectCount() : DrawDispatchVuid() {
252 queue_flag = "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool";
253 inside_renderpass = "VUID-vkCmdDrawIndirectCount-renderpass";
254 pipeline_bound = "VUID-vkCmdDrawIndirectCount-None-02700";
255 dynamic_state = "VUID-vkCmdDrawIndirectCount-commandBuffer-02701";
256 vertex_binding = "VUID-vkCmdDrawIndirectCount-None-04007";
257 vertex_binding_null = "VUID-vkCmdDrawIndirectCount-None-04008";
258 compatible_pipeline = "VUID-vkCmdDrawIndirectCount-None-02697";
259 render_pass_compatible = "VUID-vkCmdDrawIndirectCount-renderPass-02684";
260 subpass_index = "VUID-vkCmdDrawIndirectCount-subpass-02685";
261 sample_location = "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689";
262 linear_sampler = "VUID-vkCmdDrawIndirectCount-magFilter-04553";
263 cubic_sampler = "VUID-vkCmdDrawIndirectCount-None-02692";
264 indirect_protected_cb = "VUID-vkCmdDrawIndirectCount-commandBuffer-02711";
265 indirect_contiguous_memory = "VUID-vkCmdDrawIndirectCount-buffer-02708";
266 indirect_buffer_bit = "VUID-vkCmdDrawIndirectCount-buffer-02709";
267 viewport_count = "VUID-vkCmdDrawIndirectCount-viewportCount-03417";
268 scissor_count = "VUID-vkCmdDrawIndirectCount-scissorCount-03418";
269 viewport_scissor_count = "VUID-vkCmdDrawIndirectCount-viewportCount-03419";
270 primitive_topology = "VUID-vkCmdDrawIndirectCount-primitiveTopology-03420";
271 corner_sampled_address_mode = "VUID-vkCmdDrawIndirectCount-flags-02696";
272 subpass_input = "VUID-vkCmdDrawIndirectCount-None-02686";
273 imageview_atomic = "VUID-vkCmdDrawIndirectCount-None-02691";
274 push_constants_set = "VUID-vkCmdDrawIndirectCount-None-02698";
275 image_subresources = "VUID-vkCmdDrawIndirectCount-None-04584";
276 descriptor_valid = "VUID-vkCmdDrawIndirectCount-None-02699";
277 sampler_imageview_type = "VUID-vkCmdDrawIndirectCount-None-02702";
278 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndirectCount-None-02703";
279 sampler_bias_offset = "VUID-vkCmdDrawIndirectCount-None-02704";
280 vertex_binding_attribute = "VUID-vkCmdDrawIndirectCount-None-02721";
281 dynamic_state_setting_commands = "VUID-vkCmdDrawIndirectCount-None-02859";
282 unprotected_command_buffer = "VUID-vkCmdDrawIndirectCount-commandBuffer-02707";
283 max_multiview_instance_index = "VUID-vkCmdDrawIndirectCount-maxMultiviewInstanceIndex-02688";
284 filter_cubic = "VUID-vkCmdDrawIndirectCount-filterCubic-02694";
285 filter_cubic_min_max = "VUID-vkCmdDrawIndirectCount-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +0000286 viewport_count_primitive_shading_rate = "VUID-vkCmdDrawIndirectCount-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700287 }
288};
289
290struct DispatchVuidsCmdDrawIndexedIndirectCount : DrawDispatchVuid {
291 DispatchVuidsCmdDrawIndexedIndirectCount() : DrawDispatchVuid() {
292 queue_flag = "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool";
293 inside_renderpass = "VUID-vkCmdDrawIndexedIndirectCount-renderpass";
294 pipeline_bound = "VUID-vkCmdDrawIndexedIndirectCount-None-02700";
295 dynamic_state = "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701";
296 vertex_binding = "VUID-vkCmdDrawIndexedIndirectCount-None-04007";
297 vertex_binding_null = "VUID-vkCmdDrawIndexedIndirectCount-None-04008";
298 compatible_pipeline = "VUID-vkCmdDrawIndexedIndirectCount-None-02697";
299 render_pass_compatible = "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684";
300 subpass_index = "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685";
301 sample_location = "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689";
302 linear_sampler = "VUID-vkCmdDrawIndexedIndirectCount-magFilter-04553";
303 cubic_sampler = "VUID-vkCmdDrawIndexedIndirectCount-None-02692";
304 indirect_protected_cb = "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711";
305 indirect_contiguous_memory = "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708";
306 indirect_buffer_bit = "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709";
307 viewport_count = "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03417";
308 scissor_count = "VUID-vkCmdDrawIndexedIndirectCount-scissorCount-03418";
309 viewport_scissor_count = "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03419";
310 primitive_topology = "VUID-vkCmdDrawIndexedIndirectCount-primitiveTopology-03420";
311 corner_sampled_address_mode = "VUID-vkCmdDrawIndexedIndirectCount-flags-02696";
312 subpass_input = "VUID-vkCmdDrawIndexedIndirectCount-None-02686";
313 imageview_atomic = "VUID-vkCmdDrawIndexedIndirectCount-None-02691";
314 push_constants_set = "VUID-vkCmdDrawIndexedIndirectCount-None-02698";
315 image_subresources = "VUID-vkCmdDrawIndexedIndirectCount-None-04584";
316 descriptor_valid = "VUID-vkCmdDrawIndexedIndirectCount-None-02699";
317 sampler_imageview_type = "VUID-vkCmdDrawIndexedIndirectCount-None-02702";
318 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndexedIndirectCount-None-02703";
319 sampler_bias_offset = "VUID-vkCmdDrawIndexedIndirectCount-None-02704";
320 vertex_binding_attribute = "VUID-vkCmdDrawIndexedIndirectCount-None-02721";
321 dynamic_state_setting_commands = "VUID-vkCmdDrawIndexedIndirectCount-None-02859";
322 unprotected_command_buffer = "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02707";
323 max_multiview_instance_index = "VUID-vkCmdDrawIndexedIndirectCount-maxMultiviewInstanceIndex-02688";
324 filter_cubic = "VUID-vkCmdDrawIndexedIndirectCount-filterCubic-02694";
325 filter_cubic_min_max = "VUID-vkCmdDrawIndexedIndirectCount-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +0000326 viewport_count_primitive_shading_rate = "VUID-vkCmdDrawIndexedIndirectCount-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700327 }
328};
329
330struct DispatchVuidsCmdTraceRaysNV: DrawDispatchVuid {
331 DispatchVuidsCmdTraceRaysNV() : DrawDispatchVuid() {
332 queue_flag = "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool";
333 inside_renderpass = "VUID-vkCmdTraceRaysNV-renderpass";
334 pipeline_bound = "VUID-vkCmdTraceRaysNV-None-02700";
335 dynamic_state = "VUID-vkCmdTraceRaysNV-commandBuffer-02701";
336 compatible_pipeline = "VUID-vkCmdTraceRaysNV-None-02697";
337 linear_sampler = "VUID-vkCmdTraceRaysNV-magFilter-04553";
338 cubic_sampler = "VUID-vkCmdTraceRaysNV-None-02692";
339 corner_sampled_address_mode = "VUID-vkCmdTraceRaysNV-flags-02696";
340 imageview_atomic = "VUID-vkCmdTraceRaysNV-None-02691";
341 push_constants_set = "VUID-vkCmdTraceRaysNV-None-02698";
342 descriptor_valid = "VUID-vkCmdTraceRaysNV-None-02699";
343 sampler_imageview_type = "VUID-vkCmdTraceRaysNV-None-02702";
344 sampler_implicitLod_dref_proj = "VUID-vkCmdTraceRaysNV-None-02703";
345 sampler_bias_offset = "VUID-vkCmdTraceRaysNV-None-02704";
346 dynamic_state_setting_commands = "VUID-vkCmdTraceRaysNV-None-02859";
347 unprotected_command_buffer = "VUID-vkCmdTraceRaysNV-commandBuffer-02707";
348 protected_command_buffer = "VUID-vkCmdTraceRaysNV-commandBuffer-02712";
349 filter_cubic = "VUID-vkCmdTraceRaysNV-filterCubic-02694";
350 filter_cubic_min_max = "VUID-vkCmdTraceRaysNV-filterCubicMinmax-02695";
351 }
352};
353
354struct DispatchVuidsCmdTraceRaysKHR: DrawDispatchVuid {
355 DispatchVuidsCmdTraceRaysKHR() : DrawDispatchVuid() {
356 queue_flag = "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool";
357 inside_renderpass = "VUID-vkCmdTraceRaysKHR-renderpass";
358 pipeline_bound = "VUID-vkCmdTraceRaysKHR-None-02700";
359 dynamic_state = "VUID-vkCmdTraceRaysKHR-commandBuffer-02701";
360 compatible_pipeline = "VUID-vkCmdTraceRaysKHR-None-02697";
361 linear_sampler = "VUID-vkCmdTraceRaysKHR-magFilter-04553";
362 cubic_sampler = "VUID-vkCmdTraceRaysKHR-None-02692";
363 corner_sampled_address_mode = "VUID-vkCmdTraceRaysKHR-flags-02696";
364 imageview_atomic = "VUID-vkCmdTraceRaysKHR-None-02691";
365 push_constants_set = "VUID-vkCmdTraceRaysKHR-None-02698";
366 descriptor_valid = "VUID-vkCmdTraceRaysKHR-None-02699";
367 sampler_imageview_type = "VUID-vkCmdTraceRaysKHR-None-02702";
368 sampler_implicitLod_dref_proj = "VUID-vkCmdTraceRaysKHR-None-02703";
369 sampler_bias_offset = "VUID-vkCmdTraceRaysKHR-None-02704";
370 dynamic_state_setting_commands = "VUID-vkCmdTraceRaysKHR-None-02859";
371 unprotected_command_buffer = "VUID-vkCmdTraceRaysKHR-commandBuffer-02707";
372 protected_command_buffer = "VUID-vkCmdTraceRaysKHR-commandBuffer-02712";
373 filter_cubic = "VUID-vkCmdTraceRaysKHR-filterCubic-02694";
374 filter_cubic_min_max = "VUID-vkCmdTraceRaysKHR-filterCubicMinmax-02695";
375 }
376};
377
378struct DispatchVuidsCmdTraceRaysIndirectKHR: DrawDispatchVuid {
379 DispatchVuidsCmdTraceRaysIndirectKHR() : DrawDispatchVuid() {
380 queue_flag = "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool";
381 inside_renderpass = "VUID-vkCmdTraceRaysIndirectKHR-renderpass";
382 pipeline_bound = "VUID-vkCmdTraceRaysIndirectKHR-None-02700";
383 dynamic_state = "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701";
384 compatible_pipeline = "VUID-vkCmdTraceRaysIndirectKHR-None-02697";
385 linear_sampler = "VUID-vkCmdTraceRaysIndirectKHR-magFilter-04553";
386 cubic_sampler = "VUID-vkCmdTraceRaysIndirectKHR-None-02692";
387 indirect_protected_cb = "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711";
388 indirect_contiguous_memory = "VUID-vkCmdTraceRaysIndirectKHR-buffer-02708";
389 indirect_buffer_bit = "VUID-vkCmdTraceRaysIndirectKHR-buffer-02709";
390 corner_sampled_address_mode = "VUID-vkCmdTraceRaysIndirectKHR-flags-02696";
391 imageview_atomic = "VUID-vkCmdTraceRaysIndirectKHR-None-02691";
392 push_constants_set = "VUID-vkCmdTraceRaysIndirectKHR-None-02698";
393 descriptor_valid = "VUID-vkCmdTraceRaysIndirectKHR-None-02699";
394 sampler_imageview_type = "VUID-vkCmdTraceRaysIndirectKHR-None-02702";
395 sampler_implicitLod_dref_proj = "VUID-vkCmdTraceRaysIndirectKHR-None-02703";
396 sampler_bias_offset = "VUID-vkCmdTraceRaysIndirectKHR-None-02704";
397 dynamic_state_setting_commands = "VUID-vkCmdTraceRaysIndirectKHR-None-02859";
398 unprotected_command_buffer = "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02707";
399 filter_cubic = "VUID-vkCmdTraceRaysIndirectKHR-filterCubic-02694";
400 filter_cubic_min_max = "VUID-vkCmdTraceRaysIndirectKHR-filterCubicMinmax-02695";
401 }
402};
403
404struct DispatchVuidsCmdDrawMeshTasksNV: DrawDispatchVuid {
405 DispatchVuidsCmdDrawMeshTasksNV() : DrawDispatchVuid() {
406 queue_flag = "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool";
407 inside_renderpass = "VUID-vkCmdDrawMeshTasksNV-renderpass";
408 pipeline_bound = "VUID-vkCmdDrawMeshTasksNV-None-02700";
409 dynamic_state = "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701";
410 compatible_pipeline = "VUID-vkCmdDrawMeshTasksNV-None-02697";
411 render_pass_compatible = "VUID-vkCmdDrawMeshTasksNV-renderPass-02684";
412 subpass_index = "VUID-vkCmdDrawMeshTasksNV-subpass-02685";
413 sample_location = "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689";
414 linear_sampler = "VUID-vkCmdDrawMeshTasksNV-magFilter-04553";
415 cubic_sampler = "VUID-vkCmdDrawMeshTasksNV-None-02692";
416 viewport_count = "VUID-vkCmdDrawMeshTasksNV-viewportCount-03417";
417 scissor_count = "VUID-vkCmdDrawMeshTasksNV-scissorCount-03418";
418 viewport_scissor_count = "VUID-vkCmdDrawMeshTasksNV-viewportCount-03419";
419 primitive_topology = "VUID-vkCmdDrawMeshTasksNV-primitiveTopology-03420";
420 corner_sampled_address_mode = "VUID-vkCmdDrawMeshTasksNV-flags-02696";
421 subpass_input = "VUID-vkCmdDrawMeshTasksNV-None-02686";
422 imageview_atomic = "VUID-vkCmdDrawMeshTasksNV-None-02691";
423 push_constants_set = "VUID-vkCmdDrawMeshTasksNV-None-02698";
424 image_subresources = "VUID-vkCmdDrawMeshTasksNV-None-04584";
425 descriptor_valid = "VUID-vkCmdDrawMeshTasksNV-None-02699";
426 sampler_imageview_type = "VUID-vkCmdDrawMeshTasksNV-None-02702";
427 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawMeshTasksNV-None-02703";
428 sampler_bias_offset = "VUID-vkCmdDrawMeshTasksNV-None-02704";
429 dynamic_state_setting_commands = "VUID-vkCmdDrawMeshTasksNV-None-02859";
430 unprotected_command_buffer = "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02707";
431 max_multiview_instance_index = "VUID-vkCmdDrawMeshTasksNV-maxMultiviewInstanceIndex-02688";
432 filter_cubic = "VUID-vkCmdDrawMeshTasksNV-filterCubic-02694";
433 filter_cubic_min_max = "VUID-vkCmdDrawMeshTasksNV-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +0000434 viewport_count_primitive_shading_rate = "VUID-vkCmdDrawMeshTasksNV-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700435 }
436};
437
438struct DispatchVuidsCmdDrawMeshTasksIndirectNV: DrawDispatchVuid {
439 DispatchVuidsCmdDrawMeshTasksIndirectNV() : DrawDispatchVuid() {
440 queue_flag = "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool";
441 inside_renderpass = "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass";
442 pipeline_bound = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700";
443 dynamic_state = "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701";
444 compatible_pipeline = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02697";
445 render_pass_compatible = "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684";
446 subpass_index = "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685";
447 sample_location = "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689";
448 linear_sampler = "VUID-vkCmdDrawMeshTasksIndirectNV-magFilter-04553";
449 cubic_sampler = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02692";
450 indirect_protected_cb = "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711";
451 indirect_contiguous_memory = "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708";
452 indirect_buffer_bit = "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709";
453 viewport_count = "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03417";
454 scissor_count = "VUID-vkCmdDrawMeshTasksIndirectNV-scissorCount-03418";
455 viewport_scissor_count = "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03419";
456 primitive_topology = "VUID-vkCmdDrawMeshTasksIndirectNV-primitiveTopology-03420";
457 corner_sampled_address_mode = "VUID-vkCmdDrawMeshTasksIndirectNV-flags-02696";
458 subpass_input = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02686";
459 imageview_atomic = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02691";
460 push_constants_set = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02698";
461 image_subresources = "VUID-vkCmdDrawMeshTasksIndirectNV-None-04584";
462 descriptor_valid = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02699";
463 sampler_imageview_type = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02702";
464 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02703";
465 sampler_bias_offset = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02704";
466 dynamic_state_setting_commands = "VUID-vkCmdDrawMeshTasksIndirectNV-None-02859";
467 unprotected_command_buffer = "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02707";
468 max_multiview_instance_index = "VUID-vkCmdDrawMeshTasksIndirectNV-maxMultiviewInstanceIndex-02688";
469 filter_cubic = "VUID-vkCmdDrawMeshTasksIndirectNV-filterCubic-02694";
470 filter_cubic_min_max = "VUID-vkCmdDrawMeshTasksIndirectNV-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +0000471 viewport_count_primitive_shading_rate = "VUID-vkCmdDrawMeshTasksIndirectNV-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700472 }
473};
474
475struct DispatchVuidsCmdDrawMeshTasksIndirectCountNV : DrawDispatchVuid {
476 DispatchVuidsCmdDrawMeshTasksIndirectCountNV() : DrawDispatchVuid() {
477 queue_flag = "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool";
478 inside_renderpass = "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass";
479 pipeline_bound = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700";
480 dynamic_state = "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701";
481 compatible_pipeline = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697";
482 render_pass_compatible = "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684";
483 subpass_index = "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685";
484 sample_location = "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689";
485 linear_sampler = "VUID-vkCmdDrawMeshTasksIndirectCountNV-magFilter-04553";
486 cubic_sampler = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692";
487 indirect_protected_cb = "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711";
488 indirect_contiguous_memory = "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708";
489 indirect_buffer_bit = "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709";
490 viewport_count = "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03417";
491 scissor_count = "VUID-vkCmdDrawMeshTasksIndirectCountNV-scissorCount-03418";
492 viewport_scissor_count = "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03419";
493 primitive_topology = "VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveTopology-03420";
494 corner_sampled_address_mode = "VUID-vkCmdDrawMeshTasksIndirectCountNV-flags-02696";
495 subpass_input = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02686";
496 imageview_atomic = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02691";
497 push_constants_set = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02698";
498 image_subresources = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-04584";
499 descriptor_valid = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02699";
500 sampler_imageview_type = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02702";
501 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02703";
502 sampler_bias_offset = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02704";
503 dynamic_state_setting_commands = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02859";
504 unprotected_command_buffer = "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02707";
505 max_multiview_instance_index = "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxMultiviewInstanceIndex-02688";
506 filter_cubic = "VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubic-02694";
507 filter_cubic_min_max = "VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +0000508 viewport_count_primitive_shading_rate = "VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700509 }
510};
511
512struct DispatchVuidsCmdDrawIndirectByteCountEXT: DrawDispatchVuid {
513 DispatchVuidsCmdDrawIndirectByteCountEXT() : DrawDispatchVuid() {
514 queue_flag = "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-cmdpool";
515 inside_renderpass = "VUID-vkCmdDrawIndirectByteCountEXT-renderpass";
516 pipeline_bound = "VUID-vkCmdDrawIndirectByteCountEXT-None-02700";
517 dynamic_state = "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02701";
518 vertex_binding = "VUID-vkCmdDrawIndirectByteCountEXT-None-04007";
519 vertex_binding_null = "VUID-vkCmdDrawIndirectByteCountEXT-None-04008";
520 compatible_pipeline = "VUID-vkCmdDrawIndirectByteCountEXT-None-02697";
521 render_pass_compatible = "VUID-vkCmdDrawIndirectByteCountEXT-renderPass-02684";
522 subpass_index = "VUID-vkCmdDrawIndirectByteCountEXT-subpass-02685";
523 sample_location = "VUID-vkCmdDrawIndirectByteCountEXT-sampleLocationsEnable-02689";
524 linear_sampler = "VUID-vkCmdDrawIndirectByteCountEXT-magFilter-04553";
525 cubic_sampler = "VUID-vkCmdDrawIndirectByteCountEXT-None-02692";
526 indirect_protected_cb = "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02646";
527 indirect_contiguous_memory = "UNASSIGNED-vkCmdDrawIndirectByteCountEXT-buffer", // TODO - Update when header are updated
528 indirect_buffer_bit = "VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-02290";
529 viewport_count = "VUID-vkCmdDrawIndirectByteCountEXT-viewportCount-03417";
530 scissor_count = "VUID-vkCmdDrawIndirectByteCountEXT-scissorCount-03418";
531 viewport_scissor_count = "VUID-vkCmdDrawIndirectByteCountEXT-viewportCount-03419";
532 primitive_topology = "VUID-vkCmdDrawIndirectByteCountEXT-primitiveTopology-03420";
533 corner_sampled_address_mode = "VUID-vkCmdDrawIndirectByteCountEXT-flags-02696";
534 subpass_input = "VUID-vkCmdDrawIndirectByteCountEXT-None-02686";
535 imageview_atomic = "VUID-vkCmdDrawIndirectByteCountEXT-None-02691";
536 push_constants_set = "VUID-vkCmdDrawIndirectByteCountEXT-None-02698";
537 image_subresources = "VUID-vkCmdDrawIndirectByteCountEXT-None-04584";
538 descriptor_valid = "VUID-vkCmdDrawIndirectByteCountEXT-None-02699";
539 sampler_imageview_type = "VUID-vkCmdDrawIndirectByteCountEXT-None-02702";
540 sampler_implicitLod_dref_proj = "VUID-vkCmdDrawIndirectByteCountEXT-None-02703";
541 sampler_bias_offset = "VUID-vkCmdDrawIndirectByteCountEXT-None-02704";
542 vertex_binding_attribute = "VUID-vkCmdDrawIndirectByteCountEXT-None-02721";
543 dynamic_state_setting_commands = "VUID-vkCmdDrawIndirectByteCountEXT-None-02859";
544 unprotected_command_buffer = "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02707";
545 max_multiview_instance_index = "VUID-vkCmdDrawIndirectByteCountEXT-maxMultiviewInstanceIndex-02688";
546 filter_cubic = "VUID-vkCmdDrawIndirectByteCountEXT-filterCubic-02694";
547 filter_cubic_min_max = "VUID-vkCmdDrawIndirectByteCountEXT-filterCubicMinmax-02695";
Tobias Hector6663c9b2020-11-05 10:18:02 +0000548 viewport_count_primitive_shading_rate = "VUID-vkCmdDrawIndirectByteCountEXT-primitiveFragmentShadingRateWithMultipleViewports-04552";
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700549 }
550};
551
552struct DispatchVuidsCmdDispatchBase: DrawDispatchVuid {
553 DispatchVuidsCmdDispatchBase() : DrawDispatchVuid() {
554 queue_flag = "VUID-vkCmdDispatchBase-commandBuffer-cmdpool";
555 inside_renderpass = "VUID-vkCmdDispatchBase-renderpass";
556 pipeline_bound = "VUID-vkCmdDispatchBase-None-02700";
557 compatible_pipeline = "VUID-vkCmdDispatchBase-None-02697";
558 linear_sampler = "VUID-vkCmdDispatchBase-magFilter-04553";
559 cubic_sampler = "VUID-vkCmdDispatchBase-None-02692";
560 corner_sampled_address_mode = "VUID-vkCmdDispatchBase-flags-02696";
561 imageview_atomic = "VUID-vkCmdDispatchBase-None-02691";
562 push_constants_set = "VUID-vkCmdDispatchBase-None-02698";
563 descriptor_valid = "VUID-vkCmdDispatchBase-None-02699";
564 sampler_imageview_type = "VUID-vkCmdDispatchBase-None-02702";
565 sampler_implicitLod_dref_proj = "VUID-vkCmdDispatchBase-None-02703";
566 sampler_bias_offset = "VUID-vkCmdDispatchBase-None-02704";
567 dynamic_state_setting_commands = "VUID-vkCmdDispatchBase-None-02859";
568 unprotected_command_buffer = "VUID-vkCmdDispatchBase-commandBuffer-02707";
569 filter_cubic = "VUID-vkCmdDispatchBase-filterCubic-02694";
570 filter_cubic_min_max = "VUID-vkCmdDispatchBase-filterCubicMinmax-02695";
571 }
572};
573
574// 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 -0700575static const std::map<CMD_TYPE, DrawDispatchVuid> drawdispatch_vuid = {
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700576 {CMD_DRAW, DispatchVuidsCmdDraw()},
577 {CMD_DRAWINDEXED, DispatchVuidsCmdDrawIndexed()},
578 {CMD_DRAWINDIRECT, DispatchVuidsCmdDrawIndirect()},
579 {CMD_DRAWINDEXEDINDIRECT, DispatchVuidsCmdDrawIndexedIndirect()},
580 {CMD_DISPATCH, DispatchVuidsCmdDispatch()},
581 {CMD_DISPATCHINDIRECT, DispatchVuidsCmdDispatchIndirect()},
582 {CMD_DRAWINDIRECTCOUNT, DispatchVuidsCmdDrawIndirectCount()},
583 {CMD_DRAWINDEXEDINDIRECTCOUNT, DispatchVuidsCmdDrawIndexedIndirectCount()},
584 {CMD_TRACERAYSNV, DispatchVuidsCmdTraceRaysNV()},
585 {CMD_TRACERAYSKHR, DispatchVuidsCmdTraceRaysKHR()},
586 {CMD_TRACERAYSINDIRECTKHR, DispatchVuidsCmdTraceRaysIndirectKHR()},
587 {CMD_DRAWMESHTASKSNV, DispatchVuidsCmdDrawMeshTasksNV()},
588 {CMD_DRAWMESHTASKSINDIRECTNV, DispatchVuidsCmdDrawMeshTasksIndirectNV()},
589 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, DispatchVuidsCmdDrawMeshTasksIndirectCountNV()},
590 {CMD_DRAWINDIRECTBYTECOUNTEXT, DispatchVuidsCmdDrawIndirectByteCountEXT()},
591 {CMD_DISPATCHBASE, DispatchVuidsCmdDispatchBase()},
Spencer Fricke507600b2020-03-22 13:23:06 -0700592 // Used if invalid cmd_type is used
Mark Lobodzinskiddf43612020-11-17 11:28:02 -0700593 {CMD_NONE, DrawDispatchVuid()}
Spencer Fricke507600b2020-03-22 13:23:06 -0700594};
595// clang-format on
596
597// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
598const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
599 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
600 return drawdispatch_vuid.at(cmd_type);
601 } else {
602 return drawdispatch_vuid.at(CMD_NONE);
603 }
604}
605
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700606// Generic function to handle validation for all CmdDraw* type functions
607bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700608 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700609 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700610 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600611 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700612 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700613 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700614 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700615 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
616 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
617 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700618 }
619 return skip;
620}
621
locke-lunarg3fa463a2020-10-23 16:39:04 -0600622bool CoreChecks::ValidateCmdDrawInstance(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance,
623 CMD_TYPE cmd_type, const char *caller) const {
624 bool skip = false;
625 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
626 const auto *cb_node = Get<CMD_BUFFER_STATE>(commandBuffer);
627 if (!cb_node) return skip;
628
629 // Verify maxMultiviewInstanceIndex
630 if (cb_node->activeRenderPass && cb_node->activeRenderPass->renderPass && enabled_features.multiview_features.multiview &&
631 ((instanceCount + firstInstance) > phys_dev_ext_props.multiview_props.maxMultiviewInstanceIndex)) {
632 LogObjectList objlist(commandBuffer);
633 objlist.add(cb_node->activeRenderPass->renderPass);
634 skip |= LogError(objlist, vuid.max_multiview_instance_index,
635 "%s: multiview is enabled, and maxMultiviewInstanceIndex: %" PRIu32 ", but instanceCount: %" PRIu32
636 "and firstInstance: %" PRIu32 ".",
637 caller, report_data->FormatHandle(cb_node->activeRenderPass->renderPass).c_str(),
638 phys_dev_ext_props.multiview_props.maxMultiviewInstanceIndex, instanceCount, firstInstance);
639 }
640 return skip;
641}
642
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700643bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500644 uint32_t firstVertex, uint32_t firstInstance) const {
locke-lunarg3fa463a2020-10-23 16:39:04 -0600645 bool skip = false;
646 skip |= ValidateCmdDrawInstance(commandBuffer, instanceCount, firstInstance, CMD_DRAW, "vkCmdDraw()");
647 skip |=
648 ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()", VK_QUEUE_GRAPHICS_BIT);
649 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700650}
651
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700652bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500653 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
locke-lunarg3fa463a2020-10-23 16:39:04 -0600654 bool skip = false;
655 skip |= ValidateCmdDrawInstance(commandBuffer, instanceCount, firstInstance, CMD_DRAWINDEXED, "vkCmdDrawIndexed()");
656 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
657 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500658 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700659 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
660 unsigned int index_size = 0;
661 const auto &index_buffer_binding = cb_state->index_buffer_binding;
662 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
663 index_size = 2;
664 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
665 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600666 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
667 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700668 }
669 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
670 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700671 skip |=
locke-lunarg1ae57d62020-11-18 10:49:19 -0700672 LogError(index_buffer_binding.buffer_state->buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700673 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
674 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
675 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
676 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700677 }
678 }
679 return skip;
680}
681
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700682bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
683 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700684 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700685 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600686 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700687 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()");
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700688 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600689 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
690 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700691 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
692 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), drawCount, offset,
693 buffer_state);
694 } else if ((drawCount == 1) && (offset + sizeof(VkDrawIndirectCommand)) > buffer_state->createInfo.size) {
695 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00487",
696 "CmdDrawIndirect: drawCount equals 1 and (offset + sizeof(VkDrawIndirectCommand)) (%u) is not less than "
697 "or equal to the size of buffer (%u).",
698 (offset + sizeof(VkDrawIndirectCommand)), buffer_state->createInfo.size);
Lockee68ac652019-05-06 10:17:33 -0600699 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700700 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
701 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
702 return skip;
703}
704
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700705bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700706 uint32_t drawCount, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700707 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
708 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600709 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700710 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()");
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700711 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600712 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
713 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
714 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
Tony-LunarGc0c3df52020-11-20 13:47:10 -0700715 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), drawCount,
716 offset, buffer_state);
717 } else if ((drawCount == 1) && (offset + sizeof(VkDrawIndexedIndirectCommand)) > buffer_state->createInfo.size) {
718 skip |= LogError(
719 commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00539",
720 "CmdDrawIndexedIndirect: drawCount equals 1 and (offset + sizeof(VkDrawIndexedIndirectCommand)) (%u) is not less than "
721 "or equal to the size of buffer (%u).",
722 (offset + sizeof(VkDrawIndexedIndirectCommand)), buffer_state->createInfo.size);
Lockee68ac652019-05-06 10:17:33 -0600723 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700724 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
725 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
726 // 'buffer'.
727 return skip;
728}
729
Jeff Bolz5c801d12019-10-09 10:38:45 -0500730bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600731 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600732 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700733 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600734 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700735}
736
locke-lunarg25b6c352020-08-06 17:44:18 -0600737bool CoreChecks::PreCallValidateCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
738 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
739 uint32_t groupCountZ) const {
740 bool skip = false;
741 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHBASE, "vkCmdDispatchBase()",
742 VK_QUEUE_COMPUTE_BIT);
743 return skip;
744}
745
746bool CoreChecks::PreCallValidateCmdDispatchBaseKHR(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
747 uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
748 uint32_t groupCountZ) const {
749 bool skip = false;
750 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHBASE, "vkCmdDispatchBaseKHR()",
751 VK_QUEUE_COMPUTE_BIT);
752 return skip;
753}
754
Jeff Bolz5c801d12019-10-09 10:38:45 -0500755bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700756 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700757 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700758 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700759 return skip;
760}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700761bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
762 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700763 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700764 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700765 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
Shannon McPherson2c793ba2020-08-28 12:13:24 -0600766 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-04445",
sfricke-samsung27c70722020-05-02 08:42:39 -0700767 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
768 "call this command.",
769 apiName);
770 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700771 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
772 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600773 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600774 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700775 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
776 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700777 }
778
Tony-LunarG83544c72020-01-17 12:30:19 -0700779 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700780 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600781 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700782 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECTCOUNT, apiName);
Tony-LunarG83544c72020-01-17 12:30:19 -0700783 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Tony-LunarG83544c72020-01-17 12:30:19 -0700784 skip |=
785 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
786 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700787 return skip;
788}
789
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700790bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
791 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
792 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700793 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700794 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700795}
796
797bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
798 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
799 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700800 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700801 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700802}
803
804bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
805 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700806 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700807 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700808 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
Shannon McPherson2c793ba2020-08-28 12:13:24 -0600809 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-None-04445",
sfricke-samsung27c70722020-05-02 08:42:39 -0700810 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
811 "call this command.",
812 apiName);
813 }
sfricke-samsungf692b972020-05-02 08:00:45 -0700814 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
815 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600816 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600817 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800818 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700819 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700820 }
821
sfricke-samsungf692b972020-05-02 08:00:45 -0700822 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
823 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600824 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700825 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName);
sfricke-samsungf692b972020-05-02 08:00:45 -0700826 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700827 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700828 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800829 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700830 return skip;
831}
832
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700833bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
834 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
835 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700836 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
837 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700838}
839
840bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
841 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
842 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700843 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
844 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700845}
846
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600847bool CoreChecks::PreCallValidateCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount,
848 uint32_t firstInstance, VkBuffer counterBuffer,
849 VkDeviceSize counterBufferOffset, uint32_t counterOffset,
850 uint32_t vertexStride) const {
sfricke-samsungd5e9adb2020-10-26 03:59:29 -0700851 bool skip = false;
locke-lunarg3fa463a2020-10-23 16:39:04 -0600852 skip |= ValidateCmdDrawInstance(commandBuffer, instanceCount, firstInstance, CMD_DRAWINDIRECTBYTECOUNTEXT,
853 "vkCmdDrawIndirectByteCountEXT()");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -0700854 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTBYTECOUNTEXT,
855 "vkCmdDrawIndirectByteCountEXT()", VK_QUEUE_GRAPHICS_BIT);
856 skip |= ValidateIndirectCmd(commandBuffer, counterBuffer, CMD_DRAWINDIRECTBYTECOUNTEXT, "vkCmdDrawIndirectByteCountEXT()");
857 return skip;
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600858}
859
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500860bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
861 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
862 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
863 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
864 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
865 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
866 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700867 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
868 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
sourav parmard1521802020-06-07 21:49:02 -0700869 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
870 skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
871 auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
872 if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
873 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
874 "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
875 " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
876 callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
877 }
878 auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
879 if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
880 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
881 "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
882 " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
883 hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
884 }
885 auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
886 if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
887 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
888 "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
baldurk751594b2020-09-09 09:41:02 +0100889 " must be less than the size of missShaderBindingTableBuffer %" PRIu64 " .",
sourav parmard1521802020-06-07 21:49:02 -0700890 missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
891 }
892 auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
893 if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
894 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
895 "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
baldurk751594b2020-09-09 09:41:02 +0100896 " must be less than the size of raygenShaderBindingTableBuffer %" PRIu64 " .",
sourav parmard1521802020-06-07 21:49:02 -0700897 raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
898 }
sourav parmarcd5fb182020-07-17 12:58:44 -0700899
900 for (const auto &object : cb_state->object_bindings) {
901 if (object.type == kVulkanObjectTypePipeline) {
902 auto pipeline_state = object.node ? (PIPELINE_STATE *)object.node : GetPipelineState(object.Cast<VkPipeline>());
903 const auto &pipeline_state_bind_point =
904 pipeline_state ? pipeline_state->getPipelineType() : VK_PIPELINE_BIND_POINT_MAX_ENUM;
905 if (!pipeline_state || (pipeline_state && !pipeline_state->pipeline) ||
906 pipeline_state_bind_point != VK_PIPELINE_BIND_POINT_RAY_TRACING_NV) {
907 skip |=
908 LogError(device, "VUID-vkCmdTraceRaysNV-None-02700",
909 "vkCmdTraceRaysNV: A valid pipeline must be bound to the pipeline bind point used by this command.");
910 }
911 }
912 }
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500913 return skip;
914}
915
Jason Macnak67407e72019-07-11 11:05:09 -0700916void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
917 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
918 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
919 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
920 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
921 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
922 uint32_t width, uint32_t height, uint32_t depth) {
923 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
locke-lunarg540b2252020-08-03 13:23:36 -0600924 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, "vkCmdTraceRaysNV()");
Jason Macnak67407e72019-07-11 11:05:09 -0700925 cb_state->hasTraceRaysCmd = true;
926}
927
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500928bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700929 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
930 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
931 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
932 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500933 uint32_t height, uint32_t depth) const {
934 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
935 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
sourav parmarcd5fb182020-07-17 12:58:44 -0700936 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Shannon McPherson9caca052020-11-25 11:34:38 -0700937 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
938 const PIPELINE_STATE *pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
sourav parmarcd5fb182020-07-17 12:58:44 -0700939 if (!pipeline_state || (pipeline_state && !pipeline_state->pipeline)) {
940 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-None-02700",
941 "vkCmdTraceRaysKHR: A valid pipeline must be bound to the pipeline bind point used by this command.");
942 } else { // bound to valid RT pipeline
943 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR) {
944 if (!pHitShaderBindingTable->deviceAddress) {
945 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03697",
946 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with flags "
947 "that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, the "
948 "deviceAddress member of pHitShaderBindingTable must not be zero.");
949 }
950 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
951 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03514",
952 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with "
953 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, "
954 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
955 "execute an intersection shader must not be set to zero.");
956 }
957 }
958 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR) {
959 if (!pHitShaderBindingTable->deviceAddress) {
960 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03696",
961 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with flags "
962 "that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, the "
963 "deviceAddress member of pHitShaderBindingTable must not be zero.");
964 }
965 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
966 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03513",
967 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with "
968 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, "
969 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
970 "execute a closest hit shader must not be set to zero.");
971 }
972 }
973 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR) {
974 if (!pHitShaderBindingTable->deviceAddress) {
975 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03695",
976 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with flags "
977 "that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, the "
978 "deviceAddress member of pHitShaderBindingTable must not be zero.");
979 }
980 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
981 skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-flags-03512",
982 "vkCmdTraceRaysKHR: If the currently bound ray tracing pipeline was created with "
983 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, "
984 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
985 "execute an any hit shader must not be set to zero.");
986 }
987 }
988 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500989 return skip;
990}
991
992void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -0700993 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
994 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
995 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
996 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable, uint32_t width,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500997 uint32_t height, uint32_t depth) {
998 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
locke-lunarg540b2252020-08-03 13:23:36 -0600999 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, "vkCmdTraceRaysKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001000 cb_state->hasTraceRaysCmd = true;
1001}
1002
1003bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -07001004 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
1005 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
1006 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
1007 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
1008 VkDeviceAddress indirectDeviceAddress) const {
sfricke-samsung0c45edc2020-07-01 22:19:53 -07001009 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSINDIRECTKHR,
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001010 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
sourav parmarcd5fb182020-07-17 12:58:44 -07001011 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Shannon McPherson9caca052020-11-25 11:34:38 -07001012 const auto lv_bind_point = ConvertToLvlBindPoint(VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
1013 const PIPELINE_STATE *pipeline_state = cb_state->lastBound[lv_bind_point].pipeline_state;
sourav parmarcd5fb182020-07-17 12:58:44 -07001014 if (!pipeline_state || (pipeline_state && !pipeline_state->pipeline)) {
1015 skip |=
1016 LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
1017 "vkCmdTraceRaysIndirectKHR: A valid pipeline must be bound to the pipeline bind point used by this command.");
1018 } else { // valid bind point
1019 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR) {
1020 if (!pHitShaderBindingTable || pHitShaderBindingTable->deviceAddress == 0) {
1021 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03697",
1022 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1023 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, the "
1024 "deviceAddress member of pHitShaderBindingTable must not be zero.");
1025 }
1026 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
1027 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03514",
1028 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1029 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, "
1030 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
1031 "execute an intersection shader must not be set to zero.");
1032 }
1033 }
1034 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR) {
1035 if (!pHitShaderBindingTable || pHitShaderBindingTable->deviceAddress == 0) {
1036 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03696",
1037 "vkCmdTraceRaysIndirectKHR:If the currently bound ray tracing pipeline was created with "
1038 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, "
1039 "the deviceAddress member of pHitShaderBindingTable must not be zero.");
1040 }
1041 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
1042 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03513",
1043 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1044 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, "
1045 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
1046 "execute a closest hit shader must not be set to zero.");
1047 }
1048 }
1049 if (pipeline_state->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR) {
1050 if (!pHitShaderBindingTable || pHitShaderBindingTable->deviceAddress == 0) {
1051 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03695",
1052 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1053 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, the "
1054 "deviceAddress member of pHitShaderBindingTable must not be zero.");
1055 }
1056 if (!pHitShaderBindingTable || pHitShaderBindingTable->size == 0 || pHitShaderBindingTable->stride == 0) {
1057 skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-flags-03512",
1058 "vkCmdTraceRaysIndirectKHR: If the currently bound ray tracing pipeline was created with "
1059 "flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, "
1060 "entries in pHitShaderBindingTable accessed as a result of this command in order to "
1061 "execute an any hit shader must not be set to zero.");
1062 }
1063 }
1064 }
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001065 return skip;
1066}
1067
1068void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
sourav parmarcd5fb182020-07-17 12:58:44 -07001069 const VkStridedDeviceAddressRegionKHR *pRaygenShaderBindingTable,
1070 const VkStridedDeviceAddressRegionKHR *pMissShaderBindingTable,
1071 const VkStridedDeviceAddressRegionKHR *pHitShaderBindingTable,
1072 const VkStridedDeviceAddressRegionKHR *pCallableShaderBindingTable,
Shannon McPherson54e1f892020-11-27 11:04:19 -07001073 VkDeviceAddress indirectDeviceAddress) {
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001074 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
locke-lunarg540b2252020-08-03 13:23:36 -06001075 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR,
1076 "vkCmdTraceRaysIndirectKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001077 cb_state->hasTraceRaysCmd = true;
Jeff Bolz443c2ca2020-03-19 12:11:51 -05001078}
1079
Jeff Bolz5c801d12019-10-09 10:38:45 -05001080bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -07001081 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
1082 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001083 return skip;
1084}
1085
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001086bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001087 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001088 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -07001089 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -06001090 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -07001091 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTNV, "vkCmdDrawMeshTasksIndirectNV()");
Lockee68ac652019-05-06 10:17:33 -06001092 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -06001093 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
1094 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
1095 drawCount, offset, buffer_state);
1096 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001097 return skip;
1098}
1099
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001100bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
1101 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -05001102 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -07001103 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -07001104 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -06001105 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
1106 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -07001107 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTCOUNTNV, "vkCmdDrawMeshTasksIndirectCountNV()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001108 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -06001109 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -07001110 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -07001111 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
1112 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -06001113 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
1114 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
1115 if (maxDrawCount > 1) {
1116 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
1117 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
1118 maxDrawCount, offset, buffer_state);
1119 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001120 return skip;
1121}