blob: f31d33314eca6933b077ba7d5e0192c106b28c6e [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",
57 "VUID-vkCmdDraw-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -070058 }},
59 {CMD_DRAWINDEXED, {
60 "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
61 "VUID-vkCmdDrawIndexed-renderpass",
62 "VUID-vkCmdDrawIndexed-None-02700",
63 "VUID-vkCmdDrawIndexed-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050064 "VUID-vkCmdDrawIndexed-None-04007",
65 "VUID-vkCmdDrawIndexed-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070066 "VUID-vkCmdDrawIndexed-None-02697",
67 "VUID-vkCmdDrawIndexed-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070068 "VUID-vkCmdDrawIndexed-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060069 "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689",
70 "VUID-vkCmdDrawIndexed-None-02690",
71 "VUID-vkCmdDrawIndexed-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -070072 }},
73 {CMD_DRAWINDIRECT, {
74 "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
75 "VUID-vkCmdDrawIndirect-renderpass",
76 "VUID-vkCmdDrawIndirect-None-02700",
77 "VUID-vkCmdDrawIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050078 "VUID-vkCmdDrawIndirect-None-04007",
79 "VUID-vkCmdDrawIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070080 "VUID-vkCmdDrawIndirect-None-02697",
81 "VUID-vkCmdDrawIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070082 "VUID-vkCmdDrawIndirect-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060083 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689",
84 "VUID-vkCmdDrawIndirect-None-02690",
85 "VUID-vkCmdDrawIndirect-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -070086 }},
87 {CMD_DRAWINDEXEDINDIRECT, {
88 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool",
89 "VUID-vkCmdDrawIndexedIndirect-renderpass",
90 "VUID-vkCmdDrawIndexedIndirect-None-02700",
91 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050092 "VUID-vkCmdDrawIndexedIndirect-None-04007",
93 "VUID-vkCmdDrawIndexedIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070094 "VUID-vkCmdDrawIndexedIndirect-None-02697",
95 "VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070096 "VUID-vkCmdDrawIndexedIndirect-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -060097 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689",
98 "VUID-vkCmdDrawIndexedIndirect-None-02690",
99 "VUID-vkCmdDrawIndexedIndirect-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -0700100 }},
101 {CMD_DISPATCH, {
102 "VUID-vkCmdDispatch-commandBuffer-cmdpool",
103 "VUID-vkCmdDispatch-renderpass",
104 "VUID-vkCmdDispatch-None-02700",
105 kVUIDUndefined, // dynamic_state
106 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500107 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700108 "VUID-vkCmdDispatch-None-02697",
109 kVUIDUndefined, // render_pass_compatible
110 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700111 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600112 "VUID-vkCmdDispatch-None-02690",
113 "VUID-vkCmdDispatch-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -0700114 }},
115 {CMD_DISPATCHINDIRECT, {
116 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
117 "VUID-vkCmdDispatchIndirect-renderpass",
118 "VUID-vkCmdDispatchIndirect-None-02700",
119 kVUIDUndefined, // dynamic_state
120 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500121 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700122 "VUID-vkCmdDispatchIndirect-None-02697",
123 kVUIDUndefined, // render_pass_compatible
124 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700125 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600126 "VUID-vkCmdDispatchIndirect-None-02690",
127 "VUID-vkCmdDispatchIndirect-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -0700128 }},
129 {CMD_DRAWINDIRECTCOUNT, {
130 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
131 "VUID-vkCmdDrawIndirectCount-renderpass",
132 "VUID-vkCmdDrawIndirectCount-None-02700",
133 "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500134 "VUID-vkCmdDrawIndirectCount-None-04007",
135 "VUID-vkCmdDrawIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700136 "VUID-vkCmdDrawIndirectCount-None-02697",
137 "VUID-vkCmdDrawIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700138 "VUID-vkCmdDrawIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600139 "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689",
140 "VUID-vkCmdDrawIndirectCount-None-02690",
141 "VUID-vkCmdDrawIndirectCount-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -0700142 }},
143 {CMD_DRAWINDEXEDINDIRECTCOUNT,{
144 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
145 "VUID-vkCmdDrawIndexedIndirectCount-renderpass",
146 "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
147 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500148 "VUID-vkCmdDrawIndexedIndirectCount-None-04007",
149 "VUID-vkCmdDrawIndexedIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700150 "VUID-vkCmdDrawIndexedIndirectCount-None-02697",
151 "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700152 "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600153 "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689",
154 "VUID-vkCmdDrawIndexedIndirectCount-None-02690",
155 "VUID-vkCmdDrawIndexedIndirectCount-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -0700156 }},
157 {CMD_TRACERAYSNV, {
158 "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool",
159 "VUID-vkCmdTraceRaysNV-renderpass",
160 "VUID-vkCmdTraceRaysNV-None-02700",
161 "VUID-vkCmdTraceRaysNV-commandBuffer-02701",
162 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500163 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700164 "VUID-vkCmdTraceRaysNV-None-02697",
165 kVUIDUndefined, // render_pass_compatible
166 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700167 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600168 "VUID-vkCmdTraceRaysNV-None-02690",
169 "VUID-vkCmdTraceRaysNV-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -0700170 }},
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500171 {CMD_TRACERAYSKHR, {
172 "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool",
173 "VUID-vkCmdTraceRaysKHR-renderpass",
174 "VUID-vkCmdTraceRaysKHR-None-02700",
175 "VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
176 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500177 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500178 "VUID-vkCmdTraceRaysKHR-None-02697",
179 kVUIDUndefined, // render_pass_compatible
180 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700181 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600182 kVUIDUndefined, // linear_sampler
183 kVUIDUndefined // cubic_sampler
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500184 }},
185 {CMD_TRACERAYSINDIRECTKHR, {
186 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool",
187 "VUID-vkCmdTraceRaysIndirectKHR-renderpass",
188 "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
189 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
190 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500191 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500192 "VUID-vkCmdTraceRaysIndirectKHR-None-02697",
193 kVUIDUndefined, // render_pass_compatible
194 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700195 kVUIDUndefined, // sample_location
Jeremy Kniagere6827432020-04-01 09:05:56 -0600196 "VUID-vkCmdTraceRaysKHR-None-02690",
197 "VUID-vkCmdTraceRaysKHR-None-02692"
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500198 }},
Spencer Fricke507600b2020-03-22 13:23:06 -0700199 {CMD_DRAWMESHTASKSNV, {
200 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool",
201 "VUID-vkCmdDrawMeshTasksNV-renderpass",
202 "VUID-vkCmdDrawMeshTasksNV-None-02700",
203 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
204 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500205 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700206 "VUID-vkCmdDrawMeshTasksNV-None-02697",
207 "VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700208 "VUID-vkCmdDrawMeshTasksNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600209 "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689",
210 "VUID-vkCmdDrawMeshTasksNV-None-02690",
211 "VUID-vkCmdDrawMeshTasksNV-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -0700212 }},
213 {CMD_DRAWMESHTASKSINDIRECTNV, {
214 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
215 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass",
216 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
217 "VUID-vkCmdDrawMeshTasksIndirectNV-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-vkCmdDrawMeshTasksIndirectNV-None-02697",
221 "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700222 "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600223 "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689",
224 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02690",
225 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -0700226 }},
227 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, {
228 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
229 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
230 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
231 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
232 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500233 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700234 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697",
235 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700236 "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685",
Jeremy Kniagere6827432020-04-01 09:05:56 -0600237 "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689",
238 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690",
239 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692"
Spencer Fricke507600b2020-03-22 13:23:06 -0700240 }},
241 // Used if invalid cmd_type is used
Jeremy Kniagere6827432020-04-01 09:05:56 -0600242 {CMD_NONE, {kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined}}
Spencer Fricke507600b2020-03-22 13:23:06 -0700243};
244// clang-format on
245
246// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
247const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
248 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
249 return drawdispatch_vuid.at(cmd_type);
250 } else {
251 return drawdispatch_vuid.at(CMD_NONE);
252 }
253}
254
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700255// Generic function to handle validation for all CmdDraw* type functions
256bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700257 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700258 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700259 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600260 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700261 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700262 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700263 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700264 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
265 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
266 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700267 }
268 return skip;
269}
270
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700271bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500272 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700273 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700274 VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700275}
276
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700277bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500278 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700279 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700280 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500281 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700282 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
283 unsigned int index_size = 0;
284 const auto &index_buffer_binding = cb_state->index_buffer_binding;
285 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
286 index_size = 2;
287 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
288 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600289 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
290 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700291 }
292 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
293 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700294 skip |=
295 LogError(index_buffer_binding.buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
296 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
297 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
298 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
299 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700300 }
301 }
302 return skip;
303}
304
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700305bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500306 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700307 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700308 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600309 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600310 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirect()", "VUID-vkCmdDrawIndirect-buffer-02708");
311 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDrawIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700312 "vkCmdDrawIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600313 if (count > 1) {
314 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
315 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
316 skip |=
317 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
318 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
319 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700320 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
321 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
322 return skip;
323}
324
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700325bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500326 uint32_t count, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700327 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
328 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600329 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600330 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirect()", "VUID-vkCmdDrawIndexedIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700331 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600332 "VUID-vkCmdDrawIndexedIndirect-buffer-02709", "vkCmdDrawIndexedIndirect()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700333 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600334 if (count > 1) {
335 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
336 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
337 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
338 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
339 buffer_state);
340 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700341 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
342 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
343 // 'buffer'.
344 return skip;
345}
346
Jeff Bolz5c801d12019-10-09 10:38:45 -0500347bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600348 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600349 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700350 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600351 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700352}
353
Jeff Bolz5c801d12019-10-09 10:38:45 -0500354bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700355 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700356 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600357 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600358 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDispatchIndirect()", "VUID-vkCmdDispatchIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700359 skip |=
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600360 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDispatchIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700361 "vkCmdDispatchIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700362 return skip;
363}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700364bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
365 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700366 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700367 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700368 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
369 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-02836",
370 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
371 "call this command.",
372 apiName);
373 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700374 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
375 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600376 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600377 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700378 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
379 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700380 }
381
Tony-LunarG83544c72020-01-17 12:30:19 -0700382 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700383 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600384 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
385 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700386 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-buffer-02708");
387 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700388 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarG83544c72020-01-17 12:30:19 -0700389 "VUID-vkCmdDrawIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
390 skip |=
391 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
392 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700393 return skip;
394}
395
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700396bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
397 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
398 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700399 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700400 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700401}
402
403bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
404 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
405 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700406 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700407 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700408}
409
410bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
411 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700412 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700413 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700414 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
415 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-None-02837",
416 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
417 "call this command.",
418 apiName);
419 }
sfricke-samsungf692b972020-05-02 08:00:45 -0700420 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
421 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600422 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600423 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800424 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700425 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700426 }
427
sfricke-samsungf692b972020-05-02 08:00:45 -0700428 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
429 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600430 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
431 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsungf692b972020-05-02 08:00:45 -0700432 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
433 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
434 skip |=
435 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
436 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700437 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700438 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800439 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700440 return skip;
441}
442
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700443bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
444 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
445 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700446 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
447 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700448}
449
450bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
451 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
452 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700453 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
454 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700455}
456
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500457bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
458 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
459 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
460 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
461 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
462 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
463 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700464 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
465 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
sourav parmard1521802020-06-07 21:49:02 -0700466 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
467 skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
468 auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
469 if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
470 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
471 "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
472 " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
473 callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
474 }
475 auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
476 if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
477 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
478 "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
479 " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
480 hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
481 }
482 auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
483 if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
484 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
485 "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
486 " must be less than the size of missShaderBindingTableBuffer" PRIu64 " .",
487 missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
488 }
489 auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
490 if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
491 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
492 "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
493 " must be less than the size of raygenShaderBindingTableBuffer" PRIu64 " .",
494 raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
495 }
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500496 return skip;
497}
498
Jason Macnak67407e72019-07-11 11:05:09 -0700499void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
500 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
501 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
502 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
503 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
504 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
505 uint32_t width, uint32_t height, uint32_t depth) {
506 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600507 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jason Macnak67407e72019-07-11 11:05:09 -0700508 cb_state->hasTraceRaysCmd = true;
509}
510
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500511bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
512 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
513 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
514 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
515 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
516 uint32_t height, uint32_t depth) const {
517 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
518 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
519 return skip;
520}
521
522void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
523 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
524 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
525 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
526 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
527 uint32_t height, uint32_t depth) {
528 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600529 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500530 cb_state->hasTraceRaysCmd = true;
531}
532
533bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
534 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
535 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
536 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
537 const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
538 VkBuffer buffer, VkDeviceSize offset) const {
539 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
540 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
541 return skip;
542}
543
544void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
545 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
546 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
547 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
548 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
549 VkDeviceSize offset) {
550 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
551 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600552 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500553 cb_state->hasTraceRaysCmd = true;
554 AddCommandBufferBindingBuffer(cb_state, buffer_state);
555}
556
Jeff Bolz5c801d12019-10-09 10:38:45 -0500557bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700558 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
559 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700560 return skip;
561}
562
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700563bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500564 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700565 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700566 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600567 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700568 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600569 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700570 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600571 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700572 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600573 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600574 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
575 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
576 drawCount, offset, buffer_state);
577 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700578 return skip;
579}
580
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700581bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
582 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500583 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700584 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700585 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600586 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
587 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700588 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600589 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700590 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600591 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700592 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700593 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawMeshTasksIndirectCountNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700594 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
595 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700596 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
597 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600598 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
599 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
600 if (maxDrawCount > 1) {
601 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
602 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
603 maxDrawCount, offset, buffer_state);
604 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700605 return skip;
606}