blob: c1143247840f347aa34128b597242e41b6592471 [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;
60 kVUIDUndefined // indirect_buffer_bit
Spencer Fricke507600b2020-03-22 13:23:06 -070061 }},
62 {CMD_DRAWINDEXED, {
63 "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
64 "VUID-vkCmdDrawIndexed-renderpass",
65 "VUID-vkCmdDrawIndexed-None-02700",
66 "VUID-vkCmdDrawIndexed-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050067 "VUID-vkCmdDrawIndexed-None-04007",
68 "VUID-vkCmdDrawIndexed-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070069 "VUID-vkCmdDrawIndexed-None-02697",
70 "VUID-vkCmdDrawIndexed-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070071 "VUID-vkCmdDrawIndexed-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060072 "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689",
73 "VUID-vkCmdDrawIndexed-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -070074 "VUID-vkCmdDrawIndexed-None-02692",
75 kVUIDUndefined, // indirect_protected_cb
76 kVUIDUndefined, // indirect_contiguous_memory;
77 kVUIDUndefined // indirect_buffer_bit
Spencer Fricke507600b2020-03-22 13:23:06 -070078 }},
79 {CMD_DRAWINDIRECT, {
80 "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
81 "VUID-vkCmdDrawIndirect-renderpass",
82 "VUID-vkCmdDrawIndirect-None-02700",
83 "VUID-vkCmdDrawIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050084 "VUID-vkCmdDrawIndirect-None-04007",
85 "VUID-vkCmdDrawIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070086 "VUID-vkCmdDrawIndirect-None-02697",
87 "VUID-vkCmdDrawIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070088 "VUID-vkCmdDrawIndirect-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060089 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689",
90 "VUID-vkCmdDrawIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -070091 "VUID-vkCmdDrawIndirect-None-02692",
92 "VUID-vkCmdDrawIndirect-commandBuffer-02711",
93 "VUID-vkCmdDrawIndirect-buffer-02708",
94 "VUID-vkCmdDrawIndirect-buffer-02709"
Spencer Fricke507600b2020-03-22 13:23:06 -070095 }},
96 {CMD_DRAWINDEXEDINDIRECT, {
97 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool",
98 "VUID-vkCmdDrawIndexedIndirect-renderpass",
99 "VUID-vkCmdDrawIndexedIndirect-None-02700",
100 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500101 "VUID-vkCmdDrawIndexedIndirect-None-04007",
102 "VUID-vkCmdDrawIndexedIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700103 "VUID-vkCmdDrawIndexedIndirect-None-02697",
104 "VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700105 "VUID-vkCmdDrawIndexedIndirect-subpass-02685",
Mark Lobodzinski2f084472020-06-18 16:33:57 -0600106 "VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600107 "VUID-vkCmdDrawIndexedIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700108 "VUID-vkCmdDrawIndexedIndirect-None-02692",
109 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711",
110 "VUID-vkCmdDrawIndexedIndirect-buffer-02708",
111 "VUID-vkCmdDrawIndexedIndirect-buffer-02709"
Spencer Fricke507600b2020-03-22 13:23:06 -0700112 }},
113 {CMD_DISPATCH, {
114 "VUID-vkCmdDispatch-commandBuffer-cmdpool",
115 "VUID-vkCmdDispatch-renderpass",
116 "VUID-vkCmdDispatch-None-02700",
117 kVUIDUndefined, // dynamic_state
118 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500119 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700120 "VUID-vkCmdDispatch-None-02697",
121 kVUIDUndefined, // render_pass_compatible
122 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700123 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600124 "VUID-vkCmdDispatch-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700125 "VUID-vkCmdDispatch-None-02692",
126 kVUIDUndefined, // indirect_protected_cb
127 kVUIDUndefined, // indirect_contiguous_memory;
128 kVUIDUndefined // indirect_buffer_bit
Spencer Fricke507600b2020-03-22 13:23:06 -0700129 }},
130 {CMD_DISPATCHINDIRECT, {
131 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
132 "VUID-vkCmdDispatchIndirect-renderpass",
133 "VUID-vkCmdDispatchIndirect-None-02700",
134 kVUIDUndefined, // dynamic_state
135 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500136 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700137 "VUID-vkCmdDispatchIndirect-None-02697",
138 kVUIDUndefined, // render_pass_compatible
139 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700140 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600141 "VUID-vkCmdDispatchIndirect-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700142 "VUID-vkCmdDispatchIndirect-None-02692",
143 "VUID-vkCmdDispatchIndirect-commandBuffer-02711",
144 "VUID-vkCmdDispatchIndirect-buffer-02708",
145 "VUID-vkCmdDispatchIndirect-buffer-02709"
Spencer Fricke507600b2020-03-22 13:23:06 -0700146 }},
147 {CMD_DRAWINDIRECTCOUNT, {
148 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
149 "VUID-vkCmdDrawIndirectCount-renderpass",
150 "VUID-vkCmdDrawIndirectCount-None-02700",
151 "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500152 "VUID-vkCmdDrawIndirectCount-None-04007",
153 "VUID-vkCmdDrawIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700154 "VUID-vkCmdDrawIndirectCount-None-02697",
155 "VUID-vkCmdDrawIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700156 "VUID-vkCmdDrawIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600157 "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689",
158 "VUID-vkCmdDrawIndirectCount-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700159 "VUID-vkCmdDrawIndirectCount-None-02692",
160 "VUID-vkCmdDrawIndirectCount-commandBuffer-02711",
161 "VUID-vkCmdDrawIndirectCount-buffer-02708",
162 "VUID-vkCmdDrawIndirectCount-buffer-02709"
Spencer Fricke507600b2020-03-22 13:23:06 -0700163 }},
164 {CMD_DRAWINDEXEDINDIRECTCOUNT,{
165 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
166 "VUID-vkCmdDrawIndexedIndirectCount-renderpass",
167 "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
168 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500169 "VUID-vkCmdDrawIndexedIndirectCount-None-04007",
170 "VUID-vkCmdDrawIndexedIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700171 "VUID-vkCmdDrawIndexedIndirectCount-None-02697",
172 "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700173 "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600174 "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689",
175 "VUID-vkCmdDrawIndexedIndirectCount-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700176 "VUID-vkCmdDrawIndexedIndirectCount-None-02692",
177 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711",
178 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708",
179 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709"
Spencer Fricke507600b2020-03-22 13:23:06 -0700180 }},
181 {CMD_TRACERAYSNV, {
182 "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool",
183 "VUID-vkCmdTraceRaysNV-renderpass",
184 "VUID-vkCmdTraceRaysNV-None-02700",
185 "VUID-vkCmdTraceRaysNV-commandBuffer-02701",
186 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500187 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700188 "VUID-vkCmdTraceRaysNV-None-02697",
189 kVUIDUndefined, // render_pass_compatible
190 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700191 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600192 "VUID-vkCmdTraceRaysNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700193 "VUID-vkCmdTraceRaysNV-None-02692",
194 kVUIDUndefined, // indirect_protected_cb
195 kVUIDUndefined, // indirect_contiguous_memory;
196 kVUIDUndefined // indirect_buffer_bit
Spencer Fricke507600b2020-03-22 13:23:06 -0700197 }},
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500198 {CMD_TRACERAYSKHR, {
199 "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool",
200 "VUID-vkCmdTraceRaysKHR-renderpass",
201 "VUID-vkCmdTraceRaysKHR-None-02700",
202 "VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
203 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500204 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500205 "VUID-vkCmdTraceRaysKHR-None-02697",
206 kVUIDUndefined, // render_pass_compatible
207 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700208 kVUIDUndefined, // sample_location
Jeremy Kniager38162652020-06-25 14:05:03 -0600209 "VUID-vkCmdTraceRaysKHR-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700210 "VUID-vkCmdTraceRaysKHR-None-02692",
211 kVUIDUndefined, // indirect_protected_cb
212 kVUIDUndefined, // indirect_contiguous_memory;
213 kVUIDUndefined // indirect_buffer_bit
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500214 }},
215 {CMD_TRACERAYSINDIRECTKHR, {
216 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool",
217 "VUID-vkCmdTraceRaysIndirectKHR-renderpass",
218 "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
219 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
220 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500221 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500222 "VUID-vkCmdTraceRaysIndirectKHR-None-02697",
223 kVUIDUndefined, // render_pass_compatible
224 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700225 kVUIDUndefined, // sample_location
Jeremy Kniager38162652020-06-25 14:05:03 -0600226 "VUID-vkCmdTraceRaysIndirectKHR-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700227 "VUID-vkCmdTraceRaysIndirectKHR-None-02692",
228 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711",
229 "VUID-vkCmdTraceRaysIndirectKHR-buffer-02708",
230 "VUID-vkCmdTraceRaysIndirectKHR-buffer-02709"
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500231 }},
Spencer Fricke507600b2020-03-22 13:23:06 -0700232 {CMD_DRAWMESHTASKSNV, {
233 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool",
234 "VUID-vkCmdDrawMeshTasksNV-renderpass",
235 "VUID-vkCmdDrawMeshTasksNV-None-02700",
236 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
237 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500238 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700239 "VUID-vkCmdDrawMeshTasksNV-None-02697",
240 "VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700241 "VUID-vkCmdDrawMeshTasksNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600242 "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689",
243 "VUID-vkCmdDrawMeshTasksNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700244 "VUID-vkCmdDrawMeshTasksNV-None-02692",
245 kVUIDUndefined, // indirect_protected_cb
246 kVUIDUndefined, // indirect_contiguous_memory;
247 kVUIDUndefined // indirect_buffer_bit
Spencer Fricke507600b2020-03-22 13:23:06 -0700248 }},
249 {CMD_DRAWMESHTASKSINDIRECTNV, {
250 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
251 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass",
252 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
253 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701",
254 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500255 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700256 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02697",
257 "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700258 "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600259 "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689",
260 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700261 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02692",
262 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711",
263 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708",
264 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709"
Spencer Fricke507600b2020-03-22 13:23:06 -0700265 }},
266 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, {
267 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
268 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
269 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
270 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
271 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500272 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700273 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697",
274 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700275 "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600276 "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689",
277 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690",
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700278 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692",
279 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711",
280 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708",
281 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709"
Spencer Fricke507600b2020-03-22 13:23:06 -0700282 }},
283 // Used if invalid cmd_type is used
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700284 {CMD_NONE, {kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined}}
Spencer Fricke507600b2020-03-22 13:23:06 -0700285};
286// clang-format on
287
288// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
289const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
290 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
291 return drawdispatch_vuid.at(cmd_type);
292 } else {
293 return drawdispatch_vuid.at(CMD_NONE);
294 }
295}
296
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700297// Generic function to handle validation for all CmdDraw* type functions
298bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700299 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700300 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700301 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600302 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700303 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700304 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700305 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700306 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
307 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
308 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700309 }
310 return skip;
311}
312
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700313bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500314 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700315 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700316 VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700317}
318
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700319bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500320 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700321 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700322 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500323 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700324 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
325 unsigned int index_size = 0;
326 const auto &index_buffer_binding = cb_state->index_buffer_binding;
327 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
328 index_size = 2;
329 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
330 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600331 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
332 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700333 }
334 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
335 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700336 skip |=
337 LogError(index_buffer_binding.buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
338 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
339 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
340 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
341 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700342 }
343 }
344 return skip;
345}
346
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700347bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500348 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700349 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700350 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600351 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700352 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600353 if (count > 1) {
354 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
355 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
356 skip |=
357 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
358 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
359 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700360 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
361 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
362 return skip;
363}
364
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700365bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500366 uint32_t count, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700367 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
368 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600369 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700370 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()");
Lockee68ac652019-05-06 10:17:33 -0600371 if (count > 1) {
372 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
373 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
374 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
375 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
376 buffer_state);
377 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700378 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
379 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
380 // 'buffer'.
381 return skip;
382}
383
Jeff Bolz5c801d12019-10-09 10:38:45 -0500384bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600385 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600386 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700387 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600388 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700389}
390
Jeff Bolz5c801d12019-10-09 10:38:45 -0500391bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700392 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700393 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700394 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700395 return skip;
396}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700397bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
398 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700399 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700400 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700401 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
402 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-02836",
403 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
404 "call this command.",
405 apiName);
406 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700407 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
408 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600409 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600410 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700411 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
412 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700413 }
414
Tony-LunarG83544c72020-01-17 12:30:19 -0700415 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700416 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600417 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700418 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECTCOUNT, apiName);
Tony-LunarG83544c72020-01-17 12:30:19 -0700419 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Tony-LunarG83544c72020-01-17 12:30:19 -0700420 skip |=
421 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
422 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700423 return skip;
424}
425
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700426bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
427 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
428 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700429 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700430 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700431}
432
433bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
434 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
435 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700436 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700437 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700438}
439
440bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
441 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700442 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700443 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700444 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
445 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-None-02837",
446 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
447 "call this command.",
448 apiName);
449 }
sfricke-samsungf692b972020-05-02 08:00:45 -0700450 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
451 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600452 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600453 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800454 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700455 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700456 }
457
sfricke-samsungf692b972020-05-02 08:00:45 -0700458 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
459 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600460 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700461 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName);
sfricke-samsungf692b972020-05-02 08:00:45 -0700462 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700463 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700464 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800465 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700466 return skip;
467}
468
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700469bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
470 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
471 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700472 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
473 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700474}
475
476bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
477 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
478 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700479 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
480 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700481}
482
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500483bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
484 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
485 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
486 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
487 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
488 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
489 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700490 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
491 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
sourav parmard1521802020-06-07 21:49:02 -0700492 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
493 skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
494 auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
495 if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
496 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
497 "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
498 " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
499 callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
500 }
501 auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
502 if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
503 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
504 "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
505 " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
506 hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
507 }
508 auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
509 if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
510 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
511 "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
512 " must be less than the size of missShaderBindingTableBuffer" PRIu64 " .",
513 missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
514 }
515 auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
516 if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
517 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
518 "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
519 " must be less than the size of raygenShaderBindingTableBuffer" PRIu64 " .",
520 raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
521 }
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500522 return skip;
523}
524
Jason Macnak67407e72019-07-11 11:05:09 -0700525void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
526 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
527 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
528 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
529 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
530 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
531 uint32_t width, uint32_t height, uint32_t depth) {
532 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600533 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jason Macnak67407e72019-07-11 11:05:09 -0700534 cb_state->hasTraceRaysCmd = true;
535}
536
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500537bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
538 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
539 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
540 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
541 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
542 uint32_t height, uint32_t depth) const {
543 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
544 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
545 return skip;
546}
547
548void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
549 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
550 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
551 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
552 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
553 uint32_t height, uint32_t depth) {
554 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600555 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500556 cb_state->hasTraceRaysCmd = true;
557}
558
559bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
560 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
561 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
562 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
563 const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
564 VkBuffer buffer, VkDeviceSize offset) const {
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700565 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSINDIRECTKHR,
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500566 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700567 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_TRACERAYSINDIRECTKHR, "vkCmdTraceRaysIndirectKHR()");
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500568 return skip;
569}
570
571void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
572 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
573 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
574 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
575 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
576 VkDeviceSize offset) {
577 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
578 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600579 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500580 cb_state->hasTraceRaysCmd = true;
581 AddCommandBufferBindingBuffer(cb_state, buffer_state);
582}
583
Jeff Bolz5c801d12019-10-09 10:38:45 -0500584bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700585 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
586 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700587 return skip;
588}
589
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700590bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500591 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700592 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700593 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600594 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700595 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTNV, "vkCmdDrawMeshTasksIndirectNV()");
Lockee68ac652019-05-06 10:17:33 -0600596 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600597 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
598 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
599 drawCount, offset, buffer_state);
600 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700601 return skip;
602}
603
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700604bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
605 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500606 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700607 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700608 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600609 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
610 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsung0c45edc2020-07-01 22:19:53 -0700611 skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTCOUNTNV, "vkCmdDrawMeshTasksIndirectCountNV()");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700612 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600613 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700614 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700615 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
616 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600617 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
618 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
619 if (maxDrawCount > 1) {
620 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
621 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
622 maxDrawCount, offset, buffer_state);
623 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700624 return skip;
625}