blob: 3d5e86669f05dc7bf1b41041c014b58eb6c4185f [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>
Jasper St. Pierre512613a2019-04-08 16:25:23 -070037 */
38
Jasper St. Pierre512613a2019-04-08 16:25:23 -070039#include "chassis.h"
40#include "core_validation.h"
41
Spencer Fricke507600b2020-03-22 13:23:06 -070042// This LUT is created to allow a static listing of each VUID that is covered by drawdispatch commands
43// clang-format off
44static const std::map<CMD_TYPE, DrawDispatchVuid> drawdispatch_vuid = {
45 {CMD_DRAW, {
46 "VUID-vkCmdDraw-commandBuffer-cmdpool",
47 "VUID-vkCmdDraw-renderpass",
48 "VUID-vkCmdDraw-None-02700",
49 "VUID-vkCmdDraw-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050050 "VUID-vkCmdDraw-None-04007",
51 "VUID-vkCmdDraw-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070052 "VUID-vkCmdDraw-None-02697",
53 "VUID-vkCmdDraw-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070054 "VUID-vkCmdDraw-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060055 "VUID-vkCmdDraw-sampleLocationsEnable-02689",
56 "VUID-vkCmdDraw-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -070057 "VUID-vkCmdDraw-None-02692",
58 kVUIDUndefined, // indirect_protected_cb
59 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -060060 kVUIDUndefined, // indirect_buffer_bit
61 "VUID-vkCmdDraw-viewportCount-03417",
62 "VUID-vkCmdDraw-scissorCount-03418",
63 "VUID-vkCmdDraw-viewportCount-03419",
64 "VUID-vkCmdDraw-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -060065 "VUID-vkCmdDraw-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -070066 }},
67 {CMD_DRAWINDEXED, {
68 "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
69 "VUID-vkCmdDrawIndexed-renderpass",
70 "VUID-vkCmdDrawIndexed-None-02700",
71 "VUID-vkCmdDrawIndexed-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050072 "VUID-vkCmdDrawIndexed-None-04007",
73 "VUID-vkCmdDrawIndexed-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070074 "VUID-vkCmdDrawIndexed-None-02697",
75 "VUID-vkCmdDrawIndexed-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070076 "VUID-vkCmdDrawIndexed-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060077 "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689",
78 "VUID-vkCmdDrawIndexed-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -070079 "VUID-vkCmdDrawIndexed-None-02692",
80 kVUIDUndefined, // indirect_protected_cb
81 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -060082 kVUIDUndefined, // indirect_buffer_bit
83 "VUID-vkCmdDrawIndexed-viewportCount-03417",
84 "VUID-vkCmdDrawIndexed-scissorCount-03418",
85 "VUID-vkCmdDrawIndexed-viewportCount-03419",
86 "VUID-vkCmdDrawIndexed-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -060087 "VUID-vkCmdDrawIndexed-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -070088 }},
89 {CMD_DRAWINDIRECT, {
90 "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
91 "VUID-vkCmdDrawIndirect-renderpass",
92 "VUID-vkCmdDrawIndirect-None-02700",
93 "VUID-vkCmdDrawIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050094 "VUID-vkCmdDrawIndirect-None-04007",
95 "VUID-vkCmdDrawIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070096 "VUID-vkCmdDrawIndirect-None-02697",
97 "VUID-vkCmdDrawIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070098 "VUID-vkCmdDrawIndirect-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060099 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689",
100 "VUID-vkCmdDrawIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700101 "VUID-vkCmdDrawIndirect-None-02692",
102 "VUID-vkCmdDrawIndirect-commandBuffer-02711",
103 "VUID-vkCmdDrawIndirect-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600104 "VUID-vkCmdDrawIndirect-buffer-02709",
105 "VUID-vkCmdDrawIndirect-viewportCount-03417",
106 "VUID-vkCmdDrawIndirect-scissorCount-03418",
107 "VUID-vkCmdDrawIndirect-viewportCount-03419",
108 "VUID-vkCmdDrawIndirect-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600109 "VUID-vkCmdDrawIndirect-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700110 }},
111 {CMD_DRAWINDEXEDINDIRECT, {
112 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool",
113 "VUID-vkCmdDrawIndexedIndirect-renderpass",
114 "VUID-vkCmdDrawIndexedIndirect-None-02700",
115 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500116 "VUID-vkCmdDrawIndexedIndirect-None-04007",
117 "VUID-vkCmdDrawIndexedIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700118 "VUID-vkCmdDrawIndexedIndirect-None-02697",
119 "VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700120 "VUID-vkCmdDrawIndexedIndirect-subpass-02685",
Mark Lobodzinski2f084472020-06-18 16:33:57 -0600121 "VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600122 "VUID-vkCmdDrawIndexedIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700123 "VUID-vkCmdDrawIndexedIndirect-None-02692",
124 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711",
125 "VUID-vkCmdDrawIndexedIndirect-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600126 "VUID-vkCmdDrawIndexedIndirect-buffer-02709",
127 "VUID-vkCmdDrawIndexedIndirect-viewportCount-03417",
128 "VUID-vkCmdDrawIndexedIndirect-scissorCount-03418",
129 "VUID-vkCmdDrawIndexedIndirect-viewportCount-03419",
130 "VUID-vkCmdDrawIndexedIndirect-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600131 "VUID-vkCmdDrawIndexedIndirect-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700132 }},
133 {CMD_DISPATCH, {
134 "VUID-vkCmdDispatch-commandBuffer-cmdpool",
135 "VUID-vkCmdDispatch-renderpass",
136 "VUID-vkCmdDispatch-None-02700",
137 kVUIDUndefined, // dynamic_state
138 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500139 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700140 "VUID-vkCmdDispatch-None-02697",
141 kVUIDUndefined, // render_pass_compatible
142 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700143 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600144 "VUID-vkCmdDispatch-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700145 "VUID-vkCmdDispatch-None-02692",
146 kVUIDUndefined, // indirect_protected_cb
147 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600148 kVUIDUndefined, // indirect_buffer_bit
149 kVUIDUndefined, // viewport_count
150 kVUIDUndefined, // scissor_count
151 kVUIDUndefined, // viewport_scissor_count
152 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600153 "VUID-vkCmdDispatch-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700154 }},
155 {CMD_DISPATCHINDIRECT, {
156 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
157 "VUID-vkCmdDispatchIndirect-renderpass",
158 "VUID-vkCmdDispatchIndirect-None-02700",
159 kVUIDUndefined, // dynamic_state
160 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500161 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700162 "VUID-vkCmdDispatchIndirect-None-02697",
163 kVUIDUndefined, // render_pass_compatible
164 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700165 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600166 "VUID-vkCmdDispatchIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700167 "VUID-vkCmdDispatchIndirect-None-02692",
168 "VUID-vkCmdDispatchIndirect-commandBuffer-02711",
169 "VUID-vkCmdDispatchIndirect-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600170 "VUID-vkCmdDispatchIndirect-buffer-02709",
171 kVUIDUndefined, // viewport_count
172 kVUIDUndefined, // scissor_count
173 kVUIDUndefined, // viewport_scissor_count
174 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600175 "VUID-vkCmdDispatchIndirect-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700176 }},
177 {CMD_DRAWINDIRECTCOUNT, {
178 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
179 "VUID-vkCmdDrawIndirectCount-renderpass",
180 "VUID-vkCmdDrawIndirectCount-None-02700",
181 "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500182 "VUID-vkCmdDrawIndirectCount-None-04007",
183 "VUID-vkCmdDrawIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700184 "VUID-vkCmdDrawIndirectCount-None-02697",
185 "VUID-vkCmdDrawIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700186 "VUID-vkCmdDrawIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600187 "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689",
188 "VUID-vkCmdDrawIndirectCount-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700189 "VUID-vkCmdDrawIndirectCount-None-02692",
190 "VUID-vkCmdDrawIndirectCount-commandBuffer-02711",
191 "VUID-vkCmdDrawIndirectCount-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600192 "VUID-vkCmdDrawIndirectCount-buffer-02709",
193 "VUID-vkCmdDrawIndirectCount-viewportCount-03417",
194 "VUID-vkCmdDrawIndirectCount-scissorCount-03418",
195 "VUID-vkCmdDrawIndirectCount-viewportCount-03419",
196 "VUID-vkCmdDrawIndirectCount-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600197 "VUID-vkCmdDrawIndirectCount-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700198 }},
199 {CMD_DRAWINDEXEDINDIRECTCOUNT,{
200 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
201 "VUID-vkCmdDrawIndexedIndirectCount-renderpass",
202 "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
203 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500204 "VUID-vkCmdDrawIndexedIndirectCount-None-04007",
205 "VUID-vkCmdDrawIndexedIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700206 "VUID-vkCmdDrawIndexedIndirectCount-None-02697",
207 "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700208 "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600209 "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689",
210 "VUID-vkCmdDrawIndexedIndirectCount-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700211 "VUID-vkCmdDrawIndexedIndirectCount-None-02692",
212 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711",
213 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600214 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709",
215 "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03417",
216 "VUID-vkCmdDrawIndexedIndirectCount-scissorCount-03418",
217 "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03419",
218 "VUID-vkCmdDrawIndexedIndirectCount-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600219 "VUID-vkCmdDrawIndexedIndirectCount-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700220 }},
221 {CMD_TRACERAYSNV, {
222 "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool",
223 "VUID-vkCmdTraceRaysNV-renderpass",
224 "VUID-vkCmdTraceRaysNV-None-02700",
225 "VUID-vkCmdTraceRaysNV-commandBuffer-02701",
226 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500227 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700228 "VUID-vkCmdTraceRaysNV-None-02697",
229 kVUIDUndefined, // render_pass_compatible
230 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700231 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600232 "VUID-vkCmdTraceRaysNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700233 "VUID-vkCmdTraceRaysNV-None-02692",
234 kVUIDUndefined, // indirect_protected_cb
235 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600236 kVUIDUndefined, // indirect_buffer_bit
237 kVUIDUndefined, // viewport_count
238 kVUIDUndefined, // scissor_count
239 kVUIDUndefined, // viewport_scissor_count
240 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600241 "VUID-vkCmdTraceRaysNV-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700242 }},
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500243 {CMD_TRACERAYSKHR, {
244 "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool",
245 "VUID-vkCmdTraceRaysKHR-renderpass",
246 "VUID-vkCmdTraceRaysKHR-None-02700",
247 "VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
248 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500249 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500250 "VUID-vkCmdTraceRaysKHR-None-02697",
251 kVUIDUndefined, // render_pass_compatible
252 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700253 kVUIDUndefined, // sample_location
Jeremy Kniager38162652020-06-25 14:05:03 -0600254 "VUID-vkCmdTraceRaysKHR-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700255 "VUID-vkCmdTraceRaysKHR-None-02692",
256 kVUIDUndefined, // indirect_protected_cb
257 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600258 kVUIDUndefined, // indirect_buffer_bit
259 kVUIDUndefined, // viewport_count
260 kVUIDUndefined, // scissor_count
261 kVUIDUndefined, // viewport_scissor_count
262 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600263 "VUID-vkCmdTraceRaysKHR-flags-02696",
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500264 }},
265 {CMD_TRACERAYSINDIRECTKHR, {
266 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool",
267 "VUID-vkCmdTraceRaysIndirectKHR-renderpass",
268 "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
269 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
270 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500271 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500272 "VUID-vkCmdTraceRaysIndirectKHR-None-02697",
273 kVUIDUndefined, // render_pass_compatible
274 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700275 kVUIDUndefined, // sample_location
Jeremy Kniager38162652020-06-25 14:05:03 -0600276 "VUID-vkCmdTraceRaysIndirectKHR-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700277 "VUID-vkCmdTraceRaysIndirectKHR-None-02692",
278 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711",
279 "VUID-vkCmdTraceRaysIndirectKHR-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600280 "VUID-vkCmdTraceRaysIndirectKHR-buffer-02709",
281 kVUIDUndefined, // viewport_count
282 kVUIDUndefined, // scissor_count
283 kVUIDUndefined, // viewport_scissor_count
284 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600285 "VUID-vkCmdTraceRaysIndirectKHR-flags-02696",
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500286 }},
Spencer Fricke507600b2020-03-22 13:23:06 -0700287 {CMD_DRAWMESHTASKSNV, {
288 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool",
289 "VUID-vkCmdDrawMeshTasksNV-renderpass",
290 "VUID-vkCmdDrawMeshTasksNV-None-02700",
291 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
292 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500293 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700294 "VUID-vkCmdDrawMeshTasksNV-None-02697",
295 "VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700296 "VUID-vkCmdDrawMeshTasksNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600297 "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689",
298 "VUID-vkCmdDrawMeshTasksNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700299 "VUID-vkCmdDrawMeshTasksNV-None-02692",
300 kVUIDUndefined, // indirect_protected_cb
301 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600302 kVUIDUndefined, // indirect_buffer_bit
303 "VUID-vkCmdDrawMeshTasksNV-viewportCount-03417",
304 "VUID-vkCmdDrawMeshTasksNV-scissorCount-03418",
305 "VUID-vkCmdDrawMeshTasksNV-viewportCount-03419",
306 "VUID-vkCmdDrawMeshTasksNV-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600307 "VUID-vkCmdDrawMeshTasksNV-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700308 }},
309 {CMD_DRAWMESHTASKSINDIRECTNV, {
310 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
311 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass",
312 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
313 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701",
314 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500315 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700316 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02697",
317 "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700318 "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600319 "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689",
320 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700321 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02692",
322 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711",
323 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600324 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709",
325 "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03417",
326 "VUID-vkCmdDrawMeshTasksIndirectNV-scissorCount-03418",
327 "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03419",
328 "VUID-vkCmdDrawMeshTasksIndirectNV-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600329 "VUID-vkCmdDrawMeshTasksIndirectNV-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700330 }},
331 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, {
332 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
333 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
334 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
335 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
336 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500337 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700338 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697",
339 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700340 "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600341 "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689",
342 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700343 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692",
344 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711",
345 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600346 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709",
347 "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03417",
348 "VUID-vkCmdDrawMeshTasksIndirectCountNV-scissorCount-03418",
349 "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03419",
350 "VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600351 "VUID-vkCmdDrawMeshTasksIndirectCountNV-flags-02696",
Spencer Fricke507600b2020-03-22 13:23:06 -0700352 }},
353 // Used if invalid cmd_type is used
Piers Daniell39842ee2020-07-10 16:42:33 -0600354 {CMD_NONE, {
355 kVUIDUndefined,
356 kVUIDUndefined,
357 kVUIDUndefined,
358 kVUIDUndefined,
359 kVUIDUndefined,
360 kVUIDUndefined,
361 kVUIDUndefined,
362 kVUIDUndefined,
363 kVUIDUndefined,
364 kVUIDUndefined,
365 kVUIDUndefined,
366 kVUIDUndefined,
367 kVUIDUndefined,
368 kVUIDUndefined,
369 kVUIDUndefined,
370 kVUIDUndefined,
371 kVUIDUndefined,
372 kVUIDUndefined,
373 kVUIDUndefined,
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600374 kVUIDUndefined,
Piers Daniell39842ee2020-07-10 16:42:33 -0600375 }}
Spencer Fricke507600b2020-03-22 13:23:06 -0700376};
377// clang-format on
378
379// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
380const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
381 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
382 return drawdispatch_vuid.at(cmd_type);
383 } else {
384 return drawdispatch_vuid.at(CMD_NONE);
385 }
386}
387
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700388// Generic function to handle validation for all CmdDraw* type functions
389bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700390 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700391 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700392 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600393 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700394 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700395 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700396 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700397 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
398 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
399 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700400 }
401 return skip;
402}
403
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700404bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500405 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700406 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700407 VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700408}
409
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700410bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500411 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700412 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700413 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500414 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700415 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
416 unsigned int index_size = 0;
417 const auto &index_buffer_binding = cb_state->index_buffer_binding;
418 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
419 index_size = 2;
420 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
421 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600422 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
423 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700424 }
425 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
426 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700427 skip |=
428 LogError(index_buffer_binding.buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
429 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
430 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
431 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
432 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700433 }
434 }
435 return skip;
436}
437
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700438bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500439 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700440 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700441 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600442 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700443 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600444 if (count > 1) {
445 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
446 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
447 skip |=
448 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
449 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
450 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700451 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
452 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
453 return skip;
454}
455
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700456bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500457 uint32_t count, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700458 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
459 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600460 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700461 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600462 if (count > 1) {
463 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
464 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
465 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
466 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
467 buffer_state);
468 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700469 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
470 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
471 // 'buffer'.
472 return skip;
473}
474
Jeff Bolz5c801d12019-10-09 10:38:45 -0500475bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600476 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600477 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700478 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600479 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700480}
481
Jeff Bolz5c801d12019-10-09 10:38:45 -0500482bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700483 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700484 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700485 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700486 return skip;
487}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700488bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
489 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700490 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700491 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700492 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
493 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-02836",
494 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
495 "call this command.",
496 apiName);
497 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700498 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
499 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600500 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600501 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700502 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
503 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700504 }
505
Tony-LunarG83544c72020-01-17 12:30:19 -0700506 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700507 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600508 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700509 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECTCOUNT, apiName);
Tony-LunarG83544c72020-01-17 12:30:19 -0700510 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Tony-LunarG83544c72020-01-17 12:30:19 -0700511 skip |=
512 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
513 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700514 return skip;
515}
516
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700517bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
518 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
519 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700520 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700521 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700522}
523
524bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
525 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
526 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700527 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700528 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700529}
530
531bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
532 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700533 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700534 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700535 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
536 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-None-02837",
537 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
538 "call this command.",
539 apiName);
540 }
sfricke-samsungf692b972020-05-02 08:00:45 -0700541 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
542 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600543 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600544 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800545 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700546 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700547 }
548
sfricke-samsungf692b972020-05-02 08:00:45 -0700549 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
550 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600551 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700552 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName);
sfricke-samsungf692b972020-05-02 08:00:45 -0700553 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700554 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700555 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800556 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700557 return skip;
558}
559
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700560bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
561 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
562 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700563 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
564 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700565}
566
567bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
568 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
569 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700570 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
571 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700572}
573
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500574bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
575 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
576 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
577 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
578 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
579 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
580 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700581 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
582 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
sourav parmard1521802020-06-07 21:49:02 -0700583 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
584 skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
585 auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
586 if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
587 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
588 "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
589 " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
590 callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
591 }
592 auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
593 if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
594 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
595 "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
596 " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
597 hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
598 }
599 auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
600 if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
601 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
602 "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
603 " must be less than the size of missShaderBindingTableBuffer" PRIu64 " .",
604 missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
605 }
606 auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
607 if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
608 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
609 "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
610 " must be less than the size of raygenShaderBindingTableBuffer" PRIu64 " .",
611 raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
612 }
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500613 return skip;
614}
615
Jason Macnak67407e72019-07-11 11:05:09 -0700616void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
617 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
618 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
619 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
620 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
621 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
622 uint32_t width, uint32_t height, uint32_t depth) {
623 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600624 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jason Macnak67407e72019-07-11 11:05:09 -0700625 cb_state->hasTraceRaysCmd = true;
626}
627
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500628bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
629 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
630 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
631 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
632 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
633 uint32_t height, uint32_t depth) const {
634 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
635 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
636 return skip;
637}
638
639void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
640 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
641 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
642 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
643 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
644 uint32_t height, uint32_t depth) {
645 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600646 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500647 cb_state->hasTraceRaysCmd = true;
648}
649
650bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
651 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
652 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
653 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
654 const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
655 VkBuffer buffer, VkDeviceSize offset) const {
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700656 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSINDIRECTKHR,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500657 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700658 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_TRACERAYSINDIRECTKHR, "vkCmdTraceRaysIndirectKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500659 return skip;
660}
661
662void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
663 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
664 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
665 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
666 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
667 VkDeviceSize offset) {
668 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
669 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600670 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500671 cb_state->hasTraceRaysCmd = true;
672 AddCommandBufferBindingBuffer(cb_state, buffer_state);
673}
674
Jeff Bolz5c801d12019-10-09 10:38:45 -0500675bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700676 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
677 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700678 return skip;
679}
680
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700681bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500682 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700683 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700684 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600685 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700686 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTNV, "vkCmdDrawMeshTasksIndirectNV()");
Lockee68ac652019-05-06 10:17:33 -0600687 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600688 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
689 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
690 drawCount, offset, buffer_state);
691 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700692 return skip;
693}
694
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700695bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
696 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500697 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700698 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700699 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600700 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
701 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700702 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTCOUNTNV, "vkCmdDrawMeshTasksIndirectCountNV()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700703 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600704 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700705 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700706 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
707 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600708 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
709 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
710 if (maxDrawCount > 1) {
711 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
712 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
713 maxDrawCount, offset, buffer_state);
714 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700715 return skip;
716}