blob: 8779d956ef84d47b82847581ee143781e8c09481 [file] [log] [blame]
Jasper St. Pierre512613a2019-04-08 16:25:23 -07001/* Copyright (c) 2015-2019 The Khronos Group Inc.
2 * Copyright (c) 2015-2019 Valve Corporation
3 * Copyright (c) 2015-2019 LunarG, Inc.
4 * Copyright (C) 2015-2019 Google Inc.
5 *
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
38// Allow use of STL min and max functions in Windows
39#define NOMINMAX
40
41#include "chassis.h"
42#include "core_validation.h"
43
Mark Lobodzinski89e997a2019-07-16 17:04:16 -060044static inline void UpdateResourceTrackingOnDraw(CMD_BUFFER_STATE *pCB) {
Mark Lobodzinski7f2abf02019-07-16 17:07:08 -060045 pCB->cb_vertex_buffer_binding_info.push_back(pCB->current_vertex_buffer_binding_info);
Mark Lobodzinski89e997a2019-07-16 17:04:16 -060046}
Jasper St. Pierre512613a2019-04-08 16:25:23 -070047
48// Generic function to handle validation for all CmdDraw* type functions
49bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
50 const char *caller, VkQueueFlags queue_flags, const char *queue_flag_code,
51 const char *renderpass_msg_code, const char *pipebound_msg_code,
John Zulauffbf3c202019-07-17 14:57:14 -060052 const char *dynamic_state_msg_code) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070053 bool skip = false;
John Zulauffbf3c202019-07-17 14:57:14 -060054 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -070055 if (cb_state) {
56 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, queue_flag_code);
57 skip |= ValidateCmd(cb_state, cmd_type, caller);
58 skip |=
59 ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller, pipebound_msg_code, dynamic_state_msg_code);
60 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, renderpass_msg_code)
61 : InsideRenderPass(cb_state, caller, renderpass_msg_code);
62 }
63 return skip;
64}
65
66// Generic function to handle state update for all CmdDraw* and CmdDispatch* type functions
John Zulauffbf3c202019-07-17 14:57:14 -060067void ValidationStateTracker::UpdateStateCmdDrawDispatchType(CMD_BUFFER_STATE *cb_state, VkPipelineBindPoint bind_point) {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070068 UpdateDrawState(cb_state, bind_point);
Tony-LunarG997811c2019-07-19 15:01:31 -060069 cb_state->hasDispatchCmd = true;
Jasper St. Pierre512613a2019-04-08 16:25:23 -070070}
71
72// Generic function to handle state update for all CmdDraw* type functions
John Zulauffbf3c202019-07-17 14:57:14 -060073void ValidationStateTracker::UpdateStateCmdDrawType(CMD_BUFFER_STATE *cb_state, VkPipelineBindPoint bind_point) {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070074 UpdateStateCmdDrawDispatchType(cb_state, bind_point);
75 UpdateResourceTrackingOnDraw(cb_state);
76 cb_state->hasDrawCmd = true;
77}
78
79bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
80 uint32_t firstVertex, uint32_t firstInstance) {
81 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
82 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDraw-commandBuffer-cmdpool", "VUID-vkCmdDraw-renderpass",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -060083 "VUID-vkCmdDraw-None-02700", "VUID-vkCmdDraw-commandBuffer-02701");
Jasper St. Pierre512613a2019-04-08 16:25:23 -070084}
85
86void CoreChecks::PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
87 uint32_t firstVertex, uint32_t firstInstance) {
88 GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
89}
90
John Zulauffbf3c202019-07-17 14:57:14 -060091void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
92 uint32_t firstVertex, uint32_t firstInstance) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -060093 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -070094 UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
95}
96
97bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
98 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
99 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
100 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600101 "VUID-vkCmdDrawIndexed-renderpass", "VUID-vkCmdDrawIndexed-None-02700",
102 "VUID-vkCmdDrawIndexed-commandBuffer-02701");
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600103 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700104 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
105 unsigned int index_size = 0;
106 const auto &index_buffer_binding = cb_state->index_buffer_binding;
107 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
108 index_size = 2;
109 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
110 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -0600111 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
112 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700113 }
114 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
115 if (end_offset > index_buffer_binding.size) {
116 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
117 HandleToUint64(index_buffer_binding.buffer), "VUID-vkCmdDrawIndexed-indexSize-00463",
118 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
119 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
120 " bytes, "
121 "which is greater than the index buffer size (%" PRIuLEAST64 ").",
122 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
123 }
124 }
125 return skip;
126}
127
128void CoreChecks::PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
129 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
130 GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
131}
132
John Zulauffbf3c202019-07-17 14:57:14 -0600133void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
134 uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
135 uint32_t firstInstance) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600136 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700137 UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
138}
139
140bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
141 uint32_t stride) {
142 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
143 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600144 "VUID-vkCmdDrawIndirect-renderpass", "VUID-vkCmdDrawIndirect-None-02700",
145 "VUID-vkCmdDrawIndirect-commandBuffer-02701");
John Zulauffbf3c202019-07-17 14:57:14 -0600146 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600147 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirect()", "VUID-vkCmdDrawIndirect-buffer-02708");
148 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDrawIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700149 "vkCmdDrawIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600150 if (count > 1) {
151 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
152 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
153 skip |=
154 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
155 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
156 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700157 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
158 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
159 return skip;
160}
161
162void CoreChecks::PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
163 uint32_t stride) {
164 GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
165}
166
John Zulauffbf3c202019-07-17 14:57:14 -0600167void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
168 uint32_t count, uint32_t stride) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600169 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700170 BUFFER_STATE *buffer_state = GetBufferState(buffer);
171 UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
172 AddCommandBufferBindingBuffer(cb_state, buffer_state);
173}
174
175bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
176 uint32_t count, uint32_t stride) {
177 bool skip = ValidateCmdDrawType(
178 commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()",
179 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool", "VUID-vkCmdDrawIndexedIndirect-renderpass",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600180 "VUID-vkCmdDrawIndexedIndirect-None-02700", "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701");
John Zulauffbf3c202019-07-17 14:57:14 -0600181 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600182 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirect()", "VUID-vkCmdDrawIndexedIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700183 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600184 "VUID-vkCmdDrawIndexedIndirect-buffer-02709", "vkCmdDrawIndexedIndirect()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700185 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600186 if (count > 1) {
187 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
188 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
189 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
190 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
191 buffer_state);
192 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700193 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
194 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
195 // 'buffer'.
196 return skip;
197}
198
199void CoreChecks::PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
200 uint32_t count, uint32_t stride) {
201 GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
202}
203
John Zulauffbf3c202019-07-17 14:57:14 -0600204void ValidationStateTracker::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
205 VkDeviceSize offset, uint32_t count, uint32_t stride) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600206 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700207 BUFFER_STATE *buffer_state = GetBufferState(buffer);
208 UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
209 AddCommandBufferBindingBuffer(cb_state, buffer_state);
210}
211
212bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Lockef39c0772019-04-03 14:40:02 -0600213 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600214 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
215 VK_QUEUE_COMPUTE_BIT, "VUID-vkCmdDispatch-commandBuffer-cmdpool", "VUID-vkCmdDispatch-renderpass",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600216 "VUID-vkCmdDispatch-None-02700", kVUIDUndefined);
Lockef39c0772019-04-03 14:40:02 -0600217 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700218}
219
220void CoreChecks::PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
221 GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE);
222}
223
John Zulauffbf3c202019-07-17 14:57:14 -0600224void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600225 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700226 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_COMPUTE);
227}
228
229bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
230 bool skip =
231 ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()",
232 VK_QUEUE_COMPUTE_BIT, "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600233 "VUID-vkCmdDispatchIndirect-renderpass", "VUID-vkCmdDispatchIndirect-None-02700", kVUIDUndefined);
John Zulauffbf3c202019-07-17 14:57:14 -0600234 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600235 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDispatchIndirect()", "VUID-vkCmdDispatchIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700236 skip |=
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600237 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDispatchIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700238 "vkCmdDispatchIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700239 return skip;
240}
241
242void CoreChecks::PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
243 GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE);
244}
245
John Zulauffbf3c202019-07-17 14:57:14 -0600246void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
247 VkDeviceSize offset) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600248 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700249 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_COMPUTE);
250 BUFFER_STATE *buffer_state = GetBufferState(buffer);
251 AddCommandBufferBindingBuffer(cb_state, buffer_state);
252}
253
254bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
255 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
256 uint32_t stride) {
257 bool skip = false;
258 if (offset & 3) {
259 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600260 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndirectCountKHR-offset-02710",
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700261 "vkCmdDrawIndirectCountKHR() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.",
262 offset);
263 }
264
265 if (countBufferOffset & 3) {
266 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600267 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndirectCountKHR-countBufferOffset-02716",
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700268 "vkCmdDrawIndirectCountKHR() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
269 "), is not a multiple of 4.",
270 countBufferOffset);
271 }
Lockee68ac652019-05-06 10:17:33 -0600272 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCountKHR-stride-03110", stride,
273 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
274 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600275 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Lockee68ac652019-05-06 10:17:33 -0600276 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCountKHR-maxDrawCount-03111", stride,
277 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), maxDrawCount, offset,
278 buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700279 }
280
281 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNTKHR,
282 "vkCmdDrawIndirectCountKHR()", VK_QUEUE_GRAPHICS_BIT,
283 "VUID-vkCmdDrawIndirectCountKHR-commandBuffer-cmdpool", "VUID-vkCmdDrawIndirectCountKHR-renderpass",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600284 "VUID-vkCmdDrawIndirectCountKHR-None-02700", "VUID-vkCmdDrawIndirectCountKHR-commandBuffer-02701");
John Zulauffbf3c202019-07-17 14:57:14 -0600285 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
286 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700287 skip |=
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600288 ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirectCountKHR()", "VUID-vkCmdDrawIndirectCountKHR-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700289 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndirectCountKHR()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600290 "VUID-vkCmdDrawIndirectCountKHR-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700291 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600292 "VUID-vkCmdDrawIndirectCountKHR-buffer-02709", "vkCmdDrawIndirectCountKHR()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700293 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
294 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600295 "VUID-vkCmdDrawIndirectCountKHR-countBuffer-02715", "vkCmdDrawIndirectCountKHR()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700296 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700297 return skip;
298}
299
John Zulauffbf3c202019-07-17 14:57:14 -0600300void ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
301 VkDeviceSize offset, VkBuffer countBuffer,
302 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
303 uint32_t stride) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600304 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700305 BUFFER_STATE *buffer_state = GetBufferState(buffer);
306 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
307 UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
308 AddCommandBufferBindingBuffer(cb_state, buffer_state);
309 AddCommandBufferBindingBuffer(cb_state, count_buffer_state);
310}
311
312bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
313 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
314 uint32_t maxDrawCount, uint32_t stride) {
315 bool skip = false;
316 if (offset & 3) {
317 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600318 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndexedIndirectCountKHR-offset-02710",
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700319 "vkCmdDrawIndexedIndirectCountKHR() parameter, VkDeviceSize offset (0x%" PRIxLEAST64
320 "), is not a multiple of 4.",
321 offset);
322 }
323
324 if (countBufferOffset & 3) {
325 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600326 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndexedIndirectCountKHR-countBufferOffset-02716",
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700327 "vkCmdDrawIndexedIndirectCountKHR() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
328 "), is not a multiple of 4.",
329 countBufferOffset);
330 }
331
Lockee68ac652019-05-06 10:17:33 -0600332 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCountKHR-stride-03142", stride,
333 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
334 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600335 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Lockee68ac652019-05-06 10:17:33 -0600336 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCountKHR-maxDrawCount-03143", stride,
337 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset,
338 buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700339 }
340
341 skip |= ValidateCmdDrawType(
342 commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNTKHR, "vkCmdDrawIndexedIndirectCountKHR()",
343 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexedIndirectCountKHR-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600344 "VUID-vkCmdDrawIndexedIndirectCountKHR-renderpass", "VUID-vkCmdDrawIndexedIndirectCountKHR-None-02700",
345 "VUID-vkCmdDrawIndexedIndirectCountKHR-commandBuffer-02701");
John Zulauffbf3c202019-07-17 14:57:14 -0600346 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
347 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700348 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirectCountKHR()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600349 "VUID-vkCmdDrawIndexedIndirectCountKHR-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700350 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndexedIndirectCountKHR()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600351 "VUID-vkCmdDrawIndexedIndirectCountKHR-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700352 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600353 "VUID-vkCmdDrawIndexedIndirectCountKHR-buffer-02709", "vkCmdDrawIndexedIndirectCountKHR()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700354 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
355 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600356 "VUID-vkCmdDrawIndexedIndirectCountKHR-countBuffer-02715",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700357 "vkCmdDrawIndexedIndirectCountKHR()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700358 return skip;
359}
360
John Zulauffbf3c202019-07-17 14:57:14 -0600361void ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
362 VkDeviceSize offset, VkBuffer countBuffer,
363 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
364 uint32_t stride) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600365 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700366 BUFFER_STATE *buffer_state = GetBufferState(buffer);
367 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
368 UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
369 AddCommandBufferBindingBuffer(cb_state, buffer_state);
370 AddCommandBufferBindingBuffer(cb_state, count_buffer_state);
371}
372
Jason Macnak67407e72019-07-11 11:05:09 -0700373void CoreChecks::PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
374 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
375 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
376 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
377 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
378 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
379 uint32_t width, uint32_t height, uint32_t depth) {
380 GpuAllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
381}
382
383void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
384 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
385 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
386 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
387 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
388 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
389 uint32_t width, uint32_t height, uint32_t depth) {
390 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
391 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
392 cb_state->hasTraceRaysCmd = true;
393}
394
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700395bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) {
396 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV,
397 "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT,
398 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool", "VUID-vkCmdDrawMeshTasksNV-renderpass",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600399 "VUID-vkCmdDrawMeshTasksNV-None-02700", "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700400 return skip;
401}
402
John Zulauffbf3c202019-07-17 14:57:14 -0600403void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
404 uint32_t firstTask) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600405 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700406 UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
407}
408
409bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
410 uint32_t drawCount, uint32_t stride) {
411 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
412 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT,
413 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600414 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass", "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
415 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701");
John Zulauffbf3c202019-07-17 14:57:14 -0600416 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700417 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600418 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700419 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600420 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700421 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600422 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600423 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
424 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
425 drawCount, offset, buffer_state);
426 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700427 return skip;
428}
429
John Zulauffbf3c202019-07-17 14:57:14 -0600430void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
431 VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600432 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700433 UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
434 BUFFER_STATE *buffer_state = GetBufferState(buffer);
435 if (buffer_state) {
436 AddCommandBufferBindingBuffer(cb_state, buffer_state);
437 }
438}
439
440bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
441 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
442 uint32_t maxDrawCount, uint32_t stride) {
443 bool skip = ValidateCmdDrawType(
444 commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
445 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT,
446 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool", "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600447 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700", "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701");
John Zulauffbf3c202019-07-17 14:57:14 -0600448 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
449 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700450 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600451 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700452 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600453 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700454 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600455 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawIndexedIndirectCountKHR()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700456 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
457 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600458 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700459 "vkCmdDrawIndexedIndirectCountKHR()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600460 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
461 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
462 if (maxDrawCount > 1) {
463 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
464 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
465 maxDrawCount, offset, buffer_state);
466 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700467 return skip;
468}
469
John Zulauffbf3c202019-07-17 14:57:14 -0600470void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
471 VkDeviceSize offset, VkBuffer countBuffer,
472 VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
473 uint32_t stride) {
Mark Lobodzinskicefe42f2019-04-25 12:16:27 -0600474 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700475 BUFFER_STATE *buffer_state = GetBufferState(buffer);
476 BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
477 UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
478 if (buffer_state) {
479 AddCommandBufferBindingBuffer(cb_state, buffer_state);
480 }
481 if (count_buffer_state) {
482 AddCommandBufferBindingBuffer(cb_state, count_buffer_state);
483 }
484}