blob: a19f44ecfad2694ac493019d6e14027ec1b535e2 [file] [log] [blame]
Tony-LunarG73719992020-01-15 10:20:28 -07001/* Copyright (c) 2015-2020 The Khronos Group Inc.
2 * Copyright (c) 2015-2020 Valve Corporation
3 * Copyright (c) 2015-2020 LunarG, Inc.
4 * Copyright (C) 2015-2020 Google Inc.
Jasper St. Pierre512613a2019-04-08 16:25:23 -07005 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * Author: Cody Northrop <cnorthrop@google.com>
19 * Author: Michael Lentine <mlentine@google.com>
20 * Author: Tobin Ehlis <tobine@google.com>
21 * Author: Chia-I Wu <olv@google.com>
22 * Author: Chris Forbes <chrisf@ijw.co.nz>
23 * Author: Mark Lobodzinski <mark@lunarg.com>
24 * Author: Ian Elliott <ianelliott@google.com>
25 * Author: Dave Houlton <daveh@lunarg.com>
26 * Author: Dustin Graves <dustin@lunarg.com>
27 * Author: Jeremy Hayes <jeremy@lunarg.com>
28 * Author: Jon Ashburn <jon@lunarg.com>
29 * Author: Karl Schultz <karl@lunarg.com>
30 * Author: Mark Young <marky@lunarg.com>
31 * Author: Mike Schuchardt <mikes@lunarg.com>
32 * Author: Mike Weiblen <mikew@lunarg.com>
33 * Author: Tony Barbour <tony@LunarG.com>
34 * Author: John Zulauf <jzulauf@lunarg.com>
35 * Author: Shannon McPherson <shannon@lunarg.com>
36 */
37
Jasper St. Pierre512613a2019-04-08 16:25:23 -070038#include "chassis.h"
39#include "core_validation.h"
40
Jasper St. Pierre512613a2019-04-08 16:25:23 -070041// Generic function to handle validation for all CmdDraw* type functions
42bool CoreChecks::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
43 const char *caller, VkQueueFlags queue_flags, const char *queue_flag_code,
44 const char *renderpass_msg_code, const char *pipebound_msg_code,
Mark Lobodzinski708aae72019-12-20 11:57:46 -070045 const char *dynamic_state_msg_code, const char *vtx_binding_msg_code) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070046 bool skip = false;
John Zulauffbf3c202019-07-17 14:57:14 -060047 const CMD_BUFFER_STATE *cb_state = GetCBState(cmd_buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -070048 if (cb_state) {
49 skip |= ValidateCmdQueueFlags(cb_state, caller, queue_flags, queue_flag_code);
50 skip |= ValidateCmd(cb_state, cmd_type, caller);
Mark Lobodzinski708aae72019-12-20 11:57:46 -070051 skip |= ValidateCmdBufDrawState(cb_state, cmd_type, indexed, bind_point, caller, pipebound_msg_code, dynamic_state_msg_code,
52 vtx_binding_msg_code);
Jasper St. Pierre512613a2019-04-08 16:25:23 -070053 skip |= (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) ? OutsideRenderPass(cb_state, caller, renderpass_msg_code)
54 : InsideRenderPass(cb_state, caller, renderpass_msg_code);
55 }
56 return skip;
57}
58
Jasper St. Pierre512613a2019-04-08 16:25:23 -070059bool CoreChecks::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -050060 uint32_t firstVertex, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070061 return ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAW, "vkCmdDraw()",
62 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDraw-commandBuffer-cmdpool", "VUID-vkCmdDraw-renderpass",
Mark Lobodzinski708aae72019-12-20 11:57:46 -070063 "VUID-vkCmdDraw-None-02700", "VUID-vkCmdDraw-commandBuffer-02701", "VUID-vkCmdDraw-None-02720");
Jasper St. Pierre512613a2019-04-08 16:25:23 -070064}
65
Jasper St. Pierre512613a2019-04-08 16:25:23 -070066bool CoreChecks::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
Jeff Bolz5c801d12019-10-09 10:38:45 -050067 uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070068 bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXED, "vkCmdDrawIndexed()",
69 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -060070 "VUID-vkCmdDrawIndexed-renderpass", "VUID-vkCmdDrawIndexed-None-02700",
Mark Lobodzinski708aae72019-12-20 11:57:46 -070071 "VUID-vkCmdDrawIndexed-commandBuffer-02701", "VUID-vkCmdDrawIndexed-None-02720");
Jeff Bolz46c0ea02019-10-09 13:06:29 -050072 const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -070073 if (!skip && (cb_state->status & CBSTATUS_INDEX_BUFFER_BOUND)) {
74 unsigned int index_size = 0;
75 const auto &index_buffer_binding = cb_state->index_buffer_binding;
76 if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT16) {
77 index_size = 2;
78 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT32) {
79 index_size = 4;
Piers Daniell5070e3e2019-08-20 13:39:35 -060080 } else if (index_buffer_binding.index_type == VK_INDEX_TYPE_UINT8_EXT) {
81 index_size = 1;
Jasper St. Pierre512613a2019-04-08 16:25:23 -070082 }
83 VkDeviceSize end_offset = (index_size * ((VkDeviceSize)firstIndex + indexCount)) + index_buffer_binding.offset;
84 if (end_offset > index_buffer_binding.size) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -070085 skip |=
86 LogError(index_buffer_binding.buffer, "VUID-vkCmdDrawIndexed-indexSize-00463",
87 "vkCmdDrawIndexed() index size (%d) * (firstIndex (%d) + indexCount (%d)) "
88 "+ binding offset (%" PRIuLEAST64 ") = an ending offset of %" PRIuLEAST64
89 " bytes, which is greater than the index buffer size (%" PRIuLEAST64 ").",
90 index_size, firstIndex, indexCount, index_buffer_binding.offset, end_offset, index_buffer_binding.size);
Jasper St. Pierre512613a2019-04-08 16:25:23 -070091 }
92 }
93 return skip;
94}
95
Jasper St. Pierre512613a2019-04-08 16:25:23 -070096bool CoreChecks::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
Jeff Bolz5c801d12019-10-09 10:38:45 -050097 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -070098 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
99 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600100 "VUID-vkCmdDrawIndirect-renderpass", "VUID-vkCmdDrawIndirect-None-02700",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700101 "VUID-vkCmdDrawIndirect-commandBuffer-02701", "VUID-vkCmdDrawIndirect-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600102 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600103 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirect()", "VUID-vkCmdDrawIndirect-buffer-02708");
104 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDrawIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700105 "vkCmdDrawIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600106 if (count > 1) {
107 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
108 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
109 skip |=
110 ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00488", stride,
111 "VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand), count, offset, buffer_state);
112 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700113 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
114 // VkDrawIndirectCommand structures accessed by this command must be 0, which will require access to the contents of 'buffer'.
115 return skip;
116}
117
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700118bool CoreChecks::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500119 uint32_t count, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700120 bool skip = ValidateCmdDrawType(
121 commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()",
122 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool", "VUID-vkCmdDrawIndexedIndirect-renderpass",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700123 "VUID-vkCmdDrawIndexedIndirect-None-02700", "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
124 "VUID-vkCmdDrawIndexedIndirect-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600125 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600126 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirect()", "VUID-vkCmdDrawIndexedIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700127 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600128 "VUID-vkCmdDrawIndexedIndirect-buffer-02709", "vkCmdDrawIndexedIndirect()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700129 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600130 if (count > 1) {
131 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
132 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
133 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00540", stride,
134 "VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), count, offset,
135 buffer_state);
136 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700137 // TODO: If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the
138 // VkDrawIndexedIndirectCommand structures accessed by this command must be 0, which will require access to the contents of
139 // 'buffer'.
140 return skip;
141}
142
Jeff Bolz5c801d12019-10-09 10:38:45 -0500143bool CoreChecks::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
Lockef39c0772019-04-03 14:40:02 -0600144 bool skip = false;
Lockef39c0772019-04-03 14:40:02 -0600145 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCH, "vkCmdDispatch()",
146 VK_QUEUE_COMPUTE_BIT, "VUID-vkCmdDispatch-commandBuffer-cmdpool", "VUID-vkCmdDispatch-renderpass",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700147 "VUID-vkCmdDispatch-None-02700", kVUIDUndefined, kVUIDUndefined);
Lockef39c0772019-04-03 14:40:02 -0600148 return skip;
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700149}
150
Jeff Bolz5c801d12019-10-09 10:38:45 -0500151bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700152 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
153 "vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT,
154 "VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool", "VUID-vkCmdDispatchIndirect-renderpass",
155 "VUID-vkCmdDispatchIndirect-None-02700", kVUIDUndefined, kVUIDUndefined);
John Zulauffbf3c202019-07-17 14:57:14 -0600156 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600157 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDispatchIndirect()", "VUID-vkCmdDispatchIndirect-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700158 skip |=
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600159 ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDispatchIndirect-buffer-02709",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700160 "vkCmdDispatchIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700161 return skip;
162}
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700163bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
164 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
Tony-LunarG83544c72020-01-17 12:30:19 -0700165 uint32_t stride, const char *apiName) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700166 bool skip = false;
167 if (offset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700168 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-offset-02710",
169 "%s() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName, offset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700170 }
171
172 if (countBufferOffset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700173 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716",
174 "%s() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName,
175 countBufferOffset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700176 }
Tony-LunarG83544c72020-01-17 12:30:19 -0700177 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
178 sizeof(VkDrawIndirectCommand));
Lockee68ac652019-05-06 10:17:33 -0600179 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600180 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700181 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", stride, apiName,
182 sizeof(VkDrawIndirectCommand), maxDrawCount, offset, buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700183 }
184
Tony-LunarG83544c72020-01-17 12:30:19 -0700185 skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
186 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
187 "VUID-vkCmdDrawIndirectCount-renderpass", "VUID-vkCmdDrawIndirectCount-None-02700",
188 "VUID-vkCmdDrawIndirectCount-commandBuffer-02701", "VUID-vkCmdDrawIndirectCount-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600189 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
190 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarG83544c72020-01-17 12:30:19 -0700191 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-buffer-02708");
192 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700193 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarG83544c72020-01-17 12:30:19 -0700194 "VUID-vkCmdDrawIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
195 skip |=
196 ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
197 "VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700198 return skip;
199}
200
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700201bool CoreChecks::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
202 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
203 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700204 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
205 "VkCmdDrawIndirectCountKHR");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700206}
207
208bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
209 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
210 uint32_t stride) const {
Tony-LunarG83544c72020-01-17 12:30:19 -0700211 return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
212 "VkCmdDrawIndirectCount");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700213}
214
215bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
216 VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
217 uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700218 bool skip = false;
219 if (offset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700220 skip |= LogError(
221 commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710",
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700222 "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", offset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700223 }
224
225 if (countBufferOffset & 3) {
Mark Lobodzinskicf0e6d32020-01-30 12:12:58 -0700226 skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716",
227 "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
228 "), is not a multiple of 4.",
229 countBufferOffset);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700230 }
231
Mike Schuchardt65847d92019-12-20 13:50:47 -0800232 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride,
Lockee68ac652019-05-06 10:17:33 -0600233 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
234 if (maxDrawCount > 1) {
John Zulauffbf3c202019-07-17 14:57:14 -0600235 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Mike Schuchardt65847d92019-12-20 13:50:47 -0800236 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
Lockee68ac652019-05-06 10:17:33 -0600237 "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset,
238 buffer_state);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700239 }
240
241 skip |= ValidateCmdDrawType(
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700242 commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800243 VK_QUEUE_GRAPHICS_BIT, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
244 "VUID-vkCmdDrawIndexedIndirectCount-renderpass", "VUID-vkCmdDrawIndexedIndirectCount-None-02700",
245 "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701", "VUID-vkCmdDrawIndexedIndirectCount-None-02720");
John Zulauffbf3c202019-07-17 14:57:14 -0600246 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
247 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700248 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800249 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700250 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800251 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700252 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700253 "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700254 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
255 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700256 "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
Mike Schuchardt65847d92019-12-20 13:50:47 -0800257 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700258 return skip;
259}
260
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700261bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
262 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
263 uint32_t maxDrawCount, uint32_t stride) const {
264 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
265}
266
267bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
268 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
269 uint32_t maxDrawCount, uint32_t stride) const {
270 return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
271}
272
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500273bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
274 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
275 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
276 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
277 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
278 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
279 uint32_t width, uint32_t height, uint32_t depth) const {
280 bool skip =
281 ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV, "vkCmdTraceRaysNV()",
282 VK_QUEUE_COMPUTE_BIT, "VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool", "VUID-vkCmdTraceRaysNV-renderpass",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700283 "VUID-vkCmdTraceRaysNV-None-02700", "VUID-vkCmdTraceRaysNV-commandBuffer-02701", kVUIDUndefined);
Jeff Bolzf6e872c2019-10-22 12:17:28 -0500284 return skip;
285}
286
Jason Macnak67407e72019-07-11 11:05:09 -0700287void CoreChecks::PostCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
288 VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
289 VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
290 VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
291 VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
292 VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
293 uint32_t width, uint32_t height, uint32_t depth) {
294 CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
295 UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
296 cb_state->hasTraceRaysCmd = true;
297}
298
Jeff Bolz5c801d12019-10-09 10:38:45 -0500299bool CoreChecks::PreCallValidateCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700300 bool skip = ValidateCmdDrawType(
301 commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSNV, "vkCmdDrawMeshTasksNV()", VK_QUEUE_GRAPHICS_BIT,
302 "VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool", "VUID-vkCmdDrawMeshTasksNV-renderpass",
303 "VUID-vkCmdDrawMeshTasksNV-None-02700", "VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701", kVUIDUndefined);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700304 return skip;
305}
306
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700307bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500308 uint32_t drawCount, uint32_t stride) const {
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700309 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
310 "vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT,
311 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600312 "VUID-vkCmdDrawMeshTasksIndirectNV-renderpass", "VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700313 "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701", kVUIDUndefined);
John Zulauffbf3c202019-07-17 14:57:14 -0600314 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700315 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600316 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700317 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600318 "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700319 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600320 if (drawCount > 1) {
Lockee68ac652019-05-06 10:17:33 -0600321 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
322 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
323 drawCount, offset, buffer_state);
324 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700325 return skip;
326}
327
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700328bool CoreChecks::PreCallValidateCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
329 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
Jeff Bolz5c801d12019-10-09 10:38:45 -0500330 uint32_t maxDrawCount, uint32_t stride) const {
Mark Lobodzinski708aae72019-12-20 11:57:46 -0700331 bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTCOUNTNV,
332 "vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT,
333 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
334 "VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass",
335 "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
336 "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701", kVUIDUndefined);
John Zulauffbf3c202019-07-17 14:57:14 -0600337 const BUFFER_STATE *buffer_state = GetBufferState(buffer);
338 const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700339 skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600340 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700341 skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
Shannon McPhersonde3eeba2019-04-30 16:53:59 -0600342 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700343 skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700344 "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
Jasper St. Pierrebf080462019-04-11 12:54:38 -0700345 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
346 skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
Tony-LunarGa74d3fe2019-11-22 15:43:20 -0700347 "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
348 "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
Lockee68ac652019-05-06 10:17:33 -0600349 skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
350 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
351 if (maxDrawCount > 1) {
352 skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", stride,
353 "VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
354 maxDrawCount, offset, buffer_state);
355 }
Jasper St. Pierre512613a2019-04-08 16:25:23 -0700356 return skip;
357}