blob: 48aab8bc6ad27731d15bbb103560385bfcbcd6c5 [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
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}
167
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700168bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
169 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500170 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700171 bool skip = false;
172 if (offset & 3) {
173 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 -0800174 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndirectCount-offset-02710",
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700175 "vkCmdDrawIndirectCountKHR() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.",
176 offset);
177 }
178
179 if (countBufferOffset & 3) {
180 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 -0800181 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716",
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700182 "vkCmdDrawIndirectCountKHR() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
183 "), is not a multiple of 4.",
184 countBufferOffset);
185 }
Mike Schuchardt65847d92019-12-20 13:50:47 -0800186 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride,
Lockee68ac652019-05-06 10:17:33 -0600187 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
188 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600189 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800190 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride,
Lockee68ac652019-05-06 10:17:33 -0600191 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), maxDrawCount, offset,
192 buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700193 }
194
Mike Schuchardtf6f00492019-10-21 23:35:17 -0700195 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT,
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700196 "vkCmdDrawIndirectCountKHR()", VK_QUEUE_GRAPHICS_BIT,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800197 "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool", "VUID-vkCmdDrawIndirectCount-renderpass",
198 "VUID-vkCmdDrawIndirectCount-None-02700", "VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
199 "VUID-vkCmdDrawIndirectCount-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600200 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
201 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800202 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirectCountKHR()", "VUID-vkCmdDrawIndirectCount-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700203 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndirectCountKHR()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800204 "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700205 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800206 "VUID-vkCmdDrawIndirectCount-buffer-02709", "vkCmdDrawIndirectCountKHR()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700207 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
208 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800209 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", "vkCmdDrawIndirectCountKHR()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700210 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700211 return skip;
212}
213
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700214bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
215 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500216 uint32_t maxDrawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700217 bool skip = false;
218 if (offset & 3) {
219 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 -0800220 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndexedIndirectCount-offset-02710",
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700221 "vkCmdDrawIndexedIndirectCountKHR() parameter, VkDeviceSize offset (0x%" PRIxLEAST64
222 "), is not a multiple of 4.",
223 offset);
224 }
225
226 if (countBufferOffset & 3) {
227 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 -0800228 HandleToUint64(commandBuffer), "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716",
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700229 "vkCmdDrawIndexedIndirectCountKHR() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
230 "), is not a multiple of 4.",
231 countBufferOffset);
232 }
233
Mike Schuchardt65847d92019-12-20 13:50:47 -0800234 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride,
Lockee68ac652019-05-06 10:17:33 -0600235 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
236 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600237 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800238 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
Lockee68ac652019-05-06 10:17:33 -0600239 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset,
240 buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700241 }
242
243 skip |= ValidateCmdDrawType(
Mike Schuchardtf6f00492019-10-21 23:35:17 -0700244 commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, "vkCmdDrawIndexedIndirectCountKHR()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800245 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
246 "VUID-vkCmdDrawIndexedIndirectCount-renderpass", "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
247 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701", "VUID-vkCmdDrawIndexedIndirectCount-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600248 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
249 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700250 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirectCountKHR()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800251 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700252 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndexedIndirectCountKHR()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800253 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700254 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800255 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", "vkCmdDrawIndexedIndirectCountKHR()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700256 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
257 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Mike Schuchardt65847d92019-12-20 13:50:47 -0800258 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", "vkCmdDrawIndexedIndirectCountKHR()",
259 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700260 return skip;
261}
262
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500263bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
264 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
265 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
266 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
267 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
268 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
269 uint32_t width, uint32_t height, uint32_t depth) const {
270 bool skip =
271 ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV, "vkCmdTraceRaysNV()",
272 VK_QUEUE_COMPUTE_BIT, "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool", "VUID-vkCmdTraceRaysNV-renderpass",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700273 "VUID-vkCmdTraceRaysNV-None-02700", "VUID-vkCmdTraceRaysNV-commandBuffer-02701", kVUIDUndefined);
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500274 return skip;
275}
276
Jason Macnak67407e72019-07-11 11:05:09 -0700277void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
278 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
279 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
280 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
281 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
282 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
283 uint32_t width, uint32_t height, uint32_t depth) {
284 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
285 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
286 cb_state->hasTraceRaysCmd = true;
287}
288
Jeff Bolz5c801d12019-10-09 10:38:45 -0500289bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700290 bool skip = ValidateCmdDrawType(
291 commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV, "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT,
292 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool", "VUID-vkCmdDrawMeshTasksNV-renderpass",
293 "VUID-vkCmdDrawMeshTasksNV-None-02700", "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701", kVUIDUndefined);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700294 return skip;
295}
296
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700297bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500298 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700299 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
300 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT,
301 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600302 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass", "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700303 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701", kVUIDUndefined);
John Zulauffbf3c202019-07-17 14:57:14 -0600304 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700305 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600306 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700307 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600308 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700309 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600310 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600311 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
312 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
313 drawCount, offset, buffer_state);
314 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700315 return skip;
316}
317
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700318bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
319 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500320 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700321 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
322 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT,
323 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
324 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
325 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
326 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701", kVUIDUndefined);
John Zulauffbf3c202019-07-17 14:57:14 -0600327 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
328 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700329 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600330 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700331 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600332 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700333 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600334 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawIndexedIndirectCountKHR()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700335 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
336 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600337 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700338 "vkCmdDrawIndexedIndirectCountKHR()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600339 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
340 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
341 if (maxDrawCount > 1) {
342 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
343 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
344 maxDrawCount, offset, buffer_state);
345 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700346 return skip;
347}