blob: 1b081a99c8c5e65554d6411dd8ac99c6068df225 [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",
locke-lunarg9a16ebb2020-07-30 16:56:33 -060066 "VUID-vkCmdDraw-None-02686",
Spencer Fricke507600b2020-03-22 13:23:06 -070067 }},
68 {CMD_DRAWINDEXED, {
69 "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
70 "VUID-vkCmdDrawIndexed-renderpass",
71 "VUID-vkCmdDrawIndexed-None-02700",
72 "VUID-vkCmdDrawIndexed-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050073 "VUID-vkCmdDrawIndexed-None-04007",
74 "VUID-vkCmdDrawIndexed-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070075 "VUID-vkCmdDrawIndexed-None-02697",
76 "VUID-vkCmdDrawIndexed-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070077 "VUID-vkCmdDrawIndexed-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060078 "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689",
79 "VUID-vkCmdDrawIndexed-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -070080 "VUID-vkCmdDrawIndexed-None-02692",
81 kVUIDUndefined, // indirect_protected_cb
82 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -060083 kVUIDUndefined, // indirect_buffer_bit
84 "VUID-vkCmdDrawIndexed-viewportCount-03417",
85 "VUID-vkCmdDrawIndexed-scissorCount-03418",
86 "VUID-vkCmdDrawIndexed-viewportCount-03419",
87 "VUID-vkCmdDrawIndexed-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -060088 "VUID-vkCmdDrawIndexed-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -060089 "VUID-vkCmdDrawIndexed-None-02686",
Spencer Fricke507600b2020-03-22 13:23:06 -070090 }},
91 {CMD_DRAWINDIRECT, {
92 "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
93 "VUID-vkCmdDrawIndirect-renderpass",
94 "VUID-vkCmdDrawIndirect-None-02700",
95 "VUID-vkCmdDrawIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050096 "VUID-vkCmdDrawIndirect-None-04007",
97 "VUID-vkCmdDrawIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070098 "VUID-vkCmdDrawIndirect-None-02697",
99 "VUID-vkCmdDrawIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700100 "VUID-vkCmdDrawIndirect-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600101 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689",
102 "VUID-vkCmdDrawIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700103 "VUID-vkCmdDrawIndirect-None-02692",
104 "VUID-vkCmdDrawIndirect-commandBuffer-02711",
105 "VUID-vkCmdDrawIndirect-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600106 "VUID-vkCmdDrawIndirect-buffer-02709",
107 "VUID-vkCmdDrawIndirect-viewportCount-03417",
108 "VUID-vkCmdDrawIndirect-scissorCount-03418",
109 "VUID-vkCmdDrawIndirect-viewportCount-03419",
110 "VUID-vkCmdDrawIndirect-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600111 "VUID-vkCmdDrawIndirect-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600112 "VUID-vkCmdDrawIndirect-None-02686",
Spencer Fricke507600b2020-03-22 13:23:06 -0700113 }},
114 {CMD_DRAWINDEXEDINDIRECT, {
115 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool",
116 "VUID-vkCmdDrawIndexedIndirect-renderpass",
117 "VUID-vkCmdDrawIndexedIndirect-None-02700",
118 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500119 "VUID-vkCmdDrawIndexedIndirect-None-04007",
120 "VUID-vkCmdDrawIndexedIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700121 "VUID-vkCmdDrawIndexedIndirect-None-02697",
122 "VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700123 "VUID-vkCmdDrawIndexedIndirect-subpass-02685",
Mark Lobodzinski2f084472020-06-18 16:33:57 -0600124 "VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600125 "VUID-vkCmdDrawIndexedIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700126 "VUID-vkCmdDrawIndexedIndirect-None-02692",
127 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711",
128 "VUID-vkCmdDrawIndexedIndirect-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600129 "VUID-vkCmdDrawIndexedIndirect-buffer-02709",
130 "VUID-vkCmdDrawIndexedIndirect-viewportCount-03417",
131 "VUID-vkCmdDrawIndexedIndirect-scissorCount-03418",
132 "VUID-vkCmdDrawIndexedIndirect-viewportCount-03419",
133 "VUID-vkCmdDrawIndexedIndirect-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600134 "VUID-vkCmdDrawIndexedIndirect-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600135 "VUID-vkCmdDrawIndexedIndirect-None-02686",
Spencer Fricke507600b2020-03-22 13:23:06 -0700136 }},
137 {CMD_DISPATCH, {
138 "VUID-vkCmdDispatch-commandBuffer-cmdpool",
139 "VUID-vkCmdDispatch-renderpass",
140 "VUID-vkCmdDispatch-None-02700",
141 kVUIDUndefined, // dynamic_state
142 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500143 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700144 "VUID-vkCmdDispatch-None-02697",
145 kVUIDUndefined, // render_pass_compatible
146 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700147 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600148 "VUID-vkCmdDispatch-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700149 "VUID-vkCmdDispatch-None-02692",
150 kVUIDUndefined, // indirect_protected_cb
151 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600152 kVUIDUndefined, // indirect_buffer_bit
153 kVUIDUndefined, // viewport_count
154 kVUIDUndefined, // scissor_count
155 kVUIDUndefined, // viewport_scissor_count
156 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600157 "VUID-vkCmdDispatch-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600158 kVUIDUndefined, // subpass_input
Spencer Fricke507600b2020-03-22 13:23:06 -0700159 }},
160 {CMD_DISPATCHINDIRECT, {
161 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
162 "VUID-vkCmdDispatchIndirect-renderpass",
163 "VUID-vkCmdDispatchIndirect-None-02700",
164 kVUIDUndefined, // dynamic_state
165 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500166 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700167 "VUID-vkCmdDispatchIndirect-None-02697",
168 kVUIDUndefined, // render_pass_compatible
169 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700170 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600171 "VUID-vkCmdDispatchIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700172 "VUID-vkCmdDispatchIndirect-None-02692",
173 "VUID-vkCmdDispatchIndirect-commandBuffer-02711",
174 "VUID-vkCmdDispatchIndirect-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600175 "VUID-vkCmdDispatchIndirect-buffer-02709",
176 kVUIDUndefined, // viewport_count
177 kVUIDUndefined, // scissor_count
178 kVUIDUndefined, // viewport_scissor_count
179 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600180 "VUID-vkCmdDispatchIndirect-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600181 kVUIDUndefined, // subpass_input
Spencer Fricke507600b2020-03-22 13:23:06 -0700182 }},
183 {CMD_DRAWINDIRECTCOUNT, {
184 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
185 "VUID-vkCmdDrawIndirectCount-renderpass",
186 "VUID-vkCmdDrawIndirectCount-None-02700",
187 "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500188 "VUID-vkCmdDrawIndirectCount-None-04007",
189 "VUID-vkCmdDrawIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700190 "VUID-vkCmdDrawIndirectCount-None-02697",
191 "VUID-vkCmdDrawIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700192 "VUID-vkCmdDrawIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600193 "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689",
194 "VUID-vkCmdDrawIndirectCount-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700195 "VUID-vkCmdDrawIndirectCount-None-02692",
196 "VUID-vkCmdDrawIndirectCount-commandBuffer-02711",
197 "VUID-vkCmdDrawIndirectCount-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600198 "VUID-vkCmdDrawIndirectCount-buffer-02709",
199 "VUID-vkCmdDrawIndirectCount-viewportCount-03417",
200 "VUID-vkCmdDrawIndirectCount-scissorCount-03418",
201 "VUID-vkCmdDrawIndirectCount-viewportCount-03419",
202 "VUID-vkCmdDrawIndirectCount-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600203 "VUID-vkCmdDrawIndirectCount-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600204 "VUID-vkCmdDrawIndirectCount-None-02686",
Spencer Fricke507600b2020-03-22 13:23:06 -0700205 }},
206 {CMD_DRAWINDEXEDINDIRECTCOUNT,{
207 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
208 "VUID-vkCmdDrawIndexedIndirectCount-renderpass",
209 "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
210 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500211 "VUID-vkCmdDrawIndexedIndirectCount-None-04007",
212 "VUID-vkCmdDrawIndexedIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700213 "VUID-vkCmdDrawIndexedIndirectCount-None-02697",
214 "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700215 "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600216 "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689",
217 "VUID-vkCmdDrawIndexedIndirectCount-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700218 "VUID-vkCmdDrawIndexedIndirectCount-None-02692",
219 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711",
220 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600221 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709",
222 "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03417",
223 "VUID-vkCmdDrawIndexedIndirectCount-scissorCount-03418",
224 "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03419",
225 "VUID-vkCmdDrawIndexedIndirectCount-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600226 "VUID-vkCmdDrawIndexedIndirectCount-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600227 "VUID-vkCmdDrawIndexedIndirectCount-None-02686",
Spencer Fricke507600b2020-03-22 13:23:06 -0700228 }},
229 {CMD_TRACERAYSNV, {
230 "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool",
231 "VUID-vkCmdTraceRaysNV-renderpass",
232 "VUID-vkCmdTraceRaysNV-None-02700",
233 "VUID-vkCmdTraceRaysNV-commandBuffer-02701",
234 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500235 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700236 "VUID-vkCmdTraceRaysNV-None-02697",
237 kVUIDUndefined, // render_pass_compatible
238 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700239 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600240 "VUID-vkCmdTraceRaysNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700241 "VUID-vkCmdTraceRaysNV-None-02692",
242 kVUIDUndefined, // indirect_protected_cb
243 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600244 kVUIDUndefined, // indirect_buffer_bit
245 kVUIDUndefined, // viewport_count
246 kVUIDUndefined, // scissor_count
247 kVUIDUndefined, // viewport_scissor_count
248 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600249 "VUID-vkCmdTraceRaysNV-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600250 kVUIDUndefined, // subpass_input
Spencer Fricke507600b2020-03-22 13:23:06 -0700251 }},
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500252 {CMD_TRACERAYSKHR, {
253 "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool",
254 "VUID-vkCmdTraceRaysKHR-renderpass",
255 "VUID-vkCmdTraceRaysKHR-None-02700",
256 "VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
257 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500258 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500259 "VUID-vkCmdTraceRaysKHR-None-02697",
260 kVUIDUndefined, // render_pass_compatible
261 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700262 kVUIDUndefined, // sample_location
Jeremy Kniager38162652020-06-25 14:05:03 -0600263 "VUID-vkCmdTraceRaysKHR-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700264 "VUID-vkCmdTraceRaysKHR-None-02692",
265 kVUIDUndefined, // indirect_protected_cb
266 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600267 kVUIDUndefined, // indirect_buffer_bit
268 kVUIDUndefined, // viewport_count
269 kVUIDUndefined, // scissor_count
270 kVUIDUndefined, // viewport_scissor_count
271 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600272 "VUID-vkCmdTraceRaysKHR-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600273 kVUIDUndefined, // subpass_input
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500274 }},
275 {CMD_TRACERAYSINDIRECTKHR, {
276 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool",
277 "VUID-vkCmdTraceRaysIndirectKHR-renderpass",
278 "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
279 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
280 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500281 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500282 "VUID-vkCmdTraceRaysIndirectKHR-None-02697",
283 kVUIDUndefined, // render_pass_compatible
284 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700285 kVUIDUndefined, // sample_location
Jeremy Kniager38162652020-06-25 14:05:03 -0600286 "VUID-vkCmdTraceRaysIndirectKHR-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700287 "VUID-vkCmdTraceRaysIndirectKHR-None-02692",
288 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711",
289 "VUID-vkCmdTraceRaysIndirectKHR-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600290 "VUID-vkCmdTraceRaysIndirectKHR-buffer-02709",
291 kVUIDUndefined, // viewport_count
292 kVUIDUndefined, // scissor_count
293 kVUIDUndefined, // viewport_scissor_count
294 kVUIDUndefined, // primitive_topology
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600295 "VUID-vkCmdTraceRaysIndirectKHR-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600296 kVUIDUndefined, // subpass_input
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500297 }},
Spencer Fricke507600b2020-03-22 13:23:06 -0700298 {CMD_DRAWMESHTASKSNV, {
299 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool",
300 "VUID-vkCmdDrawMeshTasksNV-renderpass",
301 "VUID-vkCmdDrawMeshTasksNV-None-02700",
302 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
303 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500304 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700305 "VUID-vkCmdDrawMeshTasksNV-None-02697",
306 "VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700307 "VUID-vkCmdDrawMeshTasksNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600308 "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689",
309 "VUID-vkCmdDrawMeshTasksNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700310 "VUID-vkCmdDrawMeshTasksNV-None-02692",
311 kVUIDUndefined, // indirect_protected_cb
312 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600313 kVUIDUndefined, // indirect_buffer_bit
314 "VUID-vkCmdDrawMeshTasksNV-viewportCount-03417",
315 "VUID-vkCmdDrawMeshTasksNV-scissorCount-03418",
316 "VUID-vkCmdDrawMeshTasksNV-viewportCount-03419",
317 "VUID-vkCmdDrawMeshTasksNV-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600318 "VUID-vkCmdDrawMeshTasksNV-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600319 "VUID-vkCmdDrawMeshTasksNV-None-02686",
Spencer Fricke507600b2020-03-22 13:23:06 -0700320 }},
321 {CMD_DRAWMESHTASKSINDIRECTNV, {
322 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
323 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass",
324 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
325 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701",
326 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500327 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700328 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02697",
329 "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700330 "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600331 "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689",
332 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700333 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02692",
334 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711",
335 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600336 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709",
337 "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03417",
338 "VUID-vkCmdDrawMeshTasksIndirectNV-scissorCount-03418",
339 "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03419",
340 "VUID-vkCmdDrawMeshTasksIndirectNV-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600341 "VUID-vkCmdDrawMeshTasksIndirectNV-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600342 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02686",
Spencer Fricke507600b2020-03-22 13:23:06 -0700343 }},
344 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, {
345 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
346 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
347 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
348 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
349 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500350 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700351 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697",
352 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700353 "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600354 "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689",
355 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700356 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692",
357 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711",
358 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600359 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709",
360 "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03417",
361 "VUID-vkCmdDrawMeshTasksIndirectCountNV-scissorCount-03418",
362 "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03419",
363 "VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveTopology-03420",
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600364 "VUID-vkCmdDrawMeshTasksIndirectCountNV-flags-02696",
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600365 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02686",
366 }},
367 {CMD_DRAWINDIRECTBYTECOUNTEXT, {
368 "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-cmdpool",
369 "VUID-vkCmdDrawIndirectByteCountEXT-renderpass",
370 "VUID-vkCmdDrawIndirectByteCountEXT-None-02700",
371 "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02701",
372 "VUID-vkCmdDrawIndirectByteCountEXT-None-04007",
373 "VUID-vkCmdDrawIndirectByteCountEXT-None-04008",
374 "VUID-vkCmdDrawIndirectByteCountEXT-None-02697",
375 "VUID-vkCmdDrawIndirectByteCountEXT-renderPass-02684",
376 "VUID-vkCmdDrawIndirectByteCountEXT-subpass-02685",
377 "VUID-vkCmdDrawIndirectByteCountEXT-sampleLocationsEnable-02689",
378 "VUID-vkCmdDrawIndirectByteCountEXT-None-02690",
379 "VUID-vkCmdDrawIndirectByteCountEXT-None-02692",
380 "VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02711",
381 "VUID-vkCmdDrawIndirectByteCountEXT-buffer-02708",
382 "VUID-vkCmdDrawIndirectByteCountEXT-buffer-02709",
383 "VUID-vkCmdDrawIndirectByteCountEXT-viewportCount-03417",
384 "VUID-vkCmdDrawIndirectByteCountEXT-scissorCount-03418",
385 "VUID-vkCmdDrawIndirectByteCountEXT-viewportCount-03419",
386 "VUID-vkCmdDrawIndirectByteCountEXT-primitiveTopology-03420",
387 "VUID-vkCmdDrawIndirectByteCountEXT-flags-02696",
388 "VUID-vkCmdDrawIndirectByteCountEXT-None-02686",
Spencer Fricke507600b2020-03-22 13:23:06 -0700389 }},
390 // Used if invalid cmd_type is used
Piers Daniell39842ee2020-07-10 16:42:33 -0600391 {CMD_NONE, {
392 kVUIDUndefined,
393 kVUIDUndefined,
394 kVUIDUndefined,
395 kVUIDUndefined,
396 kVUIDUndefined,
397 kVUIDUndefined,
398 kVUIDUndefined,
399 kVUIDUndefined,
400 kVUIDUndefined,
401 kVUIDUndefined,
402 kVUIDUndefined,
403 kVUIDUndefined,
404 kVUIDUndefined,
405 kVUIDUndefined,
406 kVUIDUndefined,
407 kVUIDUndefined,
408 kVUIDUndefined,
409 kVUIDUndefined,
410 kVUIDUndefined,
Jeremy Kniager95ffacb2020-06-19 11:32:05 -0600411 kVUIDUndefined,
Piers Daniell39842ee2020-07-10 16:42:33 -0600412 }}
Spencer Fricke507600b2020-03-22 13:23:06 -0700413};
414// clang-format on
415
416// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
417const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
418 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
419 return drawdispatch_vuid.at(cmd_type);
420 } else {
421 return drawdispatch_vuid.at(CMD_NONE);
422 }
423}
424
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700425// Generic function to handle validation for all CmdDraw* type functions
426bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700427 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700428 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700429 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600430 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700431 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700432 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700433 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700434 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
435 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
436 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700437 }
438 return skip;
439}
440
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700441bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500442 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700443 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700444 VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700445}
446
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700447bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500448 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700449 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700450 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500451 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700452 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
453 unsigned int index_size = 0;
454 const auto &index_buffer_binding = cb_state->index_buffer_binding;
455 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
456 index_size = 2;
457 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
458 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600459 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
460 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700461 }
462 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
463 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700464 skip |=
465 LogError(index_buffer_binding.buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
466 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
467 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
468 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
469 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700470 }
471 }
472 return skip;
473}
474
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700475bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500476 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700477 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700478 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600479 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700480 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600481 if (count > 1) {
482 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
483 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
484 skip |=
485 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
486 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
487 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700488 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
489 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
490 return skip;
491}
492
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700493bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500494 uint32_t count, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700495 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
496 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600497 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700498 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600499 if (count > 1) {
500 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
501 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
502 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
503 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
504 buffer_state);
505 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700506 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
507 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
508 // 'buffer'.
509 return skip;
510}
511
Jeff Bolz5c801d12019-10-09 10:38:45 -0500512bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600513 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600514 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700515 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600516 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700517}
518
Jeff Bolz5c801d12019-10-09 10:38:45 -0500519bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700520 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700521 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700522 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700523 return skip;
524}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700525bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
526 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700527 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700528 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700529 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
530 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-02836",
531 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
532 "call this command.",
533 apiName);
534 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700535 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
536 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600537 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600538 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700539 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
540 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700541 }
542
Tony-LunarG83544c72020-01-17 12:30:19 -0700543 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700544 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600545 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700546 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECTCOUNT, apiName);
Tony-LunarG83544c72020-01-17 12:30:19 -0700547 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Tony-LunarG83544c72020-01-17 12:30:19 -0700548 skip |=
549 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
550 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700551 return skip;
552}
553
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700554bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
555 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
556 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700557 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700558 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700559}
560
561bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
562 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
563 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700564 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700565 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700566}
567
568bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
569 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700570 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700571 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700572 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
573 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-None-02837",
574 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
575 "call this command.",
576 apiName);
577 }
sfricke-samsungf692b972020-05-02 08:00:45 -0700578 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
579 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600580 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600581 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800582 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700583 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700584 }
585
sfricke-samsungf692b972020-05-02 08:00:45 -0700586 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
587 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600588 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700589 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName);
sfricke-samsungf692b972020-05-02 08:00:45 -0700590 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700591 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700592 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800593 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700594 return skip;
595}
596
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700597bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
598 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
599 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700600 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
601 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700602}
603
604bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
605 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
606 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700607 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
608 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700609}
610
locke-lunarg9a16ebb2020-07-30 16:56:33 -0600611bool CoreChecks::PreCallValidateCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount,
612 uint32_t firstInstance, VkBuffer counterBuffer,
613 VkDeviceSize counterBufferOffset, uint32_t counterOffset,
614 uint32_t vertexStride) const {
615 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTBYTECOUNTEXT,
616 "vkCmdDrawIndirectByteCountEXT()", VK_QUEUE_GRAPHICS_BIT);
617}
618
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500619bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
620 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
621 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
622 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
623 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
624 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
625 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700626 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
627 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
sourav parmard1521802020-06-07 21:49:02 -0700628 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
629 skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
630 auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
631 if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
632 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
633 "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
634 " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
635 callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
636 }
637 auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
638 if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
639 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
640 "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
641 " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
642 hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
643 }
644 auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
645 if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
646 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
647 "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
648 " must be less than the size of missShaderBindingTableBuffer" PRIu64 " .",
649 missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
650 }
651 auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
652 if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
653 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
654 "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
655 " must be less than the size of raygenShaderBindingTableBuffer" PRIu64 " .",
656 raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
657 }
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500658 return skip;
659}
660
Jason Macnak67407e72019-07-11 11:05:09 -0700661void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
662 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
663 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
664 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
665 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
666 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
667 uint32_t width, uint32_t height, uint32_t depth) {
668 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600669 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jason Macnak67407e72019-07-11 11:05:09 -0700670 cb_state->hasTraceRaysCmd = true;
671}
672
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500673bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
674 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
675 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
676 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
677 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
678 uint32_t height, uint32_t depth) const {
679 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
680 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
681 return skip;
682}
683
684void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
685 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
686 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
687 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
688 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
689 uint32_t height, uint32_t depth) {
690 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600691 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500692 cb_state->hasTraceRaysCmd = true;
693}
694
695bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
696 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
697 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
698 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
699 const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
700 VkBuffer buffer, VkDeviceSize offset) const {
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700701 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSINDIRECTKHR,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500702 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700703 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_TRACERAYSINDIRECTKHR, "vkCmdTraceRaysIndirectKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500704 return skip;
705}
706
707void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
708 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
709 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
710 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
711 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
712 VkDeviceSize offset) {
713 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
714 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600715 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500716 cb_state->hasTraceRaysCmd = true;
717 AddCommandBufferBindingBuffer(cb_state, buffer_state);
718}
719
Jeff Bolz5c801d12019-10-09 10:38:45 -0500720bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700721 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
722 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700723 return skip;
724}
725
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700726bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500727 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700728 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700729 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600730 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700731 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTNV, "vkCmdDrawMeshTasksIndirectNV()");
Lockee68ac652019-05-06 10:17:33 -0600732 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600733 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
734 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
735 drawCount, offset, buffer_state);
736 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700737 return skip;
738}
739
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700740bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
741 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500742 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700743 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700744 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600745 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
746 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700747 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTCOUNTNV, "vkCmdDrawMeshTasksIndirectCountNV()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700748 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600749 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700750 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700751 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
752 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600753 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
754 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
755 if (maxDrawCount > 1) {
756 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
757 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
758 maxDrawCount, offset, buffer_state);
759 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700760 return skip;
761}