blob: d974ef4f994e13559ab1010b169c91f402aa4750 [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
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
Jasper St. Pierre512613a2019-04-08 16:25:23 -070044// Generic function to handle validation for all CmdDraw* type functions
45bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
46 const char *caller, VkQueueFlags queue_flags, const char *queue_flag_code,
47 const char *renderpass_msg_code, const char *pipebound_msg_code,
Mark Lobodzinski708aae72019-12-20 11:57:46 -070048 const char *dynamic_state_msg_code, const char *vtx_binding_msg_code) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070049 bool skip = false;
John Zulauffbf3c202019-07-17 14:57:14 -060050 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -070051 if (cb_state) {
52 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, queue_flag_code);
53 skip |= ValidateCmd(cb_state, cmd_type, caller);
Mark Lobodzinski708aae72019-12-20 11:57:46 -070054 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller, pipebound_msg_code, dynamic_state_msg_code,
55 vtx_binding_msg_code);
Jasper St. Pierre512613a2019-04-08 16:25:23 -070056 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, renderpass_msg_code)
57 : InsideRenderPass(cb_state, caller, renderpass_msg_code);
58 }
59 return skip;
60}
61
Jasper St. Pierre512613a2019-04-08 16:25:23 -070062bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -050063 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070064 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
65 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDraw-commandBuffer-cmdpool", "VUID-vkCmdDraw-renderpass",
Mark Lobodzinski708aae72019-12-20 11:57:46 -070066 "VUID-vkCmdDraw-None-02700", "VUID-vkCmdDraw-commandBuffer-02701", "VUID-vkCmdDraw-None-02720");
Jasper St. Pierre512613a2019-04-08 16:25:23 -070067}
68
Jasper St. Pierre512613a2019-04-08 16:25:23 -070069bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -050070 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070071 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
72 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -060073 "VUID-vkCmdDrawIndexed-renderpass", "VUID-vkCmdDrawIndexed-None-02700",
Mark Lobodzinski708aae72019-12-20 11:57:46 -070074 "VUID-vkCmdDrawIndexed-commandBuffer-02701", "VUID-vkCmdDrawIndexed-None-02720");
Jeff Bolz46c0ea02019-10-09 13:06:29 -050075 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -070076 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
77 unsigned int index_size = 0;
78 const auto &index_buffer_binding = cb_state->index_buffer_binding;
79 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
80 index_size = 2;
81 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
82 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -060083 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
84 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -070085 }
86 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
87 if (end_offset > index_buffer_binding.size) {
88 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
89 HandleToUint64(index_buffer_binding.buffer), "VUID-vkCmdDrawIndexed-indexSize-00463",
90 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
91 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
92 " bytes, "
93 "which is greater than the index buffer size (%" PRIuLEAST64 ").",
94 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
95 }
96 }
97 return skip;
98}
99
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700100bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500101 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700102 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
103 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600104 "VUID-vkCmdDrawIndirect-renderpass", "VUID-vkCmdDrawIndirect-None-02700",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700105 "VUID-vkCmdDrawIndirect-commandBuffer-02701", "VUID-vkCmdDrawIndirect-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600106 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600107 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirect()", "VUID-vkCmdDrawIndirect-buffer-02708");
108 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDrawIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700109 "vkCmdDrawIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600110 if (count > 1) {
111 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
112 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
113 skip |=
114 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
115 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
116 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700117 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
118 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
119 return skip;
120}
121
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700122bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500123 uint32_t count, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700124 bool skip = ValidateCmdDrawType(
125 commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()",
126 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool", "VUID-vkCmdDrawIndexedIndirect-renderpass",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700127 "VUID-vkCmdDrawIndexedIndirect-None-02700", "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
128 "VUID-vkCmdDrawIndexedIndirect-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600129 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600130 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirect()", "VUID-vkCmdDrawIndexedIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700131 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600132 "VUID-vkCmdDrawIndexedIndirect-buffer-02709", "vkCmdDrawIndexedIndirect()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700133 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600134 if (count > 1) {
135 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
136 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
137 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
138 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
139 buffer_state);
140 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700141 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
142 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
143 // 'buffer'.
144 return skip;
145}
146
Jeff Bolz5c801d12019-10-09 10:38:45 -0500147bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600148 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600149 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
150 VK_QUEUE_COMPUTE_BIT, "VUID-vkCmdDispatch-commandBuffer-cmdpool", "VUID-vkCmdDispatch-renderpass",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700151 "VUID-vkCmdDispatch-None-02700", kVUIDUndefined, kVUIDUndefined);
Lockef39c0772019-04-03 14:40:02 -0600152 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700153}
154
Jeff Bolz5c801d12019-10-09 10:38:45 -0500155bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700156 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
157 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT,
158 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool", "VUID-vkCmdDispatchIndirect-renderpass",
159 "VUID-vkCmdDispatchIndirect-None-02700", kVUIDUndefined, kVUIDUndefined);
John Zulauffbf3c202019-07-17 14:57:14 -0600160 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600161 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDispatchIndirect()", "VUID-vkCmdDispatchIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700162 skip |=
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600163 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDispatchIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700164 "vkCmdDispatchIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700165 return skip;
166}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700167bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
168 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
169 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700170 bool skip = false;
171 if (offset & 3) {
172 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800173 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndirectCount-offset-02710",
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700174 "vkCmdDrawIndirectCount() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.",
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700175 offset);
176 }
177
178 if (countBufferOffset & 3) {
179 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800180 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716",
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700181 "vkCmdDrawIndirectCount() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700182 "), is not a multiple of 4.",
183 countBufferOffset);
184 }
Mike Schuchardt65847d92019-12-20 13:50:47 -0800185 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride,
Lockee68ac652019-05-06 10:17:33 -0600186 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
187 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600188 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800189 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride,
Lockee68ac652019-05-06 10:17:33 -0600190 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), maxDrawCount, offset,
191 buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700192 }
193
Mike Schuchardtf6f00492019-10-21 23:35:17 -0700194 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700195 "vkCmdDrawIndirectCount()", VK_QUEUE_GRAPHICS_BIT,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800196 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool", "VUID-vkCmdDrawIndirectCount-renderpass",
197 "VUID-vkCmdDrawIndirectCount-None-02700", "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
198 "VUID-vkCmdDrawIndirectCount-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600199 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
200 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700201 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirectCount()", "VUID-vkCmdDrawIndirectCount-buffer-02708");
202 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800203 "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700204 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700205 "VUID-vkCmdDrawIndirectCount-buffer-02709", "vkCmdDrawIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700206 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
207 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700208 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", "vkCmdDrawIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700209 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700210 return skip;
211}
212
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700213bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
214 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
215 uint32_t stride) const {
216 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
217}
218
219bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
220 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
221 uint32_t stride) const {
222 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
223}
224
225bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
226 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
227 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700228 bool skip = false;
229 if (offset & 3) {
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700230 skip |= log_msg(
231 report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
232 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndexedIndirectCount-offset-02710",
233 "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", offset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700234 }
235
236 if (countBufferOffset & 3) {
237 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800238 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716",
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700239 "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700240 "), is not a multiple of 4.",
241 countBufferOffset);
242 }
243
Mike Schuchardt65847d92019-12-20 13:50:47 -0800244 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride,
Lockee68ac652019-05-06 10:17:33 -0600245 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
246 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600247 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800248 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
Lockee68ac652019-05-06 10:17:33 -0600249 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset,
250 buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700251 }
252
253 skip |= ValidateCmdDrawType(
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700254 commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800255 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
256 "VUID-vkCmdDrawIndexedIndirectCount-renderpass", "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
257 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701", "VUID-vkCmdDrawIndexedIndirectCount-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600258 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
259 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700260 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800261 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700262 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800263 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700264 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700265 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700266 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
267 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700268 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800269 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700270 return skip;
271}
272
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700273bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
274 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
275 uint32_t maxDrawCount, uint32_t stride) const {
276 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
277}
278
279bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
280 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
281 uint32_t maxDrawCount, uint32_t stride) const {
282 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
283}
284
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500285bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
286 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
287 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
288 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
289 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
290 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
291 uint32_t width, uint32_t height, uint32_t depth) const {
292 bool skip =
293 ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV, "vkCmdTraceRaysNV()",
294 VK_QUEUE_COMPUTE_BIT, "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool", "VUID-vkCmdTraceRaysNV-renderpass",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700295 "VUID-vkCmdTraceRaysNV-None-02700", "VUID-vkCmdTraceRaysNV-commandBuffer-02701", kVUIDUndefined);
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500296 return skip;
297}
298
Jason Macnak67407e72019-07-11 11:05:09 -0700299void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
300 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
301 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
302 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
303 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
304 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
305 uint32_t width, uint32_t height, uint32_t depth) {
306 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
307 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
308 cb_state->hasTraceRaysCmd = true;
309}
310
Jeff Bolz5c801d12019-10-09 10:38:45 -0500311bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700312 bool skip = ValidateCmdDrawType(
313 commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV, "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT,
314 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool", "VUID-vkCmdDrawMeshTasksNV-renderpass",
315 "VUID-vkCmdDrawMeshTasksNV-None-02700", "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701", kVUIDUndefined);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700316 return skip;
317}
318
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700319bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500320 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700321 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
322 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT,
323 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600324 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass", "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700325 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701", kVUIDUndefined);
John Zulauffbf3c202019-07-17 14:57:14 -0600326 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700327 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600328 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700329 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600330 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700331 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600332 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600333 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
334 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
335 drawCount, offset, buffer_state);
336 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700337 return skip;
338}
339
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700340bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
341 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500342 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700343 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
344 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT,
345 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
346 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
347 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
348 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701", kVUIDUndefined);
John Zulauffbf3c202019-07-17 14:57:14 -0600349 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
350 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700351 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600352 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700353 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600354 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700355 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700356 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700357 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
358 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700359 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
360 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600361 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
362 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
363 if (maxDrawCount > 1) {
364 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
365 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
366 maxDrawCount, offset, buffer_state);
367 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700368 return skip;
369}