blob: 7c232aabbf0d1ab01ce08cb2790eba9efaf5732e [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",
49 "VUID-vkCmdDraw-None-02720",
50 "VUID-vkCmdDraw-None-02697",
51 "VUID-vkCmdDraw-renderPass-02684",
52 "VUID-vkCmdDraw-subpass-02685"
53 }},
54 {CMD_DRAWINDEXED, {
55 "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
56 "VUID-vkCmdDrawIndexed-renderpass",
57 "VUID-vkCmdDrawIndexed-None-02700",
58 "VUID-vkCmdDrawIndexed-commandBuffer-02701",
59 "VUID-vkCmdDrawIndexed-None-02720",
60 "VUID-vkCmdDrawIndexed-None-02697",
61 "VUID-vkCmdDrawIndexed-renderPass-02684",
62 "VUID-vkCmdDrawIndexed-subpass-02685"
63 }},
64 {CMD_DRAWINDIRECT, {
65 "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
66 "VUID-vkCmdDrawIndirect-renderpass",
67 "VUID-vkCmdDrawIndirect-None-02700",
68 "VUID-vkCmdDrawIndirect-commandBuffer-02701",
69 "VUID-vkCmdDrawIndirect-None-02720",
70 "VUID-vkCmdDrawIndirect-None-02697",
71 "VUID-vkCmdDrawIndirect-renderPass-02684",
72 "VUID-vkCmdDrawIndirect-subpass-02685"
73 }},
74 {CMD_DRAWINDEXEDINDIRECT, {
75 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool",
76 "VUID-vkCmdDrawIndexedIndirect-renderpass",
77 "VUID-vkCmdDrawIndexedIndirect-None-02700",
78 "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
79 "VUID-vkCmdDrawIndexedIndirect-None-02720",
80 "VUID-vkCmdDrawIndexedIndirect-None-02697",
81 "VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
82 "VUID-vkCmdDrawIndexedIndirect-subpass-02685"
83 }},
84 {CMD_DISPATCH, {
85 "VUID-vkCmdDispatch-commandBuffer-cmdpool",
86 "VUID-vkCmdDispatch-renderpass",
87 "VUID-vkCmdDispatch-None-02700",
88 kVUIDUndefined, // dynamic_state
89 kVUIDUndefined, // vertex_binding
90 "VUID-vkCmdDispatch-None-02697",
91 kVUIDUndefined, // render_pass_compatible
92 kVUIDUndefined, // subpass_index
93 }},
94 {CMD_DISPATCHINDIRECT, {
95 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
96 "VUID-vkCmdDispatchIndirect-renderpass",
97 "VUID-vkCmdDispatchIndirect-None-02700",
98 kVUIDUndefined, // dynamic_state
99 kVUIDUndefined, // vertex_binding
100 "VUID-vkCmdDispatchIndirect-None-02697",
101 kVUIDUndefined, // render_pass_compatible
102 kVUIDUndefined, // subpass_index
103 }},
104 {CMD_DRAWINDIRECTCOUNT, {
105 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
106 "VUID-vkCmdDrawIndirectCount-renderpass",
107 "VUID-vkCmdDrawIndirectCount-None-02700",
108 "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
109 "VUID-vkCmdDrawIndirectCount-None-02720",
110 "VUID-vkCmdDrawIndirectCount-None-02697",
111 "VUID-vkCmdDrawIndirectCount-renderPass-02684",
112 "VUID-vkCmdDrawIndirectCount-subpass-02685"
113 }},
114 {CMD_DRAWINDEXEDINDIRECTCOUNT,{
115 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
116 "VUID-vkCmdDrawIndexedIndirectCount-renderpass",
117 "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
118 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
119 "VUID-vkCmdDrawIndexedIndirectCount-None-02720",
120 "VUID-vkCmdDrawIndexedIndirectCount-None-02697",
121 "VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
122 "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685"
123 }},
124 {CMD_TRACERAYSNV, {
125 "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool",
126 "VUID-vkCmdTraceRaysNV-renderpass",
127 "VUID-vkCmdTraceRaysNV-None-02700",
128 "VUID-vkCmdTraceRaysNV-commandBuffer-02701",
129 kVUIDUndefined, // vertex_binding
130 "VUID-vkCmdTraceRaysNV-None-02697",
131 kVUIDUndefined, // render_pass_compatible
132 kVUIDUndefined, // subpass_index
133 }},
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500134 {CMD_TRACERAYSKHR, {
135 "VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool",
136 "VUID-vkCmdTraceRaysKHR-renderpass",
137 "VUID-vkCmdTraceRaysKHR-None-02700",
138 "VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
139 kVUIDUndefined, // vertex_binding
140 "VUID-vkCmdTraceRaysKHR-None-02697",
141 kVUIDUndefined, // render_pass_compatible
142 kVUIDUndefined, // subpass_index
143 }},
144 {CMD_TRACERAYSINDIRECTKHR, {
145 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool",
146 "VUID-vkCmdTraceRaysIndirectKHR-renderpass",
147 "VUID-vkCmdTraceRaysIndirectKHR-None-02700",
148 "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
149 kVUIDUndefined, // vertex_binding
150 "VUID-vkCmdTraceRaysIndirectKHR-None-02697",
151 kVUIDUndefined, // render_pass_compatible
152 kVUIDUndefined, // subpass_index
153 }},
Spencer Fricke507600b2020-03-22 13:23:06 -0700154 {CMD_DRAWMESHTASKSNV, {
155 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool",
156 "VUID-vkCmdDrawMeshTasksNV-renderpass",
157 "VUID-vkCmdDrawMeshTasksNV-None-02700",
158 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
159 kVUIDUndefined, // vertex_binding
160 "VUID-vkCmdDrawMeshTasksNV-None-02697",
161 "VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
162 "VUID-vkCmdDrawMeshTasksNV-subpass-02685"
163 }},
164 {CMD_DRAWMESHTASKSINDIRECTNV, {
165 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
166 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass",
167 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
168 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701",
169 kVUIDUndefined, // vertex_binding
170 "VUID-vkCmdDrawMeshTasksIndirectNV-None-02697",
171 "VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
172 "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685"
173 }},
174 {CMD_DRAWMESHTASKSINDIRECTCOUNTNV, {
175 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
176 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
177 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
178 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
179 kVUIDUndefined, // vertex_binding
180 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697",
181 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
182 "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685"
183 }},
184 // Used if invalid cmd_type is used
185 {CMD_NONE, {kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined}}
186};
187// clang-format on
188
189// Getter function to provide kVUIDUndefined in case an invalid cmd_type is passed in
190const DrawDispatchVuid &CoreChecks::GetDrawDispatchVuid(CMD_TYPE cmd_type) const {
191 if (drawdispatch_vuid.find(cmd_type) != drawdispatch_vuid.cend()) {
192 return drawdispatch_vuid.at(cmd_type);
193 } else {
194 return drawdispatch_vuid.at(CMD_NONE);
195 }
196}
197
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700198// Generic function to handle validation for all CmdDraw* type functions
199bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
Spencer Fricke507600b2020-03-22 13:23:06 -0700200 const char *caller, VkQueueFlags queue_flags) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700201 bool skip = false;
Spencer Fricke507600b2020-03-22 13:23:06 -0700202 const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
John Zulauffbf3c202019-07-17 14:57:14 -0600203 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700204 if (cb_state) {
Spencer Fricke507600b2020-03-22 13:23:06 -0700205 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, vuid.queue_flag);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700206 skip |= ValidateCmd(cb_state, cmd_type, caller);
Spencer Fricke507600b2020-03-22 13:23:06 -0700207 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller);
208 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, vuid.inside_renderpass)
209 : InsideRenderPass(cb_state, caller, vuid.inside_renderpass);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700210 }
211 return skip;
212}
213
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700214bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500215 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700216 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700217 VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700218}
219
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700220bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500221 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700222 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700223 VK_QUEUE_GRAPHICS_BIT);
Jeff Bolz46c0ea02019-10-09 13:06:29 -0500224 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700225 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
226 unsigned int index_size = 0;
227 const auto &index_buffer_binding = cb_state->index_buffer_binding;
228 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
229 index_size = 2;
230 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
231 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600232 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
233 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700234 }
235 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
236 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700237 skip |=
238 LogError(index_buffer_binding.buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
239 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
240 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
241 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
242 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700243 }
244 }
245 return skip;
246}
247
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700248bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500249 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700250 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700251 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600252 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600253 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirect()", "VUID-vkCmdDrawIndirect-buffer-02708");
254 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDrawIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700255 "vkCmdDrawIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600256 if (count > 1) {
257 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
258 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
259 skip |=
260 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
261 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
262 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700263 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
264 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
265 return skip;
266}
267
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700268bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500269 uint32_t count, uint32_t stride) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700270 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
271 "vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600272 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600273 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirect()", "VUID-vkCmdDrawIndexedIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700274 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600275 "VUID-vkCmdDrawIndexedIndirect-buffer-02709", "vkCmdDrawIndexedIndirect()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700276 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600277 if (count > 1) {
278 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
279 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
280 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
281 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
282 buffer_state);
283 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700284 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
285 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
286 // 'buffer'.
287 return skip;
288}
289
Jeff Bolz5c801d12019-10-09 10:38:45 -0500290bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600291 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600292 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
Spencer Fricke507600b2020-03-22 13:23:06 -0700293 VK_QUEUE_COMPUTE_BIT);
Lockef39c0772019-04-03 14:40:02 -0600294 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700295}
296
Jeff Bolz5c801d12019-10-09 10:38:45 -0500297bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700298 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
Spencer Fricke507600b2020-03-22 13:23:06 -0700299 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_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, "vkCmdDispatchIndirect()", "VUID-vkCmdDispatchIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700302 skip |=
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600303 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDispatchIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700304 "vkCmdDispatchIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700305 return skip;
306}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700307bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
308 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700309 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700310 bool skip = false;
311 if (offset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700312 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-offset-02710",
313 "%s() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName, offset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700314 }
315
316 if (countBufferOffset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700317 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716",
318 "%s() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName,
319 countBufferOffset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700320 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700321 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
322 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600323 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600324 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700325 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
326 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700327 }
328
Tony-LunarG83544c72020-01-17 12:30:19 -0700329 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
Spencer Fricke507600b2020-03-22 13:23:06 -0700330 VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600331 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
332 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700333 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-buffer-02708");
334 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700335 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarG83544c72020-01-17 12:30:19 -0700336 "VUID-vkCmdDrawIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
337 skip |=
338 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
339 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700340 return skip;
341}
342
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700343bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
344 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
345 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700346 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
347 "VkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700348}
349
350bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
351 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
352 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700353 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
354 "VkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700355}
356
357bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
358 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
359 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700360 bool skip = false;
361 if (offset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700362 skip |= LogError(
363 commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710",
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700364 "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", offset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700365 }
366
367 if (countBufferOffset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700368 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716",
369 "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
370 "), is not a multiple of 4.",
371 countBufferOffset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700372 }
373
Mike Schuchardt65847d92019-12-20 13:50:47 -0800374 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride,
Lockee68ac652019-05-06 10:17:33 -0600375 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
376 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600377 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800378 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
Lockee68ac652019-05-06 10:17:33 -0600379 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset,
380 buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700381 }
382
Spencer Fricke507600b2020-03-22 13:23:06 -0700383 skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT,
384 "vkCmdDrawIndexedIndirectCount()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600385 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
386 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700387 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800388 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700389 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800390 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700391 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700392 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700393 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
394 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700395 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800396 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700397 return skip;
398}
399
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700400bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
401 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
402 uint32_t maxDrawCount, uint32_t stride) const {
403 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
404}
405
406bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
407 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
408 uint32_t maxDrawCount, uint32_t stride) const {
409 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
410}
411
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500412bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
413 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
414 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
415 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
416 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
417 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
418 uint32_t width, uint32_t height, uint32_t depth) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700419 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
420 "vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500421 return skip;
422}
423
Jason Macnak67407e72019-07-11 11:05:09 -0700424void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
425 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
426 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
427 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
428 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
429 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
430 uint32_t width, uint32_t height, uint32_t depth) {
431 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
432 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
433 cb_state->hasTraceRaysCmd = true;
434}
435
Jeff Bolz443c2ca2020-03-19 12:11:51 -0500436bool CoreChecks::PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
437 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
438 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
439 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
440 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
441 uint32_t height, uint32_t depth) const {
442 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
443 "vkCmdTraceRaysKHR()", VK_QUEUE_COMPUTE_BIT);
444 return skip;
445}
446
447void CoreChecks::PostCallRecordCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
448 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
449 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
450 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
451 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
452 uint32_t height, uint32_t depth) {
453 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
454 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
455 cb_state->hasTraceRaysCmd = true;
456}
457
458bool CoreChecks::PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
459 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
460 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
461 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
462 const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
463 VkBuffer buffer, VkDeviceSize offset) const {
464 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
465 "vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
466 return skip;
467}
468
469void CoreChecks::PostCallRecordCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
470 const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
471 const VkStridedBufferRegionKHR *pMissShaderBindingTable,
472 const VkStridedBufferRegionKHR *pHitShaderBindingTable,
473 const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
474 VkDeviceSize offset) {
475 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
476 BUFFER_STATE *buffer_state = GetBufferState(buffer);
477 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
478 cb_state->hasTraceRaysCmd = true;
479 AddCommandBufferBindingBuffer(cb_state, buffer_state);
480}
481
Jeff Bolz5c801d12019-10-09 10:38:45 -0500482bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Spencer Fricke507600b2020-03-22 13:23:06 -0700483 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
484 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700485 return skip;
486}
487
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700488bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500489 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700490 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700491 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600492 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700493 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600494 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700495 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600496 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700497 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600498 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600499 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
500 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
501 drawCount, offset, buffer_state);
502 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700503 return skip;
504}
505
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700506bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
507 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500508 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700509 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
Spencer Fricke507600b2020-03-22 13:23:06 -0700510 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
John Zulauffbf3c202019-07-17 14:57:14 -0600511 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
512 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700513 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600514 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700515 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600516 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700517 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700518 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700519 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
520 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700521 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
522 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600523 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
524 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
525 if (maxDrawCount > 1) {
526 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
527 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
528 maxDrawCount, offset, buffer_state);
529 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700530 return skip;
531}