blob: 3d19a0060ab3d8416c76e4df77c8b36500867f95 [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",
Spencer Fricke507600b2020-03-22 13:23:06 -070065 }},
66 {CMD_DRAWINDEXED, {
67 "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
68 "VUID-vkCmdDrawIndexed-renderpass",
69 "VUID-vkCmdDrawIndexed-None-02700",
70 "VUID-vkCmdDrawIndexed-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050071 "VUID-vkCmdDrawIndexed-None-04007",
72 "VUID-vkCmdDrawIndexed-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070073 "VUID-vkCmdDrawIndexed-None-02697",
74 "VUID-vkCmdDrawIndexed-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070075 "VUID-vkCmdDrawIndexed-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060076 "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689",
77 "VUID-vkCmdDrawIndexed-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -070078 "VUID-vkCmdDrawIndexed-None-02692",
79 kVUIDUndefined, // indirect_protected_cb
80 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -060081 kVUIDUndefined, // indirect_buffer_bit
82 "VUID-vkCmdDrawIndexed-viewportCount-03417",
83 "VUID-vkCmdDrawIndexed-scissorCount-03418",
84 "VUID-vkCmdDrawIndexed-viewportCount-03419",
85 "VUID-vkCmdDrawIndexed-primitiveTopology-03420",
Spencer Fricke507600b2020-03-22 13:23:06 -070086 }},
87 {CMD_DRAWINDIRECT, {
88 "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
89 "VUID-vkCmdDrawIndirect-renderpass",
90 "VUID-vkCmdDrawIndirect-None-02700",
91 "VUID-vkCmdDrawIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050092 "VUID-vkCmdDrawIndirect-None-04007",
93 "VUID-vkCmdDrawIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070094 "VUID-vkCmdDrawIndirect-None-02697",
95 "VUID-vkCmdDrawIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070096 "VUID-vkCmdDrawIndirect-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060097 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689",
98 "VUID-vkCmdDrawIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -070099 "VUID-vkCmdDrawIndirect-None-02692",
100 "VUID-vkCmdDrawIndirect-commandBuffer-02711",
101 "VUID-vkCmdDrawIndirect-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600102 "VUID-vkCmdDrawIndirect-buffer-02709",
103 "VUID-vkCmdDrawIndirect-viewportCount-03417",
104 "VUID-vkCmdDrawIndirect-scissorCount-03418",
105 "VUID-vkCmdDrawIndirect-viewportCount-03419",
106 "VUID-vkCmdDrawIndirect-primitiveTopology-03420",
Spencer Fricke507600b2020-03-22 13:23:06 -0700107 }},
108 {CMD_DRAWINDEXEDINDIRECT, {
109 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool",
110 "VUID-vkCmdDrawIndexedIndirect-renderpass",
111 "VUID-vkCmdDrawIndexedIndirect-None-02700",
112 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500113 "VUID-vkCmdDrawIndexedIndirect-None-04007",
114 "VUID-vkCmdDrawIndexedIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700115 "VUID-vkCmdDrawIndexedIndirect-None-02697",
116 "VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700117 "VUID-vkCmdDrawIndexedIndirect-subpass-02685",
Mark Lobodzinski2f084472020-06-18 16:33:57 -0600118 "VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600119 "VUID-vkCmdDrawIndexedIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700120 "VUID-vkCmdDrawIndexedIndirect-None-02692",
121 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711",
122 "VUID-vkCmdDrawIndexedIndirect-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600123 "VUID-vkCmdDrawIndexedIndirect-buffer-02709",
124 "VUID-vkCmdDrawIndexedIndirect-viewportCount-03417",
125 "VUID-vkCmdDrawIndexedIndirect-scissorCount-03418",
126 "VUID-vkCmdDrawIndexedIndirect-viewportCount-03419",
127 "VUID-vkCmdDrawIndexedIndirect-primitiveTopology-03420",
Spencer Fricke507600b2020-03-22 13:23:06 -0700128 }},
129 {CMD_DISPATCH, {
130 "VUID-vkCmdDispatch-commandBuffer-cmdpool",
131 "VUID-vkCmdDispatch-renderpass",
132 "VUID-vkCmdDispatch-None-02700",
133 kVUIDUndefined, // dynamic_state
134 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500135 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700136 "VUID-vkCmdDispatch-None-02697",
137 kVUIDUndefined, // render_pass_compatible
138 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700139 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600140 "VUID-vkCmdDispatch-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700141 "VUID-vkCmdDispatch-None-02692",
142 kVUIDUndefined, // indirect_protected_cb
143 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600144 kVUIDUndefined, // indirect_buffer_bit
145 kVUIDUndefined, // viewport_count
146 kVUIDUndefined, // scissor_count
147 kVUIDUndefined, // viewport_scissor_count
148 kVUIDUndefined, // primitive_topology
Spencer Fricke507600b2020-03-22 13:23:06 -0700149 }},
150 {CMD_DISPATCHINDIRECT, {
151 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
152 "VUID-vkCmdDispatchIndirect-renderpass",
153 "VUID-vkCmdDispatchIndirect-None-02700",
154 kVUIDUndefined, // dynamic_state
155 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500156 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700157 "VUID-vkCmdDispatchIndirect-None-02697",
158 kVUIDUndefined, // render_pass_compatible
159 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700160 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600161 "VUID-vkCmdDispatchIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700162 "VUID-vkCmdDispatchIndirect-None-02692",
163 "VUID-vkCmdDispatchIndirect-commandBuffer-02711",
164 "VUID-vkCmdDispatchIndirect-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600165 "VUID-vkCmdDispatchIndirect-buffer-02709",
166 kVUIDUndefined, // viewport_count
167 kVUIDUndefined, // scissor_count
168 kVUIDUndefined, // viewport_scissor_count
169 kVUIDUndefined, // primitive_topology
Spencer Fricke507600b2020-03-22 13:23:06 -0700170 }},
171 {CMD_DRAWINDIRECTCOUNT, {
172 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
173 "VUID-vkCmdDrawIndirectCount-renderpass",
174 "VUID-vkCmdDrawIndirectCount-None-02700",
175 "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500176 "VUID-vkCmdDrawIndirectCount-None-04007",
177 "VUID-vkCmdDrawIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700178 "VUID-vkCmdDrawIndirectCount-None-02697",
179 "VUID-vkCmdDrawIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700180 "VUID-vkCmdDrawIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600181 "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689",
182 "VUID-vkCmdDrawIndirectCount-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700183 "VUID-vkCmdDrawIndirectCount-None-02692",
184 "VUID-vkCmdDrawIndirectCount-commandBuffer-02711",
185 "VUID-vkCmdDrawIndirectCount-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600186 "VUID-vkCmdDrawIndirectCount-buffer-02709",
187 "VUID-vkCmdDrawIndirectCount-viewportCount-03417",
188 "VUID-vkCmdDrawIndirectCount-scissorCount-03418",
189 "VUID-vkCmdDrawIndirectCount-viewportCount-03419",
190 "VUID-vkCmdDrawIndirectCount-primitiveTopology-03420",
Spencer Fricke507600b2020-03-22 13:23:06 -0700191 }},
192 {CMD_DRAWINDEXEDINDIRECTCOUNT,{
193 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
194 "VUID-vkCmdDrawIndexedIndirectCount-renderpass",
195 "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
196 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500197 "VUID-vkCmdDrawIndexedIndirectCount-None-04007",
198 "VUID-vkCmdDrawIndexedIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700199 "VUID-vkCmdDrawIndexedIndirectCount-None-02697",
200 "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700201 "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600202 "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689",
203 "VUID-vkCmdDrawIndexedIndirectCount-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700204 "VUID-vkCmdDrawIndexedIndirectCount-None-02692",
205 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711",
206 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600207 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709",
208 "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03417",
209 "VUID-vkCmdDrawIndexedIndirectCount-scissorCount-03418",
210 "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03419",
211 "VUID-vkCmdDrawIndexedIndirectCount-primitiveTopology-03420",
Spencer Fricke507600b2020-03-22 13:23:06 -0700212 }},
213 {CMD_TRACERAYSNV, {
214 "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool",
215 "VUID-vkCmdTraceRaysNV-renderpass",
216 "VUID-vkCmdTraceRaysNV-None-02700",
217 "VUID-vkCmdTraceRaysNV-commandBuffer-02701",
218 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500219 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700220 "VUID-vkCmdTraceRaysNV-None-02697",
221 kVUIDUndefined, // render_pass_compatible
222 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700223 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600224 "VUID-vkCmdTraceRaysNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700225 "VUID-vkCmdTraceRaysNV-None-02692",
226 kVUIDUndefined, // indirect_protected_cb
227 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600228 kVUIDUndefined, // indirect_buffer_bit
229 kVUIDUndefined, // viewport_count
230 kVUIDUndefined, // scissor_count
231 kVUIDUndefined, // viewport_scissor_count
232 kVUIDUndefined, // primitive_topology
Spencer Fricke507600b2020-03-22 13:23:06 -0700233 }},
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500234 {CMD_TRACERAYSKHR, {
235 "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool",
236 "VUID-vkCmdTraceRaysKHR-renderpass",
237 "VUID-vkCmdTraceRaysKHR-None-02700",
238 "VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
239 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500240 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500241 "VUID-vkCmdTraceRaysKHR-None-02697",
242 kVUIDUndefined, // render_pass_compatible
243 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700244 kVUIDUndefined, // sample_location
Jeremy Kniager38162652020-06-25 14:05:03 -0600245 "VUID-vkCmdTraceRaysKHR-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700246 "VUID-vkCmdTraceRaysKHR-None-02692",
247 kVUIDUndefined, // indirect_protected_cb
248 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600249 kVUIDUndefined, // indirect_buffer_bit
250 kVUIDUndefined, // viewport_count
251 kVUIDUndefined, // scissor_count
252 kVUIDUndefined, // viewport_scissor_count
253 kVUIDUndefined, // primitive_topology
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500254 }},
255 {CMD_TRACERAYSINDIRECTKHR, {
256 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool",
257 "VUID-vkCmdTraceRaysIndirectKHR-renderpass",
258 "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
259 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
260 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500261 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500262 "VUID-vkCmdTraceRaysIndirectKHR-None-02697",
263 kVUIDUndefined, // render_pass_compatible
264 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700265 kVUIDUndefined, // sample_location
Jeremy Kniager38162652020-06-25 14:05:03 -0600266 "VUID-vkCmdTraceRaysIndirectKHR-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700267 "VUID-vkCmdTraceRaysIndirectKHR-None-02692",
268 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711",
269 "VUID-vkCmdTraceRaysIndirectKHR-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600270 "VUID-vkCmdTraceRaysIndirectKHR-buffer-02709",
271 kVUIDUndefined, // viewport_count
272 kVUIDUndefined, // scissor_count
273 kVUIDUndefined, // viewport_scissor_count
274 kVUIDUndefined, // primitive_topology
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500275 }},
Spencer Fricke507600b2020-03-22 13:23:06 -0700276 {CMD_DRAWMESHTASKSNV, {
277 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool",
278 "VUID-vkCmdDrawMeshTasksNV-renderpass",
279 "VUID-vkCmdDrawMeshTasksNV-None-02700",
280 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
281 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500282 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700283 "VUID-vkCmdDrawMeshTasksNV-None-02697",
284 "VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700285 "VUID-vkCmdDrawMeshTasksNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600286 "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689",
287 "VUID-vkCmdDrawMeshTasksNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700288 "VUID-vkCmdDrawMeshTasksNV-None-02692",
289 kVUIDUndefined, // indirect_protected_cb
290 kVUIDUndefined, // indirect_contiguous_memory;
Piers Daniell39842ee2020-07-10 16:42:33 -0600291 kVUIDUndefined, // indirect_buffer_bit
292 "VUID-vkCmdDrawMeshTasksNV-viewportCount-03417",
293 "VUID-vkCmdDrawMeshTasksNV-scissorCount-03418",
294 "VUID-vkCmdDrawMeshTasksNV-viewportCount-03419",
295 "VUID-vkCmdDrawMeshTasksNV-primitiveTopology-03420",
Spencer Fricke507600b2020-03-22 13:23:06 -0700296 }},
297 {CMD_DRAWMESHTASKSINDIRECTNV, {
298 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
299 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass",
300 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
301 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701",
302 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500303 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700304 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02697",
305 "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700306 "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600307 "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689",
308 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700309 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02692",
310 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711",
311 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600312 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709",
313 "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03417",
314 "VUID-vkCmdDrawMeshTasksIndirectNV-scissorCount-03418",
315 "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03419",
316 "VUID-vkCmdDrawMeshTasksIndirectNV-primitiveTopology-03420",
Spencer Fricke507600b2020-03-22 13:23:06 -0700317 }},
318 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, {
319 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
320 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
321 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
322 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
323 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500324 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700325 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697",
326 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700327 "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600328 "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689",
329 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700330 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692",
331 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711",
332 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708",
Piers Daniell39842ee2020-07-10 16:42:33 -0600333 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709",
334 "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03417",
335 "VUID-vkCmdDrawMeshTasksIndirectCountNV-scissorCount-03418",
336 "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03419",
337 "VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveTopology-03420",
Spencer Fricke507600b2020-03-22 13:23:06 -0700338 }},
339 // Used if invalid cmd_type is used
Piers Daniell39842ee2020-07-10 16:42:33 -0600340 {CMD_NONE, {
341 kVUIDUndefined,
342 kVUIDUndefined,
343 kVUIDUndefined,
344 kVUIDUndefined,
345 kVUIDUndefined,
346 kVUIDUndefined,
347 kVUIDUndefined,
348 kVUIDUndefined,
349 kVUIDUndefined,
350 kVUIDUndefined,
351 kVUIDUndefined,
352 kVUIDUndefined,
353 kVUIDUndefined,
354 kVUIDUndefined,
355 kVUIDUndefined,
356 kVUIDUndefined,
357 kVUIDUndefined,
358 kVUIDUndefined,
359 kVUIDUndefined,
360 }}
Spencer Fricke507600b2020-03-22 13:23:06 -0700361};
362// clang-format on
363
364// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
365const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
366 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
367 return drawdispatch_vuid.at(cmd_type);
368 } else {
369 return drawdispatch_vuid.at(CMD_NONE);
370 }
371}
372
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700373// Generic function to handle validation for all CmdDraw* type functions
374bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700375 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700376 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700377 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600378 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700379 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700380 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700381 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700382 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
383 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
384 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700385 }
386 return skip;
387}
388
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700389bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500390 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700391 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700392 VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700393}
394
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700395bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500396 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700397 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700398 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500399 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700400 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
401 unsigned int index_size = 0;
402 const auto &index_buffer_binding = cb_state->index_buffer_binding;
403 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
404 index_size = 2;
405 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
406 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600407 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
408 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700409 }
410 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
411 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700412 skip |=
413 LogError(index_buffer_binding.buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
414 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
415 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
416 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
417 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700418 }
419 }
420 return skip;
421}
422
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700423bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500424 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700425 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700426 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600427 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700428 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600429 if (count > 1) {
430 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
431 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
432 skip |=
433 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
434 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
435 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700436 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
437 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
438 return skip;
439}
440
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700441bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500442 uint32_t count, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700443 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
444 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600445 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700446 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600447 if (count > 1) {
448 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
449 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
450 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
451 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
452 buffer_state);
453 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700454 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
455 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
456 // 'buffer'.
457 return skip;
458}
459
Jeff Bolz5c801d12019-10-09 10:38:45 -0500460bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600461 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600462 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700463 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600464 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700465}
466
Jeff Bolz5c801d12019-10-09 10:38:45 -0500467bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700468 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700469 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700470 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700471 return skip;
472}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700473bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
474 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700475 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700476 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700477 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
478 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-02836",
479 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
480 "call this command.",
481 apiName);
482 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700483 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
484 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600485 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600486 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700487 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
488 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700489 }
490
Tony-LunarG83544c72020-01-17 12:30:19 -0700491 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700492 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600493 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700494 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECTCOUNT, apiName);
Tony-LunarG83544c72020-01-17 12:30:19 -0700495 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Tony-LunarG83544c72020-01-17 12:30:19 -0700496 skip |=
497 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
498 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700499 return skip;
500}
501
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700502bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
503 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
504 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700505 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700506 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700507}
508
509bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
510 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
511 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700512 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700513 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700514}
515
516bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
517 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700518 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700519 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700520 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
521 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-None-02837",
522 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
523 "call this command.",
524 apiName);
525 }
sfricke-samsungf692b972020-05-02 08:00:45 -0700526 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
527 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600528 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600529 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800530 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700531 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700532 }
533
sfricke-samsungf692b972020-05-02 08:00:45 -0700534 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
535 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600536 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700537 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName);
sfricke-samsungf692b972020-05-02 08:00:45 -0700538 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700539 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700540 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800541 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700542 return skip;
543}
544
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700545bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
546 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
547 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700548 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
549 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700550}
551
552bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
553 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
554 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700555 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
556 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700557}
558
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500559bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
560 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
561 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
562 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
563 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
564 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
565 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700566 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
567 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
sourav parmard1521802020-06-07 21:49:02 -0700568 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
569 skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
570 auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
571 if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
572 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
573 "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
574 " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
575 callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
576 }
577 auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
578 if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
579 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
580 "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
581 " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
582 hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
583 }
584 auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
585 if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
586 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
587 "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
588 " must be less than the size of missShaderBindingTableBuffer" PRIu64 " .",
589 missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
590 }
591 auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
592 if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
593 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
594 "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
595 " must be less than the size of raygenShaderBindingTableBuffer" PRIu64 " .",
596 raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
597 }
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500598 return skip;
599}
600
Jason Macnak67407e72019-07-11 11:05:09 -0700601void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
602 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
603 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
604 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
605 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
606 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
607 uint32_t width, uint32_t height, uint32_t depth) {
608 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600609 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jason Macnak67407e72019-07-11 11:05:09 -0700610 cb_state->hasTraceRaysCmd = true;
611}
612
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500613bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
614 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
615 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
616 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
617 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
618 uint32_t height, uint32_t depth) const {
619 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
620 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
621 return skip;
622}
623
624void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
625 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
626 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
627 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
628 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
629 uint32_t height, uint32_t depth) {
630 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600631 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500632 cb_state->hasTraceRaysCmd = true;
633}
634
635bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
636 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
637 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
638 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
639 const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
640 VkBuffer buffer, VkDeviceSize offset) const {
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700641 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSINDIRECTKHR,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500642 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700643 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_TRACERAYSINDIRECTKHR, "vkCmdTraceRaysIndirectKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500644 return skip;
645}
646
647void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
648 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
649 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
650 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
651 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
652 VkDeviceSize offset) {
653 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
654 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600655 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500656 cb_state->hasTraceRaysCmd = true;
657 AddCommandBufferBindingBuffer(cb_state, buffer_state);
658}
659
Jeff Bolz5c801d12019-10-09 10:38:45 -0500660bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700661 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
662 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700663 return skip;
664}
665
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700666bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500667 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700668 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700669 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600670 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700671 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTNV, "vkCmdDrawMeshTasksIndirectNV()");
Lockee68ac652019-05-06 10:17:33 -0600672 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600673 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
674 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
675 drawCount, offset, buffer_state);
676 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700677 return skip;
678}
679
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700680bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
681 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500682 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700683 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700684 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600685 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
686 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700687 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTCOUNTNV, "vkCmdDrawMeshTasksIndirectCountNV()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700688 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600689 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700690 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700691 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
692 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600693 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
694 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
695 if (maxDrawCount > 1) {
696 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
697 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
698 maxDrawCount, offset, buffer_state);
699 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700700 return skip;
701}