blob: d0046ef898403dc8250e8d0d63d4723212b2d66e [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>
36 */
37
Jasper St. Pierre512613a2019-04-08 16:25:23 -070038#include "chassis.h"
39#include "core_validation.h"
40
Spencer Fricke507600b2020-03-22 13:23:06 -070041// This LUT is created to allow a static listing of each VUID that is covered by drawdispatch commands
42// clang-format off
43static const std::map<CMD_TYPE, DrawDispatchVuid> drawdispatch_vuid = {
44 {CMD_DRAW, {
45 "VUID-vkCmdDraw-commandBuffer-cmdpool",
46 "VUID-vkCmdDraw-renderpass",
47 "VUID-vkCmdDraw-None-02700",
48 "VUID-vkCmdDraw-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050049 "VUID-vkCmdDraw-None-04007",
50 "VUID-vkCmdDraw-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070051 "VUID-vkCmdDraw-None-02697",
52 "VUID-vkCmdDraw-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070053 "VUID-vkCmdDraw-subpass-02685",
54 "VUID-vkCmdDraw-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -070055 }},
56 {CMD_DRAWINDEXED, {
57 "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
58 "VUID-vkCmdDrawIndexed-renderpass",
59 "VUID-vkCmdDrawIndexed-None-02700",
60 "VUID-vkCmdDrawIndexed-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050061 "VUID-vkCmdDrawIndexed-None-04007",
62 "VUID-vkCmdDrawIndexed-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070063 "VUID-vkCmdDrawIndexed-None-02697",
64 "VUID-vkCmdDrawIndexed-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070065 "VUID-vkCmdDrawIndexed-subpass-02685",
66 "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -070067 }},
68 {CMD_DRAWINDIRECT, {
69 "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
70 "VUID-vkCmdDrawIndirect-renderpass",
71 "VUID-vkCmdDrawIndirect-None-02700",
72 "VUID-vkCmdDrawIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050073 "VUID-vkCmdDrawIndirect-None-04007",
74 "VUID-vkCmdDrawIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070075 "VUID-vkCmdDrawIndirect-None-02697",
76 "VUID-vkCmdDrawIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070077 "VUID-vkCmdDrawIndirect-subpass-02685",
78 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -070079 }},
80 {CMD_DRAWINDEXEDINDIRECT, {
81 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool",
82 "VUID-vkCmdDrawIndexedIndirect-renderpass",
83 "VUID-vkCmdDrawIndexedIndirect-None-02700",
84 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -050085 "VUID-vkCmdDrawIndexedIndirect-None-04007",
86 "VUID-vkCmdDrawIndexedIndirect-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -070087 "VUID-vkCmdDrawIndexedIndirect-None-02697",
88 "VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -070089 "VUID-vkCmdDrawIndexedIndirect-subpass-02685",
90 "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -070091 }},
92 {CMD_DISPATCH, {
93 "VUID-vkCmdDispatch-commandBuffer-cmdpool",
94 "VUID-vkCmdDispatch-renderpass",
95 "VUID-vkCmdDispatch-None-02700",
96 kVUIDUndefined, // dynamic_state
97 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -050098 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -070099 "VUID-vkCmdDispatch-None-02697",
100 kVUIDUndefined, // render_pass_compatible
101 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700102 kVUIDUndefined, // sample_location
Spencer Fricke507600b2020-03-22 13:23:06 -0700103 }},
104 {CMD_DISPATCHINDIRECT, {
105 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
106 "VUID-vkCmdDispatchIndirect-renderpass",
107 "VUID-vkCmdDispatchIndirect-None-02700",
108 kVUIDUndefined, // dynamic_state
109 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500110 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700111 "VUID-vkCmdDispatchIndirect-None-02697",
112 kVUIDUndefined, // render_pass_compatible
113 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700114 kVUIDUndefined, // sample_location
Spencer Fricke507600b2020-03-22 13:23:06 -0700115 }},
116 {CMD_DRAWINDIRECTCOUNT, {
117 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
118 "VUID-vkCmdDrawIndirectCount-renderpass",
119 "VUID-vkCmdDrawIndirectCount-None-02700",
120 "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500121 "VUID-vkCmdDrawIndirectCount-None-04007",
122 "VUID-vkCmdDrawIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700123 "VUID-vkCmdDrawIndirectCount-None-02697",
124 "VUID-vkCmdDrawIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700125 "VUID-vkCmdDrawIndirectCount-subpass-02685",
126 "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700127 }},
128 {CMD_DRAWINDEXEDINDIRECTCOUNT,{
129 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
130 "VUID-vkCmdDrawIndexedIndirectCount-renderpass",
131 "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
132 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
Jeff Bolz165818a2020-05-08 11:19:03 -0500133 "VUID-vkCmdDrawIndexedIndirectCount-None-04007",
134 "VUID-vkCmdDrawIndexedIndirectCount-None-04008",
Spencer Fricke507600b2020-03-22 13:23:06 -0700135 "VUID-vkCmdDrawIndexedIndirectCount-None-02697",
136 "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700137 "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685",
138 "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700139 }},
140 {CMD_TRACERAYSNV, {
141 "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool",
142 "VUID-vkCmdTraceRaysNV-renderpass",
143 "VUID-vkCmdTraceRaysNV-None-02700",
144 "VUID-vkCmdTraceRaysNV-commandBuffer-02701",
145 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500146 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700147 "VUID-vkCmdTraceRaysNV-None-02697",
148 kVUIDUndefined, // render_pass_compatible
149 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700150 kVUIDUndefined, // sample_location
Spencer Fricke507600b2020-03-22 13:23:06 -0700151 }},
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500152 {CMD_TRACERAYSKHR, {
153 "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool",
154 "VUID-vkCmdTraceRaysKHR-renderpass",
155 "VUID-vkCmdTraceRaysKHR-None-02700",
156 "VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
157 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500158 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500159 "VUID-vkCmdTraceRaysKHR-None-02697",
160 kVUIDUndefined, // render_pass_compatible
161 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700162 kVUIDUndefined, // sample_location
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500163 }},
164 {CMD_TRACERAYSINDIRECTKHR, {
165 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool",
166 "VUID-vkCmdTraceRaysIndirectKHR-renderpass",
167 "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
168 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
169 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500170 kVUIDUndefined, // vertex_binding_null
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500171 "VUID-vkCmdTraceRaysIndirectKHR-None-02697",
172 kVUIDUndefined, // render_pass_compatible
173 kVUIDUndefined, // subpass_index
sfricke-samsung8f658d42020-05-03 20:12:24 -0700174 kVUIDUndefined, // sample_location
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500175 }},
Spencer Fricke507600b2020-03-22 13:23:06 -0700176 {CMD_DRAWMESHTASKSNV, {
177 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool",
178 "VUID-vkCmdDrawMeshTasksNV-renderpass",
179 "VUID-vkCmdDrawMeshTasksNV-None-02700",
180 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
181 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500182 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700183 "VUID-vkCmdDrawMeshTasksNV-None-02697",
184 "VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700185 "VUID-vkCmdDrawMeshTasksNV-subpass-02685",
186 "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700187 }},
188 {CMD_DRAWMESHTASKSINDIRECTNV, {
189 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
190 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass",
191 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
192 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701",
193 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500194 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700195 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02697",
196 "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700197 "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685",
198 "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700199 }},
200 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, {
201 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
202 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
203 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
204 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
205 kVUIDUndefined, // vertex_binding
Jeff Bolz165818a2020-05-08 11:19:03 -0500206 kVUIDUndefined, // vertex_binding_null
Spencer Fricke507600b2020-03-22 13:23:06 -0700207 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697",
208 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
sfricke-samsung8f658d42020-05-03 20:12:24 -0700209 "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685",
210 "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689"
Spencer Fricke507600b2020-03-22 13:23:06 -0700211 }},
212 // Used if invalid cmd_type is used
sfricke-samsung8f658d42020-05-03 20:12:24 -0700213 {CMD_NONE, {kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined}}
Spencer Fricke507600b2020-03-22 13:23:06 -0700214};
215// clang-format on
216
217// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
218const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
219 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
220 return drawdispatch_vuid.at(cmd_type);
221 } else {
222 return drawdispatch_vuid.at(CMD_NONE);
223 }
224}
225
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700226// Generic function to handle validation for all CmdDraw* type functions
227bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700228 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700229 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700230 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600231 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700232 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700233 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700234 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700235 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
236 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
237 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700238 }
239 return skip;
240}
241
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700242bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500243 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700244 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700245 VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700246}
247
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700248bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500249 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700250 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700251 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500252 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700253 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
254 unsigned int index_size = 0;
255 const auto &index_buffer_binding = cb_state->index_buffer_binding;
256 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
257 index_size = 2;
258 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
259 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600260 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
261 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700262 }
263 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
264 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700265 skip |=
266 LogError(index_buffer_binding.buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
267 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
268 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
269 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
270 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700271 }
272 }
273 return skip;
274}
275
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700276bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500277 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700278 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700279 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600280 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600281 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirect()", "VUID-vkCmdDrawIndirect-buffer-02708");
282 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDrawIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700283 "vkCmdDrawIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600284 if (count > 1) {
285 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
286 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
287 skip |=
288 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
289 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
290 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700291 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
292 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
293 return skip;
294}
295
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700296bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500297 uint32_t count, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700298 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
299 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600300 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600301 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirect()", "VUID-vkCmdDrawIndexedIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700302 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600303 "VUID-vkCmdDrawIndexedIndirect-buffer-02709", "vkCmdDrawIndexedIndirect()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700304 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600305 if (count > 1) {
306 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
307 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
308 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
309 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
310 buffer_state);
311 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700312 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
313 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
314 // 'buffer'.
315 return skip;
316}
317
Jeff Bolz5c801d12019-10-09 10:38:45 -0500318bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600319 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600320 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700321 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600322 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700323}
324
Jeff Bolz5c801d12019-10-09 10:38:45 -0500325bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700326 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700327 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600328 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600329 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDispatchIndirect()", "VUID-vkCmdDispatchIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700330 skip |=
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600331 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDispatchIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700332 "vkCmdDispatchIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700333 return skip;
334}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700335bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
336 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700337 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700338 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700339 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
340 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-02836",
341 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
342 "call this command.",
343 apiName);
344 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700345 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
346 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600347 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600348 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700349 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
350 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700351 }
352
Tony-LunarG83544c72020-01-17 12:30:19 -0700353 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700354 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600355 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
356 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700357 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-buffer-02708");
358 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700359 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarG83544c72020-01-17 12:30:19 -0700360 "VUID-vkCmdDrawIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
361 skip |=
362 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
363 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700364 return skip;
365}
366
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700367bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
368 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
369 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700370 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700371 "vkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700372}
373
374bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
375 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
376 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700377 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700378 "vkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700379}
380
381bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
382 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
sfricke-samsungf692b972020-05-02 08:00:45 -0700383 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700384 bool skip = false;
sfricke-samsung27c70722020-05-02 08:42:39 -0700385 if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
386 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-None-02837",
387 "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
388 "call this command.",
389 apiName);
390 }
sfricke-samsungf692b972020-05-02 08:00:45 -0700391 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
392 sizeof(VkDrawIndexedIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600393 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600394 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800395 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
sfricke-samsungf692b972020-05-02 08:00:45 -0700396 apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700397 }
398
sfricke-samsungf692b972020-05-02 08:00:45 -0700399 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
400 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600401 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
402 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
sfricke-samsungf692b972020-05-02 08:00:45 -0700403 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
404 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
405 skip |=
406 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
407 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700408 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700409 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800410 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700411 return skip;
412}
413
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700414bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
415 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
416 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700417 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
418 "vkCmdDrawIndexedIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700419}
420
421bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
422 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
423 uint32_t maxDrawCount, uint32_t stride) const {
sfricke-samsungf692b972020-05-02 08:00:45 -0700424 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
425 "vkCmdDrawIndexedIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700426}
427
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500428bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
429 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
430 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
431 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
432 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
433 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
434 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700435 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
436 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
sourav parmard1521802020-06-07 21:49:02 -0700437 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
438 skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
439 auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
440 if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
441 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
442 "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
443 " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
444 callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
445 }
446 auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
447 if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
448 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
449 "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
450 " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
451 hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
452 }
453 auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
454 if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
455 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
456 "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
457 " must be less than the size of missShaderBindingTableBuffer" PRIu64 " .",
458 missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
459 }
460 auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
461 if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
462 skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
463 "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
464 " must be less than the size of raygenShaderBindingTableBuffer" PRIu64 " .",
465 raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
466 }
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500467 return skip;
468}
469
Jason Macnak67407e72019-07-11 11:05:09 -0700470void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
471 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
472 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
473 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
474 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
475 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
476 uint32_t width, uint32_t height, uint32_t depth) {
477 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600478 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
Jason Macnak67407e72019-07-11 11:05:09 -0700479 cb_state->hasTraceRaysCmd = true;
480}
481
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500482bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
483 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
484 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
485 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
486 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
487 uint32_t height, uint32_t depth) const {
488 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
489 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
490 return skip;
491}
492
493void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
494 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
495 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
496 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
497 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
498 uint32_t height, uint32_t depth) {
499 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600500 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500501 cb_state->hasTraceRaysCmd = true;
502}
503
504bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
505 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
506 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
507 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
508 const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
509 VkBuffer buffer, VkDeviceSize offset) const {
510 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
511 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
512 return skip;
513}
514
515void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
516 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
517 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
518 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
519 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
520 VkDeviceSize offset) {
521 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
522 BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jeremy Kniager05631e72020-06-08 14:21:35 -0600523 UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500524 cb_state->hasTraceRaysCmd = true;
525 AddCommandBufferBindingBuffer(cb_state, buffer_state);
526}
527
Jeff Bolz5c801d12019-10-09 10:38:45 -0500528bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700529 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
530 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700531 return skip;
532}
533
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700534bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500535 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700536 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700537 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600538 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700539 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600540 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700541 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600542 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700543 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600544 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600545 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
546 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
547 drawCount, offset, buffer_state);
548 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700549 return skip;
550}
551
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700552bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
553 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500554 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700555 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700556 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600557 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
558 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700559 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600560 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700561 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600562 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700563 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700564 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawMeshTasksIndirectCountNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700565 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
566 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
sfricke-samsungf692b972020-05-02 08:00:45 -0700567 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
568 "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600569 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
570 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
571 if (maxDrawCount > 1) {
572 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
573 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
574 maxDrawCount, offset, buffer_state);
575 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700576 return skip;
577}