blob: 071095a4a44173433809d347f809e97df09ff70e [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600341 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600342 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600343 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600344}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500345
Karl Schultz6addd812016-02-02 17:17:23 -0700346class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700347 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600348 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
349 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700350 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600351 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
352 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700353 }
Tony Barbour300a6082015-04-07 13:44:53 -0600354
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600355 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
356 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600358 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700359 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600360 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600362 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
363 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
364 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700365 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
366 }
367 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
368 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
369 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600370 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
371 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
372 InitState(features, flags);
373 }
374
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700375 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700376 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600377 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600378 std::vector<const char *> instance_layer_names;
379 std::vector<const char *> instance_extension_names;
380 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600381
382 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700383 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600384 /*
385 * Since CreateDbgMsgCallback is an instance level extension call
386 * any extension / layer that utilizes that feature also needs
387 * to be enabled at create instance time.
388 */
Karl Schultz6addd812016-02-02 17:17:23 -0700389 // Use Threading layer first to protect others from
390 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700391 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600392 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800393 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700394 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600395 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700396 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600397
Ian Elliott2c1daf52016-05-12 09:41:46 -0600398 if (m_enableWSI) {
399 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
400 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
401#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
402#if defined(VK_USE_PLATFORM_ANDROID_KHR)
403 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700404#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600405#if defined(VK_USE_PLATFORM_MIR_KHR)
406 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700407#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600408#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
409 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_WIN32_KHR)
412 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_WIN32_KHR
414#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600415#if defined(VK_USE_PLATFORM_XCB_KHR)
416 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
417#elif defined(VK_USE_PLATFORM_XLIB_KHR)
418 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600420 }
421
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600422 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600423 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800424 this->app_info.pApplicationName = "layer_tests";
425 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600426 this->app_info.pEngineName = "unittest";
427 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600428 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600429
Tony Barbour15524c32015-04-29 17:34:29 -0600430 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600431 }
432
433 virtual void TearDown() {
434 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600435 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600436 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600438
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600439 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600440};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500441
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 // Create identity matrix
444 int i;
445 struct vktriangle_vs_uniform data;
446
447 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700448 glm::mat4 View = glm::mat4(1.0f);
449 glm::mat4 Model = glm::mat4(1.0f);
450 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700452 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 memcpy(&data.mvp, &MVP[0][0], matrixSize);
455
Karl Schultz6addd812016-02-02 17:17:23 -0700456 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600457 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500458 };
459
Karl Schultz6addd812016-02-02 17:17:23 -0700460 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461 data.position[i][0] = tri_data[i].posX;
462 data.position[i][1] = tri_data[i].posY;
463 data.position[i][2] = tri_data[i].posZ;
464 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700465 data.color[i][0] = tri_data[i].r;
466 data.color[i][1] = tri_data[i].g;
467 data.color[i][2] = tri_data[i].b;
468 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500469 }
470
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500471 ASSERT_NO_FATAL_FAILURE(InitViewport());
472
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200473 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
474 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475
Karl Schultz6addd812016-02-02 17:17:23 -0700476 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600477 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800480 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481 pipelineobj.AddShader(&vs);
482 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600483 if (failMask & BsoFailLineWidth) {
484 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600485 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600486 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600487 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
488 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 }
490 if (failMask & BsoFailDepthBias) {
491 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600492 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600493 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600494 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600495 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600496 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700498 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700499 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600500 if (failMask & BsoFailViewport) {
501 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
502 }
503 if (failMask & BsoFailScissor) {
504 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
505 }
506 if (failMask & BsoFailBlend) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600508 VkPipelineColorBlendAttachmentState att_state = {};
509 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
510 att_state.blendEnable = VK_TRUE;
511 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600512 }
513 if (failMask & BsoFailDepthBounds) {
514 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
515 }
516 if (failMask & BsoFailStencilReadMask) {
517 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
518 }
519 if (failMask & BsoFailStencilWriteMask) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
521 }
522 if (failMask & BsoFailStencilReference) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
524 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500525
526 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600527 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500528
529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700530 m_commandBuffer->BeginCommandBuffer();
531 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600536 if (failMask & BsoFailIndexBuffer) {
537 // Use DrawIndexed w/o an index buffer bound
538 DrawIndexed(3, 1, 0, 0, 0);
539 } else {
540 Draw(3, 1, 0, 0);
541 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500542
Mark Muellerd4914412016-06-13 17:52:06 -0600543 if (failMask & BsoFailCmdClearAttachments) {
544 VkClearAttachment color_attachment = {};
545 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700546 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600547 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
548
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600549 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600550 }
551
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500552 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700553 m_commandBuffer->EndRenderPass();
554 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600555 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500556}
557
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600558void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
559 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500560 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600561 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600563 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500564 }
565
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800566 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700567 // Make sure depthWriteEnable is set so that Depth fail test will work
568 // correctly
569 // Make sure stencilTestEnable is set so that Stencil fail test will work
570 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600571 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800572 stencil.failOp = VK_STENCIL_OP_KEEP;
573 stencil.passOp = VK_STENCIL_OP_KEEP;
574 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
575 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600576
577 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
578 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600579 ds_ci.pNext = NULL;
580 ds_ci.depthTestEnable = VK_FALSE;
581 ds_ci.depthWriteEnable = VK_TRUE;
582 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
583 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600584 if (failMask & BsoFailDepthBounds) {
585 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600586 ds_ci.maxDepthBounds = 0.0f;
587 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600588 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600589 ds_ci.stencilTestEnable = VK_TRUE;
590 ds_ci.front = stencil;
591 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600592
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600593 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600594 pipelineobj.SetViewport(m_viewports);
595 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800596 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600597 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600598 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800599 commandBuffer->BindPipeline(pipelineobj);
600 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500601}
602
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600603class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700604 public:
605 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600606};
607
Ian Elliott2c1daf52016-05-12 09:41:46 -0600608class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700609 public:
610 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600611 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600612};
613
Mark Muellerdfe37552016-07-07 14:47:42 -0600614class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600616 enum eTestEnFlags {
617 eDoubleDelete,
618 eInvalidDeviceOffset,
619 eInvalidMemoryOffset,
620 eBindNullBuffer,
621 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600622 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600623 };
624
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600625 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600626
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
628 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 return true;
630 }
631 VkDeviceSize offset_limit = 0;
632 if (eInvalidMemoryOffset == aTestFlag) {
633 VkBuffer vulkanBuffer;
634 VkBufferCreateInfo buffer_create_info = {};
635 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
636 buffer_create_info.size = 32;
637 buffer_create_info.usage = aBufferUsage;
638
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600639 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600640 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600641
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600642 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600643 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
644 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
646 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600647 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600650 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600651 }
652 if (eOffsetAlignment < offset_limit) {
653 return true;
654 }
655 return false;
656 }
657
658 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600659 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
660 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600661 if (eBindNullBuffer == aTestFlag) {
662 VulkanMemory = 0;
663 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
664 } else {
665 VkBufferCreateInfo buffer_create_info = {};
666 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
667 buffer_create_info.size = 32;
668 buffer_create_info.usage = aBufferUsage;
669
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600670 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600671
672 CreateCurrent = true;
673
674 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600675 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600676
677 VkMemoryAllocateInfo memory_allocate_info = {};
678 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800679 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600680 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
681 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682 if (!pass) {
683 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
684 return;
685 }
686
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600687 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 AllocateCurrent = true;
689 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600690 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
691 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600692 BoundCurrent = true;
693
694 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
695 }
696 }
697
698 ~VkBufferTest() {
699 if (CreateCurrent) {
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702 if (AllocateCurrent) {
703 if (InvalidDeleteEn) {
704 union {
705 VkDeviceMemory device_memory;
706 unsigned long long index_access;
707 } bad_index;
708
709 bad_index.device_memory = VulkanMemory;
710 bad_index.index_access++;
711
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600712 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600713 }
714 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
715 }
716 }
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600719
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600720 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600721
722 void TestDoubleDestroy() {
723 // Destroy the buffer but leave the flag set, which will cause
724 // the buffer to be destroyed again in the destructor.
725 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
726 }
727
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700728 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600729 bool AllocateCurrent;
730 bool BoundCurrent;
731 bool CreateCurrent;
732 bool InvalidDeleteEn;
733
734 VkBuffer VulkanBuffer;
735 VkDevice VulkanDevice;
736 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600737};
738
739class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700740 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600741 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600742 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700743 : BoundCurrent(false),
744 AttributeCount(aAttributeCount),
745 BindingCount(aBindingCount),
746 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600747 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600748 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
749 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700750 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600751
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600752 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
753 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600754
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600755 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
756 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
757 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
758 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
759 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
761 unsigned i = 0;
762 do {
763 VertexInputAttributeDescription[i].binding = BindId;
764 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600765 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
766 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600767 i++;
768 } while (AttributeCount < i);
769
770 i = 0;
771 do {
772 VertexInputBindingDescription[i].binding = BindId;
773 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600774 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600775 i++;
776 } while (BindingCount < i);
777 }
778
779 ~VkVerticesObj() {
780 if (VertexInputAttributeDescription) {
781 delete[] VertexInputAttributeDescription;
782 }
783 if (VertexInputBindingDescription) {
784 delete[] VertexInputBindingDescription;
785 }
786 }
787
788 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600789 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
790 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600791 return true;
792 }
793
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600794 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600795 VkDeviceSize *offsetList;
796 unsigned offsetCount;
797
798 if (aOffsetCount) {
799 offsetList = aOffsetList;
800 offsetCount = aOffsetCount;
801 } else {
802 offsetList = new VkDeviceSize[1]();
803 offsetCount = 1;
804 }
805
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600806 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600807 BoundCurrent = true;
808
809 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600810 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600811 }
812 }
813
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700814 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600815 static uint32_t BindIdGenerator;
816
817 bool BoundCurrent;
818 unsigned AttributeCount;
819 unsigned BindingCount;
820 uint32_t BindId;
821
822 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
823 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
824 VkVertexInputBindingDescription *VertexInputBindingDescription;
825 VkConstantBufferObj VulkanMemoryBuffer;
826};
827
828uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500829// ********************************************************************************************************************
830// ********************************************************************************************************************
831// ********************************************************************************************************************
832// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600833TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700834 TEST_DESCRIPTION(
835 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
836 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837
Tony Barbour1fa09702017-03-16 12:09:08 -0600838 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600841 // Specify NULL for a pointer to a handle
842 // Expected to trigger an error with
843 // parameter_validation::validate_required_pointer
844 vkGetPhysicalDeviceFeatures(gpu(), NULL);
845 m_errorMonitor->VerifyFound();
846
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
848 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600849 // Specify NULL for pointer to array count
850 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600851 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600852 m_errorMonitor->VerifyFound();
853
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify 0 for a required array count
856 // Expected to trigger an error with parameter_validation::validate_array
857 VkViewport view_port = {};
858 m_commandBuffer->SetViewport(0, 0, &view_port);
859 m_errorMonitor->VerifyFound();
860
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600862 // Specify NULL for a required array
863 // Expected to trigger an error with parameter_validation::validate_array
864 m_commandBuffer->SetViewport(0, 1, NULL);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify VK_NULL_HANDLE for a required handle
869 // Expected to trigger an error with
870 // parameter_validation::validate_required_handle
871 vkUnmapMemory(device(), VK_NULL_HANDLE);
872 m_errorMonitor->VerifyFound();
873
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
875 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600876 // Specify VK_NULL_HANDLE for a required handle array entry
877 // Expected to trigger an error with
878 // parameter_validation::validate_required_handle_array
879 VkFence fence = VK_NULL_HANDLE;
880 vkResetFences(device(), 1, &fence);
881 m_errorMonitor->VerifyFound();
882
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600884 // Specify NULL for a required struct pointer
885 // Expected to trigger an error with
886 // parameter_validation::validate_struct_type
887 VkDeviceMemory memory = VK_NULL_HANDLE;
888 vkAllocateMemory(device(), NULL, NULL, &memory);
889 m_errorMonitor->VerifyFound();
890
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600892 // Specify 0 for a required VkFlags parameter
893 // Expected to trigger an error with parameter_validation::validate_flags
894 m_commandBuffer->SetStencilReference(0, 0);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags array entry
899 // Expected to trigger an error with
900 // parameter_validation::validate_flags_array
901 VkSemaphore semaphore = VK_NULL_HANDLE;
902 VkPipelineStageFlags stageFlags = 0;
903 VkSubmitInfo submitInfo = {};
904 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
905 submitInfo.waitSemaphoreCount = 1;
906 submitInfo.pWaitSemaphores = &semaphore;
907 submitInfo.pWaitDstStageMask = &stageFlags;
908 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
909 m_errorMonitor->VerifyFound();
910}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600911
Dustin Gravesfce74c02016-05-10 11:42:58 -0600912TEST_F(VkLayerTest, ReservedParameter) {
913 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
914
Tony Barbour1fa09702017-03-16 12:09:08 -0600915 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600916
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918 // Specify 0 for a reserved VkFlags parameter
919 // Expected to trigger an error with
920 // parameter_validation::validate_reserved_flags
921 VkEvent event_handle = VK_NULL_HANDLE;
922 VkEventCreateInfo event_info = {};
923 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
924 event_info.flags = 1;
925 vkCreateEvent(device(), &event_info, NULL, &event_handle);
926 m_errorMonitor->VerifyFound();
927}
928
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600929TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700930 TEST_DESCRIPTION(
931 "Specify an invalid VkStructureType for a Vulkan "
932 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600933
Tony Barbour1fa09702017-03-16 12:09:08 -0600934 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600937 // Zero struct memory, effectively setting sType to
938 // VK_STRUCTURE_TYPE_APPLICATION_INFO
939 // Expected to trigger an error with
940 // parameter_validation::validate_struct_type
941 VkMemoryAllocateInfo alloc_info = {};
942 VkDeviceMemory memory = VK_NULL_HANDLE;
943 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
944 m_errorMonitor->VerifyFound();
945
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600947 // Zero struct memory, effectively setting sType to
948 // VK_STRUCTURE_TYPE_APPLICATION_INFO
949 // Expected to trigger an error with
950 // parameter_validation::validate_struct_type_array
951 VkSubmitInfo submit_info = {};
952 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
953 m_errorMonitor->VerifyFound();
954}
955
956TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600957 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600958
Tony Barbour1fa09702017-03-16 12:09:08 -0600959 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600960
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600962 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600963 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600964 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600965 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600966 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600967 // Zero-initialization will provide the correct sType
968 VkApplicationInfo app_info = {};
969 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
970 event_alloc_info.pNext = &app_info;
971 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
972 m_errorMonitor->VerifyFound();
973
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
975 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600976 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
977 // a function that has allowed pNext structure types and specify
978 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600979 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600980 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600981 VkMemoryAllocateInfo memory_alloc_info = {};
982 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
983 memory_alloc_info.pNext = &app_info;
984 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600985 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986}
Dustin Graves5d33d532016-05-09 16:21:12 -0600987
988TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600990
Tony Barbour1fa09702017-03-16 12:09:08 -0600991 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600992
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
994 "does not fall within the begin..end "
995 "range of the core VkFormat "
996 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600997 // Specify an invalid VkFormat value
998 // Expected to trigger an error with
999 // parameter_validation::validate_ranged_enum
1000 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001001 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001002 m_errorMonitor->VerifyFound();
1003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001005 // Specify an invalid VkFlags bitmask value
1006 // Expected to trigger an error with parameter_validation::validate_flags
1007 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001008 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1009 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001010 m_errorMonitor->VerifyFound();
1011
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001013 // Specify an invalid VkFlags array entry
1014 // Expected to trigger an error with
1015 // parameter_validation::validate_flags_array
1016 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001017 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001018 VkSubmitInfo submit_info = {};
1019 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1020 submit_info.waitSemaphoreCount = 1;
1021 submit_info.pWaitSemaphores = &semaphore;
1022 submit_info.pWaitDstStageMask = &stage_flags;
1023 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1024 m_errorMonitor->VerifyFound();
1025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001027 // Specify an invalid VkBool32 value
1028 // Expected to trigger a warning with
1029 // parameter_validation::validate_bool32
1030 VkSampler sampler = VK_NULL_HANDLE;
1031 VkSamplerCreateInfo sampler_info = {};
1032 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1033 sampler_info.pNext = NULL;
1034 sampler_info.magFilter = VK_FILTER_NEAREST;
1035 sampler_info.minFilter = VK_FILTER_NEAREST;
1036 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1037 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1038 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1039 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1040 sampler_info.mipLodBias = 1.0;
1041 sampler_info.maxAnisotropy = 1;
1042 sampler_info.compareEnable = VK_FALSE;
1043 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1044 sampler_info.minLod = 1.0;
1045 sampler_info.maxLod = 1.0;
1046 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1047 sampler_info.unnormalizedCoordinates = VK_FALSE;
1048 // Not VK_TRUE or VK_FALSE
1049 sampler_info.anisotropyEnable = 3;
1050 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1051 m_errorMonitor->VerifyFound();
1052}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001053
1054TEST_F(VkLayerTest, FailedReturnValue) {
1055 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1056
Tony Barbour1fa09702017-03-16 12:09:08 -06001057 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001058
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001059 // Find an unsupported image format
1060 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1061 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1062 VkFormat format = static_cast<VkFormat>(f);
1063 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001064 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 unsupported = format;
1066 break;
1067 }
1068 }
1069
1070 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1072 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001073 // Specify an unsupported VkFormat value to generate a
1074 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1075 // Expected to trigger a warning from
1076 // parameter_validation::validate_result
1077 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001078 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1079 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001080 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1081 m_errorMonitor->VerifyFound();
1082 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001083}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001084
1085TEST_F(VkLayerTest, UpdateBufferAlignment) {
1086 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001087 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001088
Tony Barbour1fa09702017-03-16 12:09:08 -06001089 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090
1091 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1092 vk_testing::Buffer buffer;
1093 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1094
Tony Barbour552f6c02016-12-21 14:34:07 -07001095 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001098 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1099 m_errorMonitor->VerifyFound();
1100
1101 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001103 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1104 m_errorMonitor->VerifyFound();
1105
1106 // Introduce failure by using dataSize that is < 0
1107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using dataSize that is > 65536
1113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001114 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1116 m_errorMonitor->VerifyFound();
1117
Tony Barbour552f6c02016-12-21 14:34:07 -07001118 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119}
1120
1121TEST_F(VkLayerTest, FillBufferAlignment) {
1122 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1123
Tony Barbour1fa09702017-03-16 12:09:08 -06001124 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125
1126 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1127 vk_testing::Buffer buffer;
1128 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1129
Tony Barbour552f6c02016-12-21 14:34:07 -07001130 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001131
1132 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001134 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1135 m_errorMonitor->VerifyFound();
1136
1137 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001139 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1140 m_errorMonitor->VerifyFound();
1141
1142 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001144 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1145 m_errorMonitor->VerifyFound();
1146
Tony Barbour552f6c02016-12-21 14:34:07 -07001147 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001148}
Dustin Graves40f35822016-06-23 11:12:53 -06001149
Cortd889ff92016-07-27 09:51:27 -07001150TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1151 VkResult err;
1152
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001153 TEST_DESCRIPTION(
1154 "Attempt to use a non-solid polygon fill mode in a "
1155 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001156
Tony Barbour1fa09702017-03-16 12:09:08 -06001157 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001158 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1159
1160 std::vector<const char *> device_extension_names;
1161 auto features = m_device->phy().features();
1162 // Artificially disable support for non-solid fill modes
1163 features.fillModeNonSolid = false;
1164 // The sacrificial device object
1165 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1166
1167 VkRenderpassObj render_pass(&test_device);
1168
1169 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1170 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1171 pipeline_layout_ci.setLayoutCount = 0;
1172 pipeline_layout_ci.pSetLayouts = NULL;
1173
1174 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001175 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001176 ASSERT_VK_SUCCESS(err);
1177
1178 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1179 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1180 rs_ci.pNext = nullptr;
1181 rs_ci.lineWidth = 1.0f;
1182 rs_ci.rasterizerDiscardEnable = true;
1183
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001184 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1185 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001186
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001187 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1189 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001190 {
1191 VkPipelineObj pipe(&test_device);
1192 pipe.AddShader(&vs);
1193 pipe.AddShader(&fs);
1194 pipe.AddColorAttachment();
1195 // Introduce failure by setting unsupported polygon mode
1196 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1197 pipe.SetRasterization(&rs_ci);
1198 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1199 }
1200 m_errorMonitor->VerifyFound();
1201
1202 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1204 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001205 {
1206 VkPipelineObj pipe(&test_device);
1207 pipe.AddShader(&vs);
1208 pipe.AddShader(&fs);
1209 pipe.AddColorAttachment();
1210 // Introduce failure by setting unsupported polygon mode
1211 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1212 pipe.SetRasterization(&rs_ci);
1213 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1214 }
1215 m_errorMonitor->VerifyFound();
1216
Cortd889ff92016-07-27 09:51:27 -07001217 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1218}
1219
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001220#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001221TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001222{
1223 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001224 VkFenceCreateInfo fenceInfo = {};
1225 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1226 fenceInfo.pNext = NULL;
1227 fenceInfo.flags = 0;
1228
Mike Weiblencce7ec72016-10-17 19:33:05 -06001229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001230
Tony Barbour1fa09702017-03-16 12:09:08 -06001231 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001232
1233 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1234 vk_testing::Buffer buffer;
1235 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001236
Tony Barbourfe3351b2015-07-28 10:17:20 -06001237 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001238 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001239 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001240
1241 testFence.init(*m_device, fenceInfo);
1242
1243 // Bypass framework since it does the waits automatically
1244 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001245 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001246 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1247 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001248 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001249 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001250 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001251 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001252 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001253 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001254 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001255
1256 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257 ASSERT_VK_SUCCESS( err );
1258
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001259 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001260 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001261
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001262 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263}
1264
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001266{
1267 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001268 VkFenceCreateInfo fenceInfo = {};
1269 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1270 fenceInfo.pNext = NULL;
1271 fenceInfo.flags = 0;
1272
Mike Weiblencce7ec72016-10-17 19:33:05 -06001273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001274
Tony Barbour1fa09702017-03-16 12:09:08 -06001275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001276 ASSERT_NO_FATAL_FAILURE(InitViewport());
1277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1278
Tony Barbourfe3351b2015-07-28 10:17:20 -06001279 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001280 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001281 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001282
1283 testFence.init(*m_device, fenceInfo);
1284
1285 // Bypass framework since it does the waits automatically
1286 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001287 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1289 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001290 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001291 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001292 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001293 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001294 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001295 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001296 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001297
1298 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001299 ASSERT_VK_SUCCESS( err );
1300
Jon Ashburnf19916e2016-01-11 13:12:43 -07001301 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001302 VkCommandBufferBeginInfo info = {};
1303 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1304 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001305 info.renderPass = VK_NULL_HANDLE;
1306 info.subpass = 0;
1307 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001308 info.occlusionQueryEnable = VK_FALSE;
1309 info.queryFlags = 0;
1310 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001311
1312 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001313 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001314
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001315 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001316}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001317#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001318
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001319TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1320 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1321
Tony Barbour1fa09702017-03-16 12:09:08 -06001322 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001323
1324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1325 VkBuffer buffer;
1326 VkBufferCreateInfo buf_info = {};
1327 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1328 buf_info.pNext = NULL;
1329 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1330 buf_info.size = 2048;
1331 buf_info.queueFamilyIndexCount = 0;
1332 buf_info.pQueueFamilyIndices = NULL;
1333 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1334 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1335 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1336 m_errorMonitor->VerifyFound();
1337
1338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1339 VkImage image;
1340 VkImageCreateInfo image_create_info = {};
1341 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1342 image_create_info.pNext = NULL;
1343 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1344 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1345 image_create_info.extent.width = 512;
1346 image_create_info.extent.height = 64;
1347 image_create_info.extent.depth = 1;
1348 image_create_info.mipLevels = 1;
1349 image_create_info.arrayLayers = 1;
1350 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1351 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1352 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1353 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1354 image_create_info.queueFamilyIndexCount = 0;
1355 image_create_info.pQueueFamilyIndices = NULL;
1356 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1357 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1358 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1359 m_errorMonitor->VerifyFound();
1360}
1361
Dave Houlton829c0d82017-01-24 15:09:17 -07001362TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1363 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1364
1365 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001366 VkPhysicalDeviceFeatures device_features = {};
1367 ASSERT_NO_FATAL_FAILURE(Init());
1368 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001369
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001370 // Destroy the first instance
1371 ShutdownFramework();
1372
1373 // Mask out device features we don't want and create a new instance
1374 device_features.sparseResidencyImage2D = VK_FALSE;
1375 device_features.sparseResidencyImage3D = VK_FALSE;
1376 ASSERT_NO_FATAL_FAILURE(Init(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001377
1378 VkImage image = VK_NULL_HANDLE;
1379 VkResult result = VK_RESULT_MAX_ENUM;
1380 VkImageCreateInfo image_create_info = {};
1381 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1382 image_create_info.pNext = NULL;
1383 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1384 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1385 image_create_info.extent.width = 512;
1386 image_create_info.extent.height = 1;
1387 image_create_info.extent.depth = 1;
1388 image_create_info.mipLevels = 1;
1389 image_create_info.arrayLayers = 1;
1390 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1391 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1392 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1393 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1394 image_create_info.queueFamilyIndexCount = 0;
1395 image_create_info.pQueueFamilyIndices = NULL;
1396 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1397 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1398
1399 // 1D image w/ sparse residency is an error
1400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1401 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1402 m_errorMonitor->VerifyFound();
1403 if (VK_SUCCESS == result) {
1404 vkDestroyImage(m_device->device(), image, NULL);
1405 image = VK_NULL_HANDLE;
1406 }
1407
1408 // 2D image w/ sparse residency when feature isn't available
1409 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1410 image_create_info.extent.height = 64;
1411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1412 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1413 m_errorMonitor->VerifyFound();
1414 if (VK_SUCCESS == result) {
1415 vkDestroyImage(m_device->device(), image, NULL);
1416 image = VK_NULL_HANDLE;
1417 }
1418
1419 // 3D image w/ sparse residency when feature isn't available
1420 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1421 image_create_info.extent.depth = 8;
1422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1423 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1424 m_errorMonitor->VerifyFound();
1425 if (VK_SUCCESS == result) {
1426 vkDestroyImage(m_device->device(), image, NULL);
1427 image = VK_NULL_HANDLE;
1428 }
1429}
1430
1431TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1432 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1433
1434 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001435 VkPhysicalDeviceFeatures device_features = {};
1436 ASSERT_NO_FATAL_FAILURE(Init());
1437 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001438
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001439 // Destroy the first instance
1440 ShutdownFramework();
1441
1442 // These tests require that the device support sparse residency for 2D images
1443 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1444 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001445 return;
1446 }
1447
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001448 // Mask out device features we don't want and create a new instance
1449 device_features.sparseResidency2Samples = VK_FALSE;
1450 device_features.sparseResidency4Samples = VK_FALSE;
1451 device_features.sparseResidency8Samples = VK_FALSE;
1452 device_features.sparseResidency16Samples = VK_FALSE;
1453 ASSERT_NO_FATAL_FAILURE(Init(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001454
1455 VkImage image = VK_NULL_HANDLE;
1456 VkResult result = VK_RESULT_MAX_ENUM;
1457 VkImageCreateInfo image_create_info = {};
1458 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1459 image_create_info.pNext = NULL;
1460 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1461 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1462 image_create_info.extent.width = 64;
1463 image_create_info.extent.height = 64;
1464 image_create_info.extent.depth = 1;
1465 image_create_info.mipLevels = 1;
1466 image_create_info.arrayLayers = 1;
1467 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1468 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1469 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1470 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1471 image_create_info.queueFamilyIndexCount = 0;
1472 image_create_info.pQueueFamilyIndices = NULL;
1473 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1474 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1475
1476 // 2D image w/ sparse residency and linear tiling is an error
1477 m_errorMonitor->SetDesiredFailureMsg(
1478 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1479 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1487
1488 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1489 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1491 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1492 m_errorMonitor->VerifyFound();
1493 if (VK_SUCCESS == result) {
1494 vkDestroyImage(m_device->device(), image, NULL);
1495 image = VK_NULL_HANDLE;
1496 }
1497
1498 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1500 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1501 m_errorMonitor->VerifyFound();
1502 if (VK_SUCCESS == result) {
1503 vkDestroyImage(m_device->device(), image, NULL);
1504 image = VK_NULL_HANDLE;
1505 }
1506
1507 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1509 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1510 m_errorMonitor->VerifyFound();
1511 if (VK_SUCCESS == result) {
1512 vkDestroyImage(m_device->device(), image, NULL);
1513 image = VK_NULL_HANDLE;
1514 }
1515
1516 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1518 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1519 m_errorMonitor->VerifyFound();
1520 if (VK_SUCCESS == result) {
1521 vkDestroyImage(m_device->device(), image, NULL);
1522 image = VK_NULL_HANDLE;
1523 }
1524}
1525
Tobin Ehlisf11be982016-05-11 13:52:53 -06001526TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001527 TEST_DESCRIPTION(
1528 "Create a buffer and image, allocate memory, and bind the "
1529 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001530 VkResult err;
1531 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001532 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001533
Tobin Ehlis077ded32016-05-12 17:39:13 -06001534 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001536 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001537 VkDeviceMemory mem; // buffer will be bound first
1538 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001539 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001540 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001541
1542 VkBufferCreateInfo buf_info = {};
1543 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1544 buf_info.pNext = NULL;
1545 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1546 buf_info.size = 256;
1547 buf_info.queueFamilyIndexCount = 0;
1548 buf_info.pQueueFamilyIndices = NULL;
1549 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1550 buf_info.flags = 0;
1551 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1552 ASSERT_VK_SUCCESS(err);
1553
Tobin Ehlis077ded32016-05-12 17:39:13 -06001554 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001555
1556 VkImageCreateInfo image_create_info = {};
1557 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1558 image_create_info.pNext = NULL;
1559 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1560 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1561 image_create_info.extent.width = 64;
1562 image_create_info.extent.height = 64;
1563 image_create_info.extent.depth = 1;
1564 image_create_info.mipLevels = 1;
1565 image_create_info.arrayLayers = 1;
1566 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001567 // Image tiling must be optimal to trigger error when aliasing linear buffer
1568 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001569 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1570 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1571 image_create_info.queueFamilyIndexCount = 0;
1572 image_create_info.pQueueFamilyIndices = NULL;
1573 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1574 image_create_info.flags = 0;
1575
Tobin Ehlisf11be982016-05-11 13:52:53 -06001576 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1577 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001578 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1579 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001580
Tobin Ehlis077ded32016-05-12 17:39:13 -06001581 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1582
1583 VkMemoryAllocateInfo alloc_info = {};
1584 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1585 alloc_info.pNext = NULL;
1586 alloc_info.memoryTypeIndex = 0;
1587 // Ensure memory is big enough for both bindings
1588 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001589 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1590 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001592 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001594 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 return;
1596 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001597 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1598 ASSERT_VK_SUCCESS(err);
1599 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1600 ASSERT_VK_SUCCESS(err);
1601
Rene Lindsayd14f5572016-12-16 14:57:18 -07001602 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1603
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001605 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001606 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1607 m_errorMonitor->VerifyFound();
1608
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001609 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001610 // aliasing buffer2
1611 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1612 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001613 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1614 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001615 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001616 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001618 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001619 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001620 m_errorMonitor->VerifyFound();
1621
1622 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001623 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001624 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001625 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001626 vkFreeMemory(m_device->device(), mem, NULL);
1627 vkFreeMemory(m_device->device(), mem_img, NULL);
1628}
1629
Tobin Ehlis35372522016-05-12 08:32:31 -06001630TEST_F(VkLayerTest, InvalidMemoryMapping) {
1631 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1632 VkResult err;
1633 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001634 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001635
1636 VkBuffer buffer;
1637 VkDeviceMemory mem;
1638 VkMemoryRequirements mem_reqs;
1639
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001640 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1641
Tobin Ehlis35372522016-05-12 08:32:31 -06001642 VkBufferCreateInfo buf_info = {};
1643 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1644 buf_info.pNext = NULL;
1645 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1646 buf_info.size = 256;
1647 buf_info.queueFamilyIndexCount = 0;
1648 buf_info.pQueueFamilyIndices = NULL;
1649 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1650 buf_info.flags = 0;
1651 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1652 ASSERT_VK_SUCCESS(err);
1653
1654 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1655 VkMemoryAllocateInfo alloc_info = {};
1656 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1657 alloc_info.pNext = NULL;
1658 alloc_info.memoryTypeIndex = 0;
1659
1660 // Ensure memory is big enough for both bindings
1661 static const VkDeviceSize allocation_size = 0x10000;
1662 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001663 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001664 if (!pass) {
1665 vkDestroyBuffer(m_device->device(), buffer, NULL);
1666 return;
1667 }
1668 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1669 ASSERT_VK_SUCCESS(err);
1670
1671 uint8_t *pData;
1672 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001674 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1675 m_errorMonitor->VerifyFound();
1676 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001677 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001678 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1680 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1681 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 m_errorMonitor->VerifyFound();
1683
1684 // Unmap the memory to avoid re-map error
1685 vkUnmapMemory(m_device->device(), mem);
1686 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1688 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1689 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001690 m_errorMonitor->VerifyFound();
1691 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1693 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001694 m_errorMonitor->VerifyFound();
1695 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001697 vkUnmapMemory(m_device->device(), mem);
1698 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001699
Tobin Ehlis35372522016-05-12 08:32:31 -06001700 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001701 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001702 ASSERT_VK_SUCCESS(err);
1703 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001704 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001705 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001706 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001708 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1709 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001710
Tobin Ehlis35372522016-05-12 08:32:31 -06001711 // Now flush range that oversteps mapped range
1712 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001713 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001714 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001715 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001716 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1718 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1719 m_errorMonitor->VerifyFound();
1720
1721 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1722 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001723 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001724 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001725 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001726 mmr.size = VK_WHOLE_SIZE;
1727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001728 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1729 m_errorMonitor->VerifyFound();
1730
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001731#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001732 // Some platforms have an atomsize of 1 which makes the test meaningless
1733 if (atom_size > 3) {
1734 // Now with an offset NOT a multiple of the device limit
1735 vkUnmapMemory(m_device->device(), mem);
1736 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1737 ASSERT_VK_SUCCESS(err);
1738 mmr.offset = 3; // Not a multiple of atom_size
1739 mmr.size = VK_WHOLE_SIZE;
1740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1741 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1742 m_errorMonitor->VerifyFound();
1743
1744 // Now with a size NOT a multiple of the device limit
1745 vkUnmapMemory(m_device->device(), mem);
1746 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1747 ASSERT_VK_SUCCESS(err);
1748 mmr.offset = atom_size;
1749 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1751 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1752 m_errorMonitor->VerifyFound();
1753 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001754#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001755 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1756 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001757 if (!pass) {
1758 vkFreeMemory(m_device->device(), mem, NULL);
1759 vkDestroyBuffer(m_device->device(), buffer, NULL);
1760 return;
1761 }
1762 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1763 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1764
1765 vkDestroyBuffer(m_device->device(), buffer, NULL);
1766 vkFreeMemory(m_device->device(), mem, NULL);
1767}
1768
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001769#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001770TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1771 VkResult err;
1772 bool pass;
1773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001774 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1775 // following declaration (which is temporarily being moved below):
1776 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001777 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001778 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001779 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001780 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001781 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001782 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001783
Tony Barbour1fa09702017-03-16 12:09:08 -06001784 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001785
Ian Elliott3f06ce52016-04-29 14:46:21 -06001786#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1787#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1788 // Use the functions from the VK_KHR_android_surface extension without
1789 // enabling that extension:
1790
1791 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001792 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1794 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001795 pass = (err != VK_SUCCESS);
1796 ASSERT_TRUE(pass);
1797 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001798#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001799
Ian Elliott3f06ce52016-04-29 14:46:21 -06001800#if defined(VK_USE_PLATFORM_MIR_KHR)
1801 // Use the functions from the VK_KHR_mir_surface extension without enabling
1802 // that extension:
1803
1804 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001805 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001807 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1808 pass = (err != VK_SUCCESS);
1809 ASSERT_TRUE(pass);
1810 m_errorMonitor->VerifyFound();
1811
1812 // Tell whether an mir_connection supports presentation:
1813 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1815 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001816 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001817#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818
Ian Elliott3f06ce52016-04-29 14:46:21 -06001819#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1820 // Use the functions from the VK_KHR_wayland_surface extension without
1821 // enabling that extension:
1822
1823 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001824 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1826 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001827 pass = (err != VK_SUCCESS);
1828 ASSERT_TRUE(pass);
1829 m_errorMonitor->VerifyFound();
1830
1831 // Tell whether an wayland_display supports presentation:
1832 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1834 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001835 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001836#endif // VK_USE_PLATFORM_WAYLAND_KHR
1837#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001838
Ian Elliott3f06ce52016-04-29 14:46:21 -06001839#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001840 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1841 // TO NON-LINUX PLATFORMS:
1842 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001843 // Use the functions from the VK_KHR_win32_surface extension without
1844 // enabling that extension:
1845
1846 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001847 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1849 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001850 pass = (err != VK_SUCCESS);
1851 ASSERT_TRUE(pass);
1852 m_errorMonitor->VerifyFound();
1853
1854 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001856 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001857 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001858// Set this (for now, until all platforms are supported and tested):
1859#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001860#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001861#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001862 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1863 // TO NON-LINUX PLATFORMS:
1864 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001865#endif
1866#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001867 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1868 // that extension:
1869
1870 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001871 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001873 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1874 pass = (err != VK_SUCCESS);
1875 ASSERT_TRUE(pass);
1876 m_errorMonitor->VerifyFound();
1877
1878 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001879 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001880 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1882 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001883 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001884// Set this (for now, until all platforms are supported and tested):
1885#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001886#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001887
Ian Elliott12630812016-04-29 14:35:43 -06001888#if defined(VK_USE_PLATFORM_XLIB_KHR)
1889 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1890 // that extension:
1891
1892 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001893 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001895 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1896 pass = (err != VK_SUCCESS);
1897 ASSERT_TRUE(pass);
1898 m_errorMonitor->VerifyFound();
1899
1900 // Tell whether an Xlib VisualID supports presentation:
1901 Display *dpy = NULL;
1902 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001904 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1905 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001906// Set this (for now, until all platforms are supported and tested):
1907#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001908#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001909
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001910// Use the functions from the VK_KHR_surface extension without enabling
1911// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001912
Ian Elliott489eec02016-05-05 14:12:44 -06001913#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001914 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001916 vkDestroySurfaceKHR(instance(), surface, NULL);
1917 m_errorMonitor->VerifyFound();
1918
1919 // Check if surface supports presentation:
1920 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001922 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1923 pass = (err != VK_SUCCESS);
1924 ASSERT_TRUE(pass);
1925 m_errorMonitor->VerifyFound();
1926
1927 // Check surface capabilities:
1928 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1930 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001931 pass = (err != VK_SUCCESS);
1932 ASSERT_TRUE(pass);
1933 m_errorMonitor->VerifyFound();
1934
1935 // Check surface formats:
1936 uint32_t format_count = 0;
1937 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1939 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001940 pass = (err != VK_SUCCESS);
1941 ASSERT_TRUE(pass);
1942 m_errorMonitor->VerifyFound();
1943
1944 // Check surface present modes:
1945 uint32_t present_mode_count = 0;
1946 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1948 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 pass = (err != VK_SUCCESS);
1950 ASSERT_TRUE(pass);
1951 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001952#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001953
Ian Elliott1c32c772016-04-28 14:47:13 -06001954 // Use the functions from the VK_KHR_swapchain extension without enabling
1955 // that extension:
1956
1957 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001959 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1960 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001961 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001962 pass = (err != VK_SUCCESS);
1963 ASSERT_TRUE(pass);
1964 m_errorMonitor->VerifyFound();
1965
1966 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1968 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001969 pass = (err != VK_SUCCESS);
1970 ASSERT_TRUE(pass);
1971 m_errorMonitor->VerifyFound();
1972
Chris Forbeseb7d5502016-09-13 18:19:21 +12001973 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1974 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1975 VkFence fence;
1976 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1977
Ian Elliott1c32c772016-04-28 14:47:13 -06001978 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001980 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001981 pass = (err != VK_SUCCESS);
1982 ASSERT_TRUE(pass);
1983 m_errorMonitor->VerifyFound();
1984
Chris Forbeseb7d5502016-09-13 18:19:21 +12001985 vkDestroyFence(m_device->device(), fence, nullptr);
1986
Ian Elliott1c32c772016-04-28 14:47:13 -06001987 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001988 //
1989 // NOTE: Currently can't test this because a real swapchain is needed (as
1990 // opposed to the fake one we created) in order for the layer to lookup the
1991 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001992
1993 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001995 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1996 m_errorMonitor->VerifyFound();
1997}
Chris Forbes09368e42016-10-13 11:59:22 +13001998#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001999
Karl Schultz6addd812016-02-02 17:17:23 -07002000TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2001 VkResult err;
2002 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2005 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002006
Tony Barbour1fa09702017-03-16 12:09:08 -06002007 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002008
2009 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002010 VkImage image;
2011 VkDeviceMemory mem;
2012 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002013
Karl Schultz6addd812016-02-02 17:17:23 -07002014 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2015 const int32_t tex_width = 32;
2016 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002017
Tony Barboureb254902015-07-15 12:50:33 -06002018 VkImageCreateInfo image_create_info = {};
2019 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002020 image_create_info.pNext = NULL;
2021 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2022 image_create_info.format = tex_format;
2023 image_create_info.extent.width = tex_width;
2024 image_create_info.extent.height = tex_height;
2025 image_create_info.extent.depth = 1;
2026 image_create_info.mipLevels = 1;
2027 image_create_info.arrayLayers = 1;
2028 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2029 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2030 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2031 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002032 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002033
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002034 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002035 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002036 mem_alloc.pNext = NULL;
2037 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002038
Chia-I Wuf7458c52015-10-26 21:10:41 +08002039 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040 ASSERT_VK_SUCCESS(err);
2041
Karl Schultz6addd812016-02-02 17:17:23 -07002042 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002043
Mark Lobodzinski23065352015-05-29 09:32:35 -05002044 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002045
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002046 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002047 if (!pass) { // If we can't find any unmappable memory this test doesn't
2048 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002049 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002050 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002051 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002052
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002053 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002054 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002055 ASSERT_VK_SUCCESS(err);
2056
2057 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002058 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002059 ASSERT_VK_SUCCESS(err);
2060
2061 // Map memory as if to initialize the image
2062 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002063 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002064
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002065 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002066
Chia-I Wuf7458c52015-10-26 21:10:41 +08002067 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002068 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002069}
2070
Karl Schultz6addd812016-02-02 17:17:23 -07002071TEST_F(VkLayerTest, RebindMemory) {
2072 VkResult err;
2073 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002076
Tony Barbour1fa09702017-03-16 12:09:08 -06002077 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002078
2079 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002080 VkImage image;
2081 VkDeviceMemory mem1;
2082 VkDeviceMemory mem2;
2083 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002084
Karl Schultz6addd812016-02-02 17:17:23 -07002085 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2086 const int32_t tex_width = 32;
2087 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002088
Tony Barboureb254902015-07-15 12:50:33 -06002089 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002090 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2091 image_create_info.pNext = NULL;
2092 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2093 image_create_info.format = tex_format;
2094 image_create_info.extent.width = tex_width;
2095 image_create_info.extent.height = tex_height;
2096 image_create_info.extent.depth = 1;
2097 image_create_info.mipLevels = 1;
2098 image_create_info.arrayLayers = 1;
2099 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2100 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2101 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2102 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002103
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002104 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002105 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2106 mem_alloc.pNext = NULL;
2107 mem_alloc.allocationSize = 0;
2108 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002109
Karl Schultz6addd812016-02-02 17:17:23 -07002110 // Introduce failure, do NOT set memProps to
2111 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002112 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002113 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002114 ASSERT_VK_SUCCESS(err);
2115
Karl Schultz6addd812016-02-02 17:17:23 -07002116 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002117
2118 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002119 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002120 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002121
2122 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002123 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002124 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002125 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002126 ASSERT_VK_SUCCESS(err);
2127
2128 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002129 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002130 ASSERT_VK_SUCCESS(err);
2131
Karl Schultz6addd812016-02-02 17:17:23 -07002132 // Introduce validation failure, try to bind a different memory object to
2133 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002134 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002135
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002136 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002137
Chia-I Wuf7458c52015-10-26 21:10:41 +08002138 vkDestroyImage(m_device->device(), image, NULL);
2139 vkFreeMemory(m_device->device(), mem1, NULL);
2140 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002141}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002142
Karl Schultz6addd812016-02-02 17:17:23 -07002143TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002144 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002145
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2147 "submitted in SIGNALED state. Fences "
2148 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002149
2150 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002151 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2152 fenceInfo.pNext = NULL;
2153 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002154
Tony Barbour1fa09702017-03-16 12:09:08 -06002155 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002156 ASSERT_NO_FATAL_FAILURE(InitViewport());
2157 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2158
Tony Barbour552f6c02016-12-21 14:34:07 -07002159 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002160 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002161 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002162
2163 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002164
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002165 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002166 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2167 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002168 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002169 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002170 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002171 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002172 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002173 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002174 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002175
2176 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002177 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002178
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002179 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002180}
Chris Forbes4e44c912016-06-16 10:20:00 +12002181
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002182TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002183 TEST_DESCRIPTION(
2184 "Specify wrong usage for image then create conflicting view of image "
2185 "Initialize buffer with wrong usage then perform copy expecting errors "
2186 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002188
Tony Barbour1fa09702017-03-16 12:09:08 -06002189 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002190 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002191 if (!format) {
2192 printf(" No Depth + Stencil format found. Skipped.\n");
2193 return;
2194 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002195
Tony Barbourf92621a2016-05-02 14:28:12 -06002196 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002197 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002198 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002199 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002200
Tony Barbourf92621a2016-05-02 14:28:12 -06002201 VkImageView dsv;
2202 VkImageViewCreateInfo dsvci = {};
2203 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2204 dsvci.image = image.handle();
2205 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002206 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002207 dsvci.subresourceRange.layerCount = 1;
2208 dsvci.subresourceRange.baseMipLevel = 0;
2209 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002210 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002211
Tony Barbourf92621a2016-05-02 14:28:12 -06002212 // Create a view with depth / stencil aspect for image with different usage
2213 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002214
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002215 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002216
2217 // Initialize buffer with TRANSFER_DST usage
2218 vk_testing::Buffer buffer;
2219 VkMemoryPropertyFlags reqs = 0;
2220 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2221 VkBufferImageCopy region = {};
2222 region.bufferRowLength = 128;
2223 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002224 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002225 region.imageSubresource.layerCount = 1;
2226 region.imageExtent.height = 16;
2227 region.imageExtent.width = 16;
2228 region.imageExtent.depth = 1;
2229
Mark Lobodzinski80871462017-02-16 10:37:27 -07002230 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002231 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002232
Chris Forbesda581202016-10-06 18:25:26 +13002233 // two separate errors from this call:
2234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2236
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002237 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2238 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002239 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002240}
Tony Barbour75d79f02016-08-30 09:39:07 -06002241
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002242TEST_F(VkLayerTest, LeakAnObject) {
2243 VkResult err;
2244
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002245 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002246
2247 // Note that we have to create a new device since destroying the
2248 // framework's device causes Teardown() to fail and just calling Teardown
2249 // will destroy the errorMonitor.
2250
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252
Tony Barbour1fa09702017-03-16 12:09:08 -06002253 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002254
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002255 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002256 std::vector<VkDeviceQueueCreateInfo> queue_info;
2257 queue_info.reserve(queue_props.size());
2258 std::vector<std::vector<float>> queue_priorities;
2259 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2260 VkDeviceQueueCreateInfo qi = {};
2261 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2262 qi.pNext = NULL;
2263 qi.queueFamilyIndex = i;
2264 qi.queueCount = queue_props[i].queueCount;
2265 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2266 qi.pQueuePriorities = queue_priorities[i].data();
2267 queue_info.push_back(qi);
2268 }
2269
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002270 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002271
2272 // The sacrificial device object
2273 VkDevice testDevice;
2274 VkDeviceCreateInfo device_create_info = {};
2275 auto features = m_device->phy().features();
2276 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2277 device_create_info.pNext = NULL;
2278 device_create_info.queueCreateInfoCount = queue_info.size();
2279 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002280 device_create_info.enabledLayerCount = 0;
2281 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002282 device_create_info.pEnabledFeatures = &features;
2283 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2284 ASSERT_VK_SUCCESS(err);
2285
2286 VkFence fence;
2287 VkFenceCreateInfo fence_create_info = {};
2288 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2289 fence_create_info.pNext = NULL;
2290 fence_create_info.flags = 0;
2291 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2292 ASSERT_VK_SUCCESS(err);
2293
2294 // Induce failure by not calling vkDestroyFence
2295 vkDestroyDevice(testDevice, NULL);
2296 m_errorMonitor->VerifyFound();
2297}
2298
2299TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002300 TEST_DESCRIPTION(
2301 "Allocate command buffers from one command pool and "
2302 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305
Tony Barbour1fa09702017-03-16 12:09:08 -06002306 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307 VkCommandPool command_pool_one;
2308 VkCommandPool command_pool_two;
2309
2310 VkCommandPoolCreateInfo pool_create_info{};
2311 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2312 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2313 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2314
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002315 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002316
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002317 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002318
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002319 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002320 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002321 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002323 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002325 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002327 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002328
2329 m_errorMonitor->VerifyFound();
2330
2331 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2332 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2333}
2334
2335TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2336 VkResult err;
2337
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002338 TEST_DESCRIPTION(
2339 "Allocate descriptor sets from one DS pool and "
2340 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002341
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002343
Tony Barbour1fa09702017-03-16 12:09:08 -06002344 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002345 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2346
2347 VkDescriptorPoolSize ds_type_count = {};
2348 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2349 ds_type_count.descriptorCount = 1;
2350
2351 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2352 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2353 ds_pool_ci.pNext = NULL;
2354 ds_pool_ci.flags = 0;
2355 ds_pool_ci.maxSets = 1;
2356 ds_pool_ci.poolSizeCount = 1;
2357 ds_pool_ci.pPoolSizes = &ds_type_count;
2358
2359 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002360 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002361 ASSERT_VK_SUCCESS(err);
2362
2363 // Create a second descriptor pool
2364 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002365 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002366 ASSERT_VK_SUCCESS(err);
2367
2368 VkDescriptorSetLayoutBinding dsl_binding = {};
2369 dsl_binding.binding = 0;
2370 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2371 dsl_binding.descriptorCount = 1;
2372 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2373 dsl_binding.pImmutableSamplers = NULL;
2374
2375 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2376 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2377 ds_layout_ci.pNext = NULL;
2378 ds_layout_ci.bindingCount = 1;
2379 ds_layout_ci.pBindings = &dsl_binding;
2380
2381 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002382 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002383 ASSERT_VK_SUCCESS(err);
2384
2385 VkDescriptorSet descriptorSet;
2386 VkDescriptorSetAllocateInfo alloc_info = {};
2387 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2388 alloc_info.descriptorSetCount = 1;
2389 alloc_info.descriptorPool = ds_pool_one;
2390 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002391 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002392 ASSERT_VK_SUCCESS(err);
2393
2394 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2395
2396 m_errorMonitor->VerifyFound();
2397
2398 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2399 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2400 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2401}
2402
2403TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002405
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002406 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002407
Tony Barbour1fa09702017-03-16 12:09:08 -06002408 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002409
2410 // Pass bogus handle into GetImageMemoryRequirements
2411 VkMemoryRequirements mem_reqs;
2412 uint64_t fakeImageHandle = 0xCADECADE;
2413 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2414
2415 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2416
2417 m_errorMonitor->VerifyFound();
2418}
2419
Mike Schuchardt17838902017-02-21 09:48:06 -07002420TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2421 TEST_DESCRIPTION(
2422 "Try to destroy a render pass object using a device other than the one it was created on. "
2423 "This should generate a distinct error from the invalid handle error.");
2424 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002425 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002426 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2427
2428 // Create second device
2429 float priorities[] = {1.0f};
2430 VkDeviceQueueCreateInfo queue_info{};
2431 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2432 queue_info.pNext = NULL;
2433 queue_info.flags = 0;
2434 queue_info.queueFamilyIndex = 0;
2435 queue_info.queueCount = 1;
2436 queue_info.pQueuePriorities = &priorities[0];
2437
2438 VkDeviceCreateInfo device_create_info = {};
2439 auto features = m_device->phy().features();
2440 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2441 device_create_info.pNext = NULL;
2442 device_create_info.queueCreateInfoCount = 1;
2443 device_create_info.pQueueCreateInfos = &queue_info;
2444 device_create_info.enabledLayerCount = 0;
2445 device_create_info.ppEnabledLayerNames = NULL;
2446 device_create_info.pEnabledFeatures = &features;
2447
2448 VkDevice second_device;
2449 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2450
2451 // Try to destroy the renderpass from the first device using the second device
2452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2453 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2454 m_errorMonitor->VerifyFound();
2455
2456 vkDestroyDevice(second_device, NULL);
2457}
2458
Karl Schultz6addd812016-02-02 17:17:23 -07002459TEST_F(VkLayerTest, PipelineNotBound) {
2460 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002461
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002462 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002463
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002465
Tony Barbour1fa09702017-03-16 12:09:08 -06002466 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002468
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002469 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002470 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2471 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002472
2473 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002474 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2475 ds_pool_ci.pNext = NULL;
2476 ds_pool_ci.maxSets = 1;
2477 ds_pool_ci.poolSizeCount = 1;
2478 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002479
2480 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002481 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002482 ASSERT_VK_SUCCESS(err);
2483
2484 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002485 dsl_binding.binding = 0;
2486 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2487 dsl_binding.descriptorCount = 1;
2488 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2489 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002490
2491 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002492 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2493 ds_layout_ci.pNext = NULL;
2494 ds_layout_ci.bindingCount = 1;
2495 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002496
2497 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002498 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499 ASSERT_VK_SUCCESS(err);
2500
2501 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002502 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002503 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002504 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002505 alloc_info.descriptorPool = ds_pool;
2506 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002507 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002508 ASSERT_VK_SUCCESS(err);
2509
2510 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002511 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2512 pipeline_layout_ci.pNext = NULL;
2513 pipeline_layout_ci.setLayoutCount = 1;
2514 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002515
2516 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002517 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002518 ASSERT_VK_SUCCESS(err);
2519
Mark Youngad779052016-01-06 14:26:04 -07002520 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002521
Tony Barbour552f6c02016-12-21 14:34:07 -07002522 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002523 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002524
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002525 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002526
Chia-I Wuf7458c52015-10-26 21:10:41 +08002527 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2528 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2529 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002530}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002531
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002532TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2533 VkResult err;
2534
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002535 TEST_DESCRIPTION(
2536 "Test validation check for an invalid memory type index "
2537 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002538
Tony Barbour1fa09702017-03-16 12:09:08 -06002539 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002540
2541 // Create an image, allocate memory, set a bad typeIndex and then try to
2542 // bind it
2543 VkImage image;
2544 VkDeviceMemory mem;
2545 VkMemoryRequirements mem_reqs;
2546 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2547 const int32_t tex_width = 32;
2548 const int32_t tex_height = 32;
2549
2550 VkImageCreateInfo image_create_info = {};
2551 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2552 image_create_info.pNext = NULL;
2553 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2554 image_create_info.format = tex_format;
2555 image_create_info.extent.width = tex_width;
2556 image_create_info.extent.height = tex_height;
2557 image_create_info.extent.depth = 1;
2558 image_create_info.mipLevels = 1;
2559 image_create_info.arrayLayers = 1;
2560 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2561 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2562 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2563 image_create_info.flags = 0;
2564
2565 VkMemoryAllocateInfo mem_alloc = {};
2566 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2567 mem_alloc.pNext = NULL;
2568 mem_alloc.allocationSize = 0;
2569 mem_alloc.memoryTypeIndex = 0;
2570
2571 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2572 ASSERT_VK_SUCCESS(err);
2573
2574 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2575 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002576
2577 // Introduce Failure, select invalid TypeIndex
2578 VkPhysicalDeviceMemoryProperties memory_info;
2579
2580 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2581 unsigned int i;
2582 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2583 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2584 mem_alloc.memoryTypeIndex = i;
2585 break;
2586 }
2587 }
2588 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002589 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002590 vkDestroyImage(m_device->device(), image, NULL);
2591 return;
2592 }
2593
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002595
2596 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2597 ASSERT_VK_SUCCESS(err);
2598
2599 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2600 (void)err;
2601
2602 m_errorMonitor->VerifyFound();
2603
2604 vkDestroyImage(m_device->device(), image, NULL);
2605 vkFreeMemory(m_device->device(), mem, NULL);
2606}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002607
Karl Schultz6addd812016-02-02 17:17:23 -07002608TEST_F(VkLayerTest, BindInvalidMemory) {
2609 VkResult err;
2610 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002611
Tony Barbour1fa09702017-03-16 12:09:08 -06002612 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Cortf801b982017-01-17 18:10:21 -08002614 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002615 const int32_t tex_width = 256;
2616 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002617
2618 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002619 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2620 image_create_info.pNext = NULL;
2621 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2622 image_create_info.format = tex_format;
2623 image_create_info.extent.width = tex_width;
2624 image_create_info.extent.height = tex_height;
2625 image_create_info.extent.depth = 1;
2626 image_create_info.mipLevels = 1;
2627 image_create_info.arrayLayers = 1;
2628 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002629 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002630 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2631 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002632
Cortf801b982017-01-17 18:10:21 -08002633 VkBufferCreateInfo buffer_create_info = {};
2634 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2635 buffer_create_info.pNext = NULL;
2636 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002637 buffer_create_info.size = 4 * 1024 * 1024;
2638 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002639 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002640
Cortf801b982017-01-17 18:10:21 -08002641 // Create an image/buffer, allocate memory, free it, and then try to bind it
2642 {
2643 VkImage image = VK_NULL_HANDLE;
2644 VkBuffer buffer = VK_NULL_HANDLE;
2645 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2646 ASSERT_VK_SUCCESS(err);
2647 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2648 ASSERT_VK_SUCCESS(err);
2649 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2650 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2651 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2654 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2655 image_mem_alloc.allocationSize = image_mem_reqs.size;
2656 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2657 ASSERT_TRUE(pass);
2658 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2659 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2660 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2661 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002662
Cortf801b982017-01-17 18:10:21 -08002663 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2664 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2665 ASSERT_VK_SUCCESS(err);
2666 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2667 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002668
Cortf801b982017-01-17 18:10:21 -08002669 vkFreeMemory(device(), image_mem, NULL);
2670 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002671
Cortf801b982017-01-17 18:10:21 -08002672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2673 err = vkBindImageMemory(device(), image, image_mem, 0);
2674 (void)err; // This may very well return an error.
2675 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002676
Cortf801b982017-01-17 18:10:21 -08002677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2678 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2679 (void)err; // This may very well return an error.
2680 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002681
Cortf801b982017-01-17 18:10:21 -08002682 vkDestroyImage(m_device->device(), image, NULL);
2683 vkDestroyBuffer(m_device->device(), buffer, NULL);
2684 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002685
2686 // Try to bind memory to an object that already has a memory binding
2687 {
2688 VkImage image = VK_NULL_HANDLE;
2689 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2690 ASSERT_VK_SUCCESS(err);
2691 VkBuffer buffer = VK_NULL_HANDLE;
2692 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2693 ASSERT_VK_SUCCESS(err);
2694 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2695 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2696 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2697 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2698 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2699 image_alloc_info.allocationSize = image_mem_reqs.size;
2700 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2701 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2702 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2703 ASSERT_TRUE(pass);
2704 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2705 ASSERT_TRUE(pass);
2706 VkDeviceMemory image_mem, buffer_mem;
2707 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2708 ASSERT_VK_SUCCESS(err);
2709 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2710 ASSERT_VK_SUCCESS(err);
2711
2712 err = vkBindImageMemory(device(), image, image_mem, 0);
2713 ASSERT_VK_SUCCESS(err);
2714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2715 err = vkBindImageMemory(device(), image, image_mem, 0);
2716 (void)err; // This may very well return an error.
2717 m_errorMonitor->VerifyFound();
2718
2719 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2720 ASSERT_VK_SUCCESS(err);
2721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2722 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2723 (void)err; // This may very well return an error.
2724 m_errorMonitor->VerifyFound();
2725
2726 vkFreeMemory(device(), image_mem, NULL);
2727 vkFreeMemory(device(), buffer_mem, NULL);
2728 vkDestroyImage(device(), image, NULL);
2729 vkDestroyBuffer(device(), buffer, NULL);
2730 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002731
Cort Strattonde748202017-02-17 12:50:01 -08002732 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002733 {
2734 VkImage image = VK_NULL_HANDLE;
2735 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2736 ASSERT_VK_SUCCESS(err);
2737 VkBuffer buffer = VK_NULL_HANDLE;
2738 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2739 ASSERT_VK_SUCCESS(err);
2740 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2741 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2742 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2743 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2744 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002745 // Leave some extra space for alignment wiggle room
2746 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002747 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002748 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002749 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2750 ASSERT_TRUE(pass);
2751 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2752 ASSERT_TRUE(pass);
2753 VkDeviceMemory image_mem, buffer_mem;
2754 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2755 ASSERT_VK_SUCCESS(err);
2756 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2757 ASSERT_VK_SUCCESS(err);
2758
Cort Strattonde748202017-02-17 12:50:01 -08002759 // Test unaligned memory offset
2760 {
2761 if (image_mem_reqs.alignment > 1) {
2762 VkDeviceSize image_offset = 1;
2763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2764 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2765 (void)err; // This may very well return an error.
2766 m_errorMonitor->VerifyFound();
2767 }
Cort6c7dff72017-01-27 18:34:50 -08002768
Cort Strattonde748202017-02-17 12:50:01 -08002769 if (buffer_mem_reqs.alignment > 1) {
2770 VkDeviceSize buffer_offset = 1;
2771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2772 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2773 (void)err; // This may very well return an error.
2774 m_errorMonitor->VerifyFound();
2775 }
2776 }
2777
2778 // Test memory offsets outside the memory allocation
2779 {
2780 VkDeviceSize image_offset =
2781 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2783 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2784 (void)err; // This may very well return an error.
2785 m_errorMonitor->VerifyFound();
2786
2787 VkDeviceSize buffer_offset =
2788 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2790 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2791 (void)err; // This may very well return an error.
2792 m_errorMonitor->VerifyFound();
2793 }
2794
2795 // Test memory offsets within the memory allocation, but which leave too little memory for
2796 // the resource.
2797 {
2798 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002799 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2801 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2802 (void)err; // This may very well return an error.
2803 m_errorMonitor->VerifyFound();
2804 }
2805
2806 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2807 if (buffer_offset > 0) {
2808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2809 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2810 (void)err; // This may very well return an error.
2811 m_errorMonitor->VerifyFound();
2812 }
2813 }
Cort6c7dff72017-01-27 18:34:50 -08002814
2815 vkFreeMemory(device(), image_mem, NULL);
2816 vkFreeMemory(device(), buffer_mem, NULL);
2817 vkDestroyImage(device(), image, NULL);
2818 vkDestroyBuffer(device(), buffer, NULL);
2819 }
2820
Cort Stratton4c38bb52017-01-28 13:33:10 -08002821 // Try to bind memory to an object with an invalid memory type
2822 {
2823 VkImage image = VK_NULL_HANDLE;
2824 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2825 ASSERT_VK_SUCCESS(err);
2826 VkBuffer buffer = VK_NULL_HANDLE;
2827 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2828 ASSERT_VK_SUCCESS(err);
2829 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2830 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2831 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2832 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2833 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2834 image_alloc_info.allocationSize = image_mem_reqs.size;
2835 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2836 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002837 // Create a mask of available memory types *not* supported by these resources,
2838 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002839 VkPhysicalDeviceMemoryProperties memory_properties = {};
2840 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002841 VkDeviceMemory image_mem, buffer_mem;
2842
Cort Stratton4c38bb52017-01-28 13:33:10 -08002843 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002844 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002845 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2846 ASSERT_TRUE(pass);
2847 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2848 ASSERT_VK_SUCCESS(err);
2849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2850 err = vkBindImageMemory(device(), image, image_mem, 0);
2851 (void)err; // This may very well return an error.
2852 m_errorMonitor->VerifyFound();
2853 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002854 }
2855
Cort Stratton4c38bb52017-01-28 13:33:10 -08002856 uint32_t buffer_unsupported_mem_type_bits =
2857 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002858 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002859 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2860 ASSERT_TRUE(pass);
2861 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2862 ASSERT_VK_SUCCESS(err);
2863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2864 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2865 (void)err; // This may very well return an error.
2866 m_errorMonitor->VerifyFound();
2867 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002868 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002869
Cort Stratton4c38bb52017-01-28 13:33:10 -08002870 vkDestroyImage(device(), image, NULL);
2871 vkDestroyBuffer(device(), buffer, NULL);
2872 }
2873
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002874 // Try to bind memory to an image created with sparse memory flags
2875 {
2876 VkImageCreateInfo sparse_image_create_info = image_create_info;
2877 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2878 VkImageFormatProperties image_format_properties = {};
2879 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2880 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2881 sparse_image_create_info.usage, sparse_image_create_info.flags,
2882 &image_format_properties);
2883 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2884 // most likely means sparse formats aren't supported here; skip this test.
2885 } else {
2886 ASSERT_VK_SUCCESS(err);
2887 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002888 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002889 return;
2890 } else {
2891 VkImage sparse_image = VK_NULL_HANDLE;
2892 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2893 ASSERT_VK_SUCCESS(err);
2894 VkMemoryRequirements sparse_mem_reqs = {};
2895 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2896 if (sparse_mem_reqs.memoryTypeBits != 0) {
2897 VkMemoryAllocateInfo sparse_mem_alloc = {};
2898 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2899 sparse_mem_alloc.pNext = NULL;
2900 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2901 sparse_mem_alloc.memoryTypeIndex = 0;
2902 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2903 ASSERT_TRUE(pass);
2904 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2905 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2906 ASSERT_VK_SUCCESS(err);
2907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2908 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2909 // This may very well return an error.
2910 (void)err;
2911 m_errorMonitor->VerifyFound();
2912 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2913 }
2914 vkDestroyImage(m_device->device(), sparse_image, NULL);
2915 }
2916 }
2917 }
2918
2919 // Try to bind memory to a buffer created with sparse memory flags
2920 {
2921 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2922 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2923 if (!m_device->phy().features().sparseResidencyBuffer) {
2924 // most likely means sparse formats aren't supported here; skip this test.
2925 } else {
2926 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2927 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2928 ASSERT_VK_SUCCESS(err);
2929 VkMemoryRequirements sparse_mem_reqs = {};
2930 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2931 if (sparse_mem_reqs.memoryTypeBits != 0) {
2932 VkMemoryAllocateInfo sparse_mem_alloc = {};
2933 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2934 sparse_mem_alloc.pNext = NULL;
2935 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2936 sparse_mem_alloc.memoryTypeIndex = 0;
2937 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2938 ASSERT_TRUE(pass);
2939 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2940 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2941 ASSERT_VK_SUCCESS(err);
2942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2943 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2944 // This may very well return an error.
2945 (void)err;
2946 m_errorMonitor->VerifyFound();
2947 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2948 }
2949 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2950 }
2951 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002952}
2953
Karl Schultz6addd812016-02-02 17:17:23 -07002954TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2955 VkResult err;
2956 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002957
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002959
Tony Barbour1fa09702017-03-16 12:09:08 -06002960 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002961
Karl Schultz6addd812016-02-02 17:17:23 -07002962 // Create an image object, allocate memory, destroy the object and then try
2963 // to bind it
2964 VkImage image;
2965 VkDeviceMemory mem;
2966 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002967
Karl Schultz6addd812016-02-02 17:17:23 -07002968 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2969 const int32_t tex_width = 32;
2970 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002971
2972 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002973 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2974 image_create_info.pNext = NULL;
2975 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2976 image_create_info.format = tex_format;
2977 image_create_info.extent.width = tex_width;
2978 image_create_info.extent.height = tex_height;
2979 image_create_info.extent.depth = 1;
2980 image_create_info.mipLevels = 1;
2981 image_create_info.arrayLayers = 1;
2982 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2983 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2984 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2985 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002986
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002987 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002988 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2989 mem_alloc.pNext = NULL;
2990 mem_alloc.allocationSize = 0;
2991 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002992
Chia-I Wuf7458c52015-10-26 21:10:41 +08002993 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002994 ASSERT_VK_SUCCESS(err);
2995
Karl Schultz6addd812016-02-02 17:17:23 -07002996 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002997
2998 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002999 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003000 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003001
3002 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003003 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003004 ASSERT_VK_SUCCESS(err);
3005
3006 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003007 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003008 ASSERT_VK_SUCCESS(err);
3009
3010 // Now Try to bind memory to this destroyed object
3011 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3012 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003013 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003014
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003015 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003016
Chia-I Wuf7458c52015-10-26 21:10:41 +08003017 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003018}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003019
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003020TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3021 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3022
Tony Barbour1fa09702017-03-16 12:09:08 -06003023 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003024 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3025
3026 VkVertexInputBindingDescription input_binding;
3027 memset(&input_binding, 0, sizeof(input_binding));
3028
3029 VkVertexInputAttributeDescription input_attribs;
3030 memset(&input_attribs, 0, sizeof(input_attribs));
3031
3032 // Pick a really bad format for this purpose and make sure it should fail
3033 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3034 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3035 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003036 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003037 return;
3038 }
3039
3040 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003041 char const *vsSource =
3042 "#version 450\n"
3043 "\n"
3044 "out gl_PerVertex {\n"
3045 " vec4 gl_Position;\n"
3046 "};\n"
3047 "void main(){\n"
3048 " gl_Position = vec4(1);\n"
3049 "}\n";
3050 char const *fsSource =
3051 "#version 450\n"
3052 "\n"
3053 "layout(location=0) out vec4 color;\n"
3054 "void main(){\n"
3055 " color = vec4(1);\n"
3056 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003057
3058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3059 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3060 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3061
3062 VkPipelineObj pipe(m_device);
3063 pipe.AddColorAttachment();
3064 pipe.AddShader(&vs);
3065 pipe.AddShader(&fs);
3066
3067 pipe.AddVertexInputBindings(&input_binding, 1);
3068 pipe.AddVertexInputAttribs(&input_attribs, 1);
3069
3070 VkDescriptorSetObj descriptorSet(m_device);
3071 descriptorSet.AppendDummy();
3072 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3073
3074 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3075
3076 m_errorMonitor->VerifyFound();
3077}
3078
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003079TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003080 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003081 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003082
3083 VkMemoryPropertyFlags reqs = 0;
3084 VkImageCreateInfo image_create_info = {};
3085 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3086 image_create_info.pNext = NULL;
3087 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3088 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3089 image_create_info.extent.width = 256;
3090 image_create_info.extent.height = 256;
3091 image_create_info.extent.depth = 1;
3092 image_create_info.mipLevels = 1;
3093 image_create_info.arrayLayers = 1;
3094 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3095 image_create_info.flags = 0;
3096
3097 VkImageBlit blit_region = {};
3098 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3099 blit_region.srcSubresource.baseArrayLayer = 0;
3100 blit_region.srcSubresource.layerCount = 1;
3101 blit_region.srcSubresource.mipLevel = 0;
3102 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3103 blit_region.dstSubresource.baseArrayLayer = 0;
3104 blit_region.dstSubresource.layerCount = 1;
3105 blit_region.dstSubresource.mipLevel = 0;
3106
3107 // Create two images, the source with sampleCount = 2, and attempt to blit
3108 // between them
3109 {
3110 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003111 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003112 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003119 m_errorMonitor->SetDesiredFailureMsg(
3120 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3121 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003122 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3123 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003124 m_errorMonitor->VerifyFound();
3125 m_commandBuffer->EndCommandBuffer();
3126 }
3127
3128 // Create two images, the dest with sampleCount = 4, and attempt to blit
3129 // between them
3130 {
3131 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003132 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003133 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003134 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003135 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003136 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003137 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003138 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003139 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003140 m_errorMonitor->SetDesiredFailureMsg(
3141 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3142 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003143 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3144 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003145 m_errorMonitor->VerifyFound();
3146 m_commandBuffer->EndCommandBuffer();
3147 }
3148
3149 VkBufferImageCopy copy_region = {};
3150 copy_region.bufferRowLength = 128;
3151 copy_region.bufferImageHeight = 128;
3152 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3153 copy_region.imageSubresource.layerCount = 1;
3154 copy_region.imageExtent.height = 64;
3155 copy_region.imageExtent.width = 64;
3156 copy_region.imageExtent.depth = 1;
3157
3158 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3159 // buffer to image
3160 {
3161 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003162 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3163 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003164 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003165 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003168 m_errorMonitor->SetDesiredFailureMsg(
3169 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3170 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003171 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3172 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003173 m_errorMonitor->VerifyFound();
3174 m_commandBuffer->EndCommandBuffer();
3175 }
3176
3177 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3178 // image to buffer
3179 {
3180 vk_testing::Buffer dst_buffer;
3181 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3182 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003183 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003184 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003185 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003186 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003187 m_errorMonitor->SetDesiredFailureMsg(
3188 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3189 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003190 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003191 dst_buffer.handle(), 1, &copy_region);
3192 m_errorMonitor->VerifyFound();
3193 m_commandBuffer->EndCommandBuffer();
3194 }
3195}
3196
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003197TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003198 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003199
3200 VkImageObj src_image(m_device);
3201 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3202 VkImageObj dst_image(m_device);
3203 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3204 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003205 dst_image2.init(64, 64, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003206
3207 VkImageBlit blitRegion = {};
3208 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3209 blitRegion.srcSubresource.baseArrayLayer = 0;
3210 blitRegion.srcSubresource.layerCount = 1;
3211 blitRegion.srcSubresource.mipLevel = 0;
3212 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3213 blitRegion.dstSubresource.baseArrayLayer = 0;
3214 blitRegion.dstSubresource.layerCount = 1;
3215 blitRegion.dstSubresource.mipLevel = 0;
3216
Dave Houlton34df4cb2016-12-01 16:43:06 -07003217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3218
3219 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3220 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003221
3222 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003223 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003224 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3225 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003226
3227 m_errorMonitor->VerifyFound();
3228
Dave Houlton34df4cb2016-12-01 16:43:06 -07003229 // Test should generate 2 VU failures
3230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003232
3233 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003234 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3235 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003236
Dave Houlton34df4cb2016-12-01 16:43:06 -07003237 // TODO: Note that this only verifies that at least one of the VU enums was found
3238 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003239 m_errorMonitor->VerifyFound();
3240
Tony Barbour552f6c02016-12-21 14:34:07 -07003241 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003242}
3243
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003244TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3245 VkResult err;
3246 bool pass;
3247
3248 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003249 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003250
3251 // If w/d/h granularity is 1, test is not meaningful
3252 // TODO: When virtual device limits are available, create a set of limits for this test that
3253 // will always have a granularity of > 1 for w, h, and d
3254 auto index = m_device->graphics_queue_node_index_;
3255 auto queue_family_properties = m_device->phy().queue_properties();
3256
3257 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3258 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3259 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3260 return;
3261 }
3262
3263 // Create two images of different types and try to copy between them
3264 VkImage srcImage;
3265 VkImage dstImage;
3266 VkDeviceMemory srcMem;
3267 VkDeviceMemory destMem;
3268 VkMemoryRequirements memReqs;
3269
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003270 VkImageCreateInfo image_create_info = {};
3271 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3272 image_create_info.pNext = NULL;
3273 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3274 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3275 image_create_info.extent.width = 32;
3276 image_create_info.extent.height = 32;
3277 image_create_info.extent.depth = 1;
3278 image_create_info.mipLevels = 1;
3279 image_create_info.arrayLayers = 4;
3280 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3281 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3282 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3283 image_create_info.flags = 0;
3284
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003285 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003286 ASSERT_VK_SUCCESS(err);
3287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003288 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 ASSERT_VK_SUCCESS(err);
3290
3291 // Allocate memory
3292 VkMemoryAllocateInfo memAlloc = {};
3293 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3294 memAlloc.pNext = NULL;
3295 memAlloc.allocationSize = 0;
3296 memAlloc.memoryTypeIndex = 0;
3297
3298 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3299 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003300 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003301 ASSERT_TRUE(pass);
3302 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3303 ASSERT_VK_SUCCESS(err);
3304
3305 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3306 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003307 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003308 ASSERT_VK_SUCCESS(err);
3309 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3310 ASSERT_VK_SUCCESS(err);
3311
3312 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3313 ASSERT_VK_SUCCESS(err);
3314 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3315 ASSERT_VK_SUCCESS(err);
3316
Tony Barbour552f6c02016-12-21 14:34:07 -07003317 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003318 VkImageCopy copyRegion;
3319 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3320 copyRegion.srcSubresource.mipLevel = 0;
3321 copyRegion.srcSubresource.baseArrayLayer = 0;
3322 copyRegion.srcSubresource.layerCount = 1;
3323 copyRegion.srcOffset.x = 0;
3324 copyRegion.srcOffset.y = 0;
3325 copyRegion.srcOffset.z = 0;
3326 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3327 copyRegion.dstSubresource.mipLevel = 0;
3328 copyRegion.dstSubresource.baseArrayLayer = 0;
3329 copyRegion.dstSubresource.layerCount = 1;
3330 copyRegion.dstOffset.x = 0;
3331 copyRegion.dstOffset.y = 0;
3332 copyRegion.dstOffset.z = 0;
3333 copyRegion.extent.width = 1;
3334 copyRegion.extent.height = 1;
3335 copyRegion.extent.depth = 1;
3336
3337 // Introduce failure by setting srcOffset to a bad granularity value
3338 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3340 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003341 m_errorMonitor->VerifyFound();
3342
3343 // Introduce failure by setting extent to a bad granularity value
3344 copyRegion.srcOffset.y = 0;
3345 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3347 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003348 m_errorMonitor->VerifyFound();
3349
3350 // Now do some buffer/image copies
3351 vk_testing::Buffer buffer;
3352 VkMemoryPropertyFlags reqs = 0;
3353 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3354 VkBufferImageCopy region = {};
3355 region.bufferOffset = 0;
3356 region.bufferRowLength = 3;
3357 region.bufferImageHeight = 128;
3358 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3359 region.imageSubresource.layerCount = 1;
3360 region.imageExtent.height = 16;
3361 region.imageExtent.width = 16;
3362 region.imageExtent.depth = 1;
3363 region.imageOffset.x = 0;
3364 region.imageOffset.y = 0;
3365 region.imageOffset.z = 0;
3366
3367 // Introduce failure by setting bufferRowLength to a bad granularity value
3368 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3370 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3371 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003372 m_errorMonitor->VerifyFound();
3373 region.bufferRowLength = 128;
3374
3375 // Introduce failure by setting bufferOffset to a bad granularity value
3376 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3378 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3379 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003380 m_errorMonitor->VerifyFound();
3381 region.bufferOffset = 0;
3382
3383 // Introduce failure by setting bufferImageHeight to a bad granularity value
3384 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3386 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3387 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003388 m_errorMonitor->VerifyFound();
3389 region.bufferImageHeight = 128;
3390
3391 // Introduce failure by setting imageExtent to a bad granularity value
3392 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3394 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3395 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003396 m_errorMonitor->VerifyFound();
3397 region.imageExtent.width = 16;
3398
3399 // Introduce failure by setting imageOffset to a bad granularity value
3400 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3402 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3403 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003404 m_errorMonitor->VerifyFound();
3405
Tony Barbour552f6c02016-12-21 14:34:07 -07003406 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003407
3408 vkDestroyImage(m_device->device(), srcImage, NULL);
3409 vkDestroyImage(m_device->device(), dstImage, NULL);
3410 vkFreeMemory(m_device->device(), srcMem, NULL);
3411 vkFreeMemory(m_device->device(), destMem, NULL);
3412}
3413
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003414TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003415 TEST_DESCRIPTION(
3416 "Submit command buffer created using one queue family and "
3417 "attempt to submit them on a queue created in a different "
3418 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003419
Tony Barbour1fa09702017-03-16 12:09:08 -06003420 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003421
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003422 // This test is meaningless unless we have multiple queue families
3423 auto queue_family_properties = m_device->phy().queue_properties();
3424 if (queue_family_properties.size() < 2) {
3425 return;
3426 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003428 // Get safe index of another queue family
3429 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430 VkQueue other_queue;
3431 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3432
3433 // Record an empty cmd buffer
3434 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3435 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3436 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3437 vkEndCommandBuffer(m_commandBuffer->handle());
3438
3439 // And submit on the wrong queue
3440 VkSubmitInfo submit_info = {};
3441 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3442 submit_info.commandBufferCount = 1;
3443 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003444 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003445
3446 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003447}
3448
Chris Forbes4c24a922016-11-16 08:59:10 +13003449TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003450 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003451
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003452 // There are no attachments, but refer to attachment 0.
3453 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003454 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003455 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003456 };
3457
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003458 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003459 VkRenderPass rp;
3460
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003461 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003463 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3464 m_errorMonitor->VerifyFound();
3465}
3466
Chris Forbesa58c4522016-09-28 15:19:39 +13003467TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3468 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003469 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003470
3471 // A renderpass with two subpasses, both writing the same attachment.
3472 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003473 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3474 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3475 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003476 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003477 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003478 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003479 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3480 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003481 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003482 VkSubpassDependency dep = {0,
3483 1,
3484 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3485 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3486 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3487 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3488 VK_DEPENDENCY_BY_REGION_BIT};
3489 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003490 VkRenderPass rp;
3491 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3492 ASSERT_VK_SUCCESS(err);
3493
3494 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003495 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003496 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3497
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003498 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003499 VkFramebuffer fb;
3500 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3501 ASSERT_VK_SUCCESS(err);
3502
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003503 char const *vsSource =
3504 "#version 450\n"
3505 "void main() { gl_Position = vec4(1); }\n";
3506 char const *fsSource =
3507 "#version 450\n"
3508 "layout(location=0) out vec4 color;\n"
3509 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003510
3511 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3512 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3513 VkPipelineObj pipe(m_device);
3514 pipe.AddColorAttachment();
3515 pipe.AddShader(&vs);
3516 pipe.AddShader(&fs);
3517 VkViewport view_port = {};
3518 m_viewports.push_back(view_port);
3519 pipe.SetViewport(m_viewports);
3520 VkRect2D rect = {};
3521 m_scissors.push_back(rect);
3522 pipe.SetScissor(m_scissors);
3523
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003524 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003525 VkPipelineLayout pl;
3526 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3527 ASSERT_VK_SUCCESS(err);
3528 pipe.CreateVKPipeline(pl, rp);
3529
Tony Barbour552f6c02016-12-21 14:34:07 -07003530 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003531
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003532 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3533 nullptr,
3534 rp,
3535 fb,
3536 {{
3537 0, 0,
3538 },
3539 {32, 32}},
3540 0,
3541 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003542
3543 // subtest 1: bind in the wrong subpass
3544 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3545 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003547 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3548 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3549 m_errorMonitor->VerifyFound();
3550
3551 vkCmdEndRenderPass(m_commandBuffer->handle());
3552
3553 // subtest 2: bind in correct subpass, then transition to next subpass
3554 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3555 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3556 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003558 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3559 m_errorMonitor->VerifyFound();
3560
3561 vkCmdEndRenderPass(m_commandBuffer->handle());
3562
Tony Barbour552f6c02016-12-21 14:34:07 -07003563 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003564
3565 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3566 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3567 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3568}
3569
Tony Barbour4e919972016-08-09 13:27:40 -06003570TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003571 TEST_DESCRIPTION(
3572 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3573 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003574 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003575 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3576
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003577 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3578 "Cannot execute a render pass with renderArea "
3579 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003580
3581 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3582 m_renderPassBeginInfo.renderArea.extent.width = 257;
3583 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003584 m_commandBuffer->BeginCommandBuffer();
3585 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003586 m_errorMonitor->VerifyFound();
3587}
3588
3589TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003590 TEST_DESCRIPTION(
3591 "Generate INDEPENDENT_BLEND by disabling independent "
3592 "blend and then specifying different blend states for two "
3593 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003594 VkPhysicalDeviceFeatures features = {};
3595 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003596 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003597
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003598 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3599 "Invalid Pipeline CreateInfo: If independent blend feature not "
3600 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003601
Cody Northropc31a84f2016-08-22 10:41:47 -06003602 VkDescriptorSetObj descriptorSet(m_device);
3603 descriptorSet.AppendDummy();
3604 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003605
Cody Northropc31a84f2016-08-22 10:41:47 -06003606 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003607 // Create a renderPass with two color attachments
3608 VkAttachmentReference attachments[2] = {};
3609 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003610 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003611 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3612
3613 VkSubpassDescription subpass = {};
3614 subpass.pColorAttachments = attachments;
3615 subpass.colorAttachmentCount = 2;
3616
3617 VkRenderPassCreateInfo rpci = {};
3618 rpci.subpassCount = 1;
3619 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003620 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003621
Tony Barbourffd60bd2017-03-09 12:04:55 -07003622 VkAttachmentDescription attach_desc[2] = {};
3623 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3624 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3625 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3626 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3627 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3628 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3629 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3630 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003631
Tony Barbourffd60bd2017-03-09 12:04:55 -07003632 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003633 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3634
3635 VkRenderPass renderpass;
3636 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003637 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003638 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003639
Cody Northropc31a84f2016-08-22 10:41:47 -06003640 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3641 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3642 att_state1.blendEnable = VK_TRUE;
3643 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3644 att_state2.blendEnable = VK_FALSE;
3645 pipeline.AddColorAttachment(0, &att_state1);
3646 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003647 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003648 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003649 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003650}
3651
Mike Weiblen40b160e2017-02-06 19:21:52 -07003652// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3653TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3654 TEST_DESCRIPTION(
3655 "Create a graphics pipeline that is incompatible with the requirements "
3656 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003657 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003658
3659 VkDescriptorSetObj ds_obj(m_device);
3660 ds_obj.AppendDummy();
3661 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3662
3663 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3664
3665 VkPipelineColorBlendAttachmentState att_state1 = {};
3666 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3667 att_state1.blendEnable = VK_TRUE;
3668
3669 VkRenderpassObj rp_obj(m_device);
3670
3671 {
3672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3673 VkPipelineObj pipeline(m_device);
3674 pipeline.AddShader(&vs_obj);
3675 pipeline.AddColorAttachment(0, &att_state1);
3676
3677 VkGraphicsPipelineCreateInfo info = {};
3678 pipeline.InitGraphicsPipelineCreateInfo(&info);
3679 info.pColorBlendState = nullptr;
3680
3681 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3682 m_errorMonitor->VerifyFound();
3683 }
3684}
3685
Chris Forbes26ec2122016-11-29 08:58:33 +13003686#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003687TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3688 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3689 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003690 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003691
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3693 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003694
3695 // Create a renderPass with a single color attachment
3696 VkAttachmentReference attach = {};
3697 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3698 VkSubpassDescription subpass = {};
3699 VkRenderPassCreateInfo rpci = {};
3700 rpci.subpassCount = 1;
3701 rpci.pSubpasses = &subpass;
3702 rpci.attachmentCount = 1;
3703 VkAttachmentDescription attach_desc = {};
3704 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3705 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3706 rpci.pAttachments = &attach_desc;
3707 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3708 VkRenderPass rp;
3709 subpass.pDepthStencilAttachment = &attach;
3710 subpass.pColorAttachments = NULL;
3711 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3712 m_errorMonitor->VerifyFound();
3713}
Chris Forbes26ec2122016-11-29 08:58:33 +13003714#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003715
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003716TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003717 TEST_DESCRIPTION(
3718 "Create a framebuffer where a subpass has a preserve "
3719 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003720
Tony Barbour1fa09702017-03-16 12:09:08 -06003721 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003722 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3723
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003725
3726 VkAttachmentReference color_attach = {};
3727 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3728 color_attach.attachment = 0;
3729 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3730 VkSubpassDescription subpass = {};
3731 subpass.colorAttachmentCount = 1;
3732 subpass.pColorAttachments = &color_attach;
3733 subpass.preserveAttachmentCount = 1;
3734 subpass.pPreserveAttachments = &preserve_attachment;
3735
3736 VkRenderPassCreateInfo rpci = {};
3737 rpci.subpassCount = 1;
3738 rpci.pSubpasses = &subpass;
3739 rpci.attachmentCount = 1;
3740 VkAttachmentDescription attach_desc = {};
3741 attach_desc.format = VK_FORMAT_UNDEFINED;
3742 rpci.pAttachments = &attach_desc;
3743 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3744 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003745 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003746
3747 m_errorMonitor->VerifyFound();
3748
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003749 if (result == VK_SUCCESS) {
3750 vkDestroyRenderPass(m_device->device(), rp, NULL);
3751 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003752}
3753
Chris Forbesc5389742016-06-29 11:49:23 +12003754TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003755 TEST_DESCRIPTION(
3756 "Ensure that CreateRenderPass produces a validation error "
3757 "when the source of a subpass multisample resolve "
3758 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003759
Tony Barbour1fa09702017-03-16 12:09:08 -06003760 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003761
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3763 "Subpass 0 requests multisample resolve from attachment 0 which has "
3764 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003765
3766 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003767 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3768 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3769 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3770 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3771 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3772 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003773 };
3774
3775 VkAttachmentReference color = {
3776 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3777 };
3778
3779 VkAttachmentReference resolve = {
3780 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3781 };
3782
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003783 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003785 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003786
3787 VkRenderPass rp;
3788 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3789
3790 m_errorMonitor->VerifyFound();
3791
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003792 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003793}
3794
3795TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003796 TEST_DESCRIPTION(
3797 "Ensure CreateRenderPass produces a validation error "
3798 "when a subpass multisample resolve operation is "
3799 "requested, and the destination of that resolve has "
3800 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003801
Tony Barbour1fa09702017-03-16 12:09:08 -06003802 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003803
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3805 "Subpass 0 requests multisample resolve into attachment 1, which "
3806 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003807
3808 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003809 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3810 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3811 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3812 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3813 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3814 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003815 };
3816
3817 VkAttachmentReference color = {
3818 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3819 };
3820
3821 VkAttachmentReference resolve = {
3822 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3823 };
3824
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003825 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003826
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003827 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003828
3829 VkRenderPass rp;
3830 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3831
3832 m_errorMonitor->VerifyFound();
3833
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003834 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003835}
3836
Chris Forbes3f128ef2016-06-29 14:58:53 +12003837TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003838 TEST_DESCRIPTION(
3839 "Ensure CreateRenderPass produces a validation error "
3840 "when the color and depth attachments used by a subpass "
3841 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003842
Tony Barbour1fa09702017-03-16 12:09:08 -06003843 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003844
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3846 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003847
3848 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003849 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3850 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3851 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3852 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3853 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3854 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003855 };
3856
3857 VkAttachmentReference color[] = {
3858 {
3859 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3860 },
3861 {
3862 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3863 },
3864 };
3865
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003866 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003868 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003869
3870 VkRenderPass rp;
3871 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3872
3873 m_errorMonitor->VerifyFound();
3874
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003875 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003876}
3877
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003878TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003879 TEST_DESCRIPTION(
3880 "Hit errors when attempting to create a framebuffer :\n"
3881 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3882 " 2. Use a color image as depthStencil attachment\n"
3883 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3884 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3885 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3886 " 6. Framebuffer attachment where dimensions don't match\n"
3887 " 7. Framebuffer attachment w/o identity swizzle\n"
3888 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003889
Tony Barbour1fa09702017-03-16 12:09:08 -06003890 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3892
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003893 m_errorMonitor->SetDesiredFailureMsg(
3894 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3895 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003896
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003897 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003898 VkAttachmentReference attach = {};
3899 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3900 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003901 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003902 VkRenderPassCreateInfo rpci = {};
3903 rpci.subpassCount = 1;
3904 rpci.pSubpasses = &subpass;
3905 rpci.attachmentCount = 1;
3906 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003907 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003908 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003909 rpci.pAttachments = &attach_desc;
3910 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3911 VkRenderPass rp;
3912 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3913 ASSERT_VK_SUCCESS(err);
3914
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003915 VkImageView ivs[2];
3916 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3917 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003918 VkFramebufferCreateInfo fb_info = {};
3919 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3920 fb_info.pNext = NULL;
3921 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003922 // Set mis-matching attachmentCount
3923 fb_info.attachmentCount = 2;
3924 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003925 fb_info.width = 100;
3926 fb_info.height = 100;
3927 fb_info.layers = 1;
3928
3929 VkFramebuffer fb;
3930 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3931
3932 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003933 if (err == VK_SUCCESS) {
3934 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3935 }
3936 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003937
3938 // Create a renderPass with a depth-stencil attachment created with
3939 // IMAGE_USAGE_COLOR_ATTACHMENT
3940 // Add our color attachment to pDepthStencilAttachment
3941 subpass.pDepthStencilAttachment = &attach;
3942 subpass.pColorAttachments = NULL;
3943 VkRenderPass rp_ds;
3944 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3945 ASSERT_VK_SUCCESS(err);
3946 // Set correct attachment count, but attachment has COLOR usage bit set
3947 fb_info.attachmentCount = 1;
3948 fb_info.renderPass = rp_ds;
3949
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003951 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3952
3953 m_errorMonitor->VerifyFound();
3954 if (err == VK_SUCCESS) {
3955 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3956 }
3957 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003958
3959 // Create new renderpass with alternate attachment format from fb
3960 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3961 subpass.pDepthStencilAttachment = NULL;
3962 subpass.pColorAttachments = &attach;
3963 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3964 ASSERT_VK_SUCCESS(err);
3965
3966 // Cause error due to mis-matched formats between rp & fb
3967 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3968 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3970 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003971 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3972
3973 m_errorMonitor->VerifyFound();
3974 if (err == VK_SUCCESS) {
3975 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3976 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003977 vkDestroyRenderPass(m_device->device(), rp, NULL);
3978
3979 // Create new renderpass with alternate sample count from fb
3980 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3981 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3982 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3983 ASSERT_VK_SUCCESS(err);
3984
3985 // Cause error due to mis-matched sample count between rp & fb
3986 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003988 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003989 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3990
3991 m_errorMonitor->VerifyFound();
3992 if (err == VK_SUCCESS) {
3993 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3994 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003995
3996 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003997
3998 // Create a custom imageView with non-1 mip levels
3999 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004000 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004001 ASSERT_TRUE(image.initialized());
4002
4003 VkImageView view;
4004 VkImageViewCreateInfo ivci = {};
4005 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4006 ivci.image = image.handle();
4007 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4008 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4009 ivci.subresourceRange.layerCount = 1;
4010 ivci.subresourceRange.baseMipLevel = 0;
4011 // Set level count 2 (only 1 is allowed for FB attachment)
4012 ivci.subresourceRange.levelCount = 2;
4013 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4014 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4015 ASSERT_VK_SUCCESS(err);
4016 // Re-create renderpass to have matching sample count
4017 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4018 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4019 ASSERT_VK_SUCCESS(err);
4020
4021 fb_info.renderPass = rp;
4022 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004024 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4025
4026 m_errorMonitor->VerifyFound();
4027 if (err == VK_SUCCESS) {
4028 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4029 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004030 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004031 // Update view to original color buffer and grow FB dimensions too big
4032 fb_info.pAttachments = ivs;
4033 fb_info.height = 1024;
4034 fb_info.width = 1024;
4035 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004037 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4038
4039 m_errorMonitor->VerifyFound();
4040 if (err == VK_SUCCESS) {
4041 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4042 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004043 // Create view attachment with non-identity swizzle
4044 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4045 ivci.image = image.handle();
4046 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4047 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4048 ivci.subresourceRange.layerCount = 1;
4049 ivci.subresourceRange.baseMipLevel = 0;
4050 ivci.subresourceRange.levelCount = 1;
4051 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4052 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4053 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4054 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4055 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4056 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4057 ASSERT_VK_SUCCESS(err);
4058
4059 fb_info.pAttachments = &view;
4060 fb_info.height = 100;
4061 fb_info.width = 100;
4062 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004063 m_errorMonitor->SetDesiredFailureMsg(
4064 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4065 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004066 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4067
4068 m_errorMonitor->VerifyFound();
4069 if (err == VK_SUCCESS) {
4070 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4071 }
4072 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004073 // reset attachment to color attachment
4074 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004075
4076 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004077 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004078 fb_info.height = 100;
4079 fb_info.layers = 1;
4080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004081 m_errorMonitor->SetDesiredFailureMsg(
4082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004083 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4084 "Here are the respective dimensions for attachment");
4085
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004086 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4087
4088 m_errorMonitor->VerifyFound();
4089 if (err == VK_SUCCESS) {
4090 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4091 }
4092
4093 // Request fb that exceeds max height
4094 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004095 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004096 fb_info.layers = 1;
4097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004098 m_errorMonitor->SetDesiredFailureMsg(
4099 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004100 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4101 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004102 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4103
4104 m_errorMonitor->VerifyFound();
4105 if (err == VK_SUCCESS) {
4106 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4107 }
4108
4109 // Request fb that exceeds max layers
4110 fb_info.width = 100;
4111 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004112 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004114 m_errorMonitor->SetDesiredFailureMsg(
4115 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004116 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4117 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004118 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4119
4120 m_errorMonitor->VerifyFound();
4121 if (err == VK_SUCCESS) {
4122 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4123 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004124
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004125 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004126}
4127
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004128TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004129 TEST_DESCRIPTION(
4130 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4131 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004132
Tony Barbour1fa09702017-03-16 12:09:08 -06004133 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004134 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4136 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004137 m_errorMonitor->VerifyFound();
4138}
4139
4140TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004141 TEST_DESCRIPTION(
4142 "Run a simple draw calls to validate failure when Line Width dynamic "
4143 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004144
Tony Barbour1fa09702017-03-16 12:09:08 -06004145 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004146 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4148 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004149 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004150}
4151
4152TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004153 TEST_DESCRIPTION(
4154 "Run a simple draw calls to validate failure when Viewport dynamic "
4155 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004156
Tony Barbour1fa09702017-03-16 12:09:08 -06004157 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004158 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4160 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004161 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004162 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004163}
4164
4165TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004166 TEST_DESCRIPTION(
4167 "Run a simple draw calls to validate failure when Scissor dynamic "
4168 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004169
Tony Barbour1fa09702017-03-16 12:09:08 -06004170 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004171 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4173 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004174 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004175 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004176}
4177
Cortd713fe82016-07-27 09:51:27 -07004178TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004179 TEST_DESCRIPTION(
4180 "Run a simple draw calls to validate failure when Blend Constants "
4181 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004182
Tony Barbour1fa09702017-03-16 12:09:08 -06004183 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004184 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic blend constants state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004188 m_errorMonitor->VerifyFound();
4189}
4190
4191TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004197 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004198 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004199 return;
4200 }
4201 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4203 "Dynamic depth bounds state not set for this command buffer");
4204 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004205 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004206}
4207
4208TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004209 TEST_DESCRIPTION(
4210 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4211 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004212
Tony Barbour1fa09702017-03-16 12:09:08 -06004213 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004214 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4216 "Dynamic stencil read mask state not set for this command buffer");
4217 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004218 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004219}
4220
4221TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004222 TEST_DESCRIPTION(
4223 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4224 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004225
Tony Barbour1fa09702017-03-16 12:09:08 -06004226 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004227 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4229 "Dynamic stencil write mask state not set for this command buffer");
4230 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004231 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004232}
4233
4234TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004235 TEST_DESCRIPTION(
4236 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4237 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004238
Tony Barbour1fa09702017-03-16 12:09:08 -06004239 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004240 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "Dynamic stencil reference state not set for this command buffer");
4243 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004244 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004245}
4246
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004247TEST_F(VkLayerTest, IndexBufferNotBound) {
4248 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004249
Tony Barbour1fa09702017-03-16 12:09:08 -06004250 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4252 "Index buffer object not bound to this command buffer when Indexed ");
4253 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004254 m_errorMonitor->VerifyFound();
4255}
4256
Karl Schultz6addd812016-02-02 17:17:23 -07004257TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4259 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4260 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004261
Tony Barbour1fa09702017-03-16 12:09:08 -06004262 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004263 ASSERT_NO_FATAL_FAILURE(InitViewport());
4264 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4265
Karl Schultz6addd812016-02-02 17:17:23 -07004266 // We luck out b/c by default the framework creates CB w/ the
4267 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004268 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004269 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004270 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004272 // Bypass framework since it does the waits automatically
4273 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004274 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004275 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4276 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004277 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004278 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004279 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004280 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004281 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004282 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004283 submit_info.pSignalSemaphores = NULL;
4284
Chris Forbes40028e22016-06-13 09:59:34 +12004285 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004286 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004287 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004288
Karl Schultz6addd812016-02-02 17:17:23 -07004289 // Cause validation error by re-submitting cmd buffer that should only be
4290 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004291 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004292 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004293
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004294 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004295}
4296
Karl Schultz6addd812016-02-02 17:17:23 -07004297TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004298 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004299 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
Tony Barbour1fa09702017-03-16 12:09:08 -06004301 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303
Karl Schultz6addd812016-02-02 17:17:23 -07004304 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4305 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004306 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004307 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004308 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004309
4310 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004311 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4312 ds_pool_ci.pNext = NULL;
4313 ds_pool_ci.flags = 0;
4314 ds_pool_ci.maxSets = 1;
4315 ds_pool_ci.poolSizeCount = 1;
4316 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004317
4318 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004319 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004320 ASSERT_VK_SUCCESS(err);
4321
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004322 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4323 dsl_binding_samp.binding = 0;
4324 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4325 dsl_binding_samp.descriptorCount = 1;
4326 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4327 dsl_binding_samp.pImmutableSamplers = NULL;
4328
4329 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4330 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4331 ds_layout_ci.pNext = NULL;
4332 ds_layout_ci.bindingCount = 1;
4333 ds_layout_ci.pBindings = &dsl_binding_samp;
4334
4335 VkDescriptorSetLayout ds_layout_samp;
4336 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4337 ASSERT_VK_SUCCESS(err);
4338
4339 // Try to allocate 2 sets when pool only has 1 set
4340 VkDescriptorSet descriptor_sets[2];
4341 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4342 VkDescriptorSetAllocateInfo alloc_info = {};
4343 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4344 alloc_info.descriptorSetCount = 2;
4345 alloc_info.descriptorPool = ds_pool;
4346 alloc_info.pSetLayouts = set_layouts;
4347 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4348 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4349 m_errorMonitor->VerifyFound();
4350
4351 alloc_info.descriptorSetCount = 1;
4352 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004353 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004354 dsl_binding.binding = 0;
4355 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4356 dsl_binding.descriptorCount = 1;
4357 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4358 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004359
Karl Schultz6addd812016-02-02 17:17:23 -07004360 ds_layout_ci.bindingCount = 1;
4361 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004362
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004363 VkDescriptorSetLayout ds_layout_ub;
4364 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004365 ASSERT_VK_SUCCESS(err);
4366
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004367 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004368 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004369 alloc_info.pSetLayouts = &ds_layout_ub;
4370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4371 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004372
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004373 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004374
Karl Schultz2825ab92016-12-02 08:23:14 -07004375 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004376 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004377 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004378}
4379
Karl Schultz6addd812016-02-02 17:17:23 -07004380TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4381 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004382
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004384
Tony Barbour1fa09702017-03-16 12:09:08 -06004385 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004387
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004388 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004389 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4390 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004391
4392 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004393 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4394 ds_pool_ci.pNext = NULL;
4395 ds_pool_ci.maxSets = 1;
4396 ds_pool_ci.poolSizeCount = 1;
4397 ds_pool_ci.flags = 0;
4398 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4399 // app can only call vkResetDescriptorPool on this pool.;
4400 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004407 dsl_binding.binding = 0;
4408 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4409 dsl_binding.descriptorCount = 1;
4410 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4411 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004412
4413 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004414 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4415 ds_layout_ci.pNext = NULL;
4416 ds_layout_ci.bindingCount = 1;
4417 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004418
4419 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004420 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004421 ASSERT_VK_SUCCESS(err);
4422
4423 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004424 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004425 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004426 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004427 alloc_info.descriptorPool = ds_pool;
4428 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004429 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004430 ASSERT_VK_SUCCESS(err);
4431
4432 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004433 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004434
Chia-I Wuf7458c52015-10-26 21:10:41 +08004435 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4436 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004437}
4438
Karl Schultz6addd812016-02-02 17:17:23 -07004439TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004440 // Attempt to clear Descriptor Pool with bad object.
4441 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004442
Tony Barbour1fa09702017-03-16 12:09:08 -06004443 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004445 uint64_t fake_pool_handle = 0xbaad6001;
4446 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4447 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004448 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004449}
4450
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004451TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004452 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4453 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004454 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004455 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004456
4457 uint64_t fake_set_handle = 0xbaad6001;
4458 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004459 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004461
Tony Barbour1fa09702017-03-16 12:09:08 -06004462 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004463
4464 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4465 layout_bindings[0].binding = 0;
4466 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4467 layout_bindings[0].descriptorCount = 1;
4468 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4469 layout_bindings[0].pImmutableSamplers = NULL;
4470
4471 VkDescriptorSetLayout descriptor_set_layout;
4472 VkDescriptorSetLayoutCreateInfo dslci = {};
4473 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4474 dslci.pNext = NULL;
4475 dslci.bindingCount = 1;
4476 dslci.pBindings = layout_bindings;
4477 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004478 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004479
4480 VkPipelineLayout pipeline_layout;
4481 VkPipelineLayoutCreateInfo plci = {};
4482 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4483 plci.pNext = NULL;
4484 plci.setLayoutCount = 1;
4485 plci.pSetLayouts = &descriptor_set_layout;
4486 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004487 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004488
Tony Barbour552f6c02016-12-21 14:34:07 -07004489 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004490 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4491 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004492 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004493 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004494 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4495 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004496}
4497
Karl Schultz6addd812016-02-02 17:17:23 -07004498TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004499 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4500 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004501 uint64_t fake_layout_handle = 0xbaad6001;
4502 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004504 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004505 VkPipelineLayout pipeline_layout;
4506 VkPipelineLayoutCreateInfo plci = {};
4507 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4508 plci.pNext = NULL;
4509 plci.setLayoutCount = 1;
4510 plci.pSetLayouts = &bad_layout;
4511 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4512
4513 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004514}
4515
Mark Muellerd4914412016-06-13 17:52:06 -06004516TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004517 TEST_DESCRIPTION(
4518 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4519 "1) A uniform buffer update must have a valid buffer index."
4520 "2) When using an array of descriptors in a single WriteDescriptor,"
4521 " the descriptor types and stageflags must all be the same."
4522 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004523
Mike Weiblena6666382017-01-05 15:16:11 -07004524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004525
Tony Barbour1fa09702017-03-16 12:09:08 -06004526 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004527 VkDescriptorPoolSize ds_type_count[4] = {};
4528 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4529 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004530 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004531 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004532 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004533 ds_type_count[2].descriptorCount = 1;
4534 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4535 ds_type_count[3].descriptorCount = 1;
4536
4537 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4538 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4539 ds_pool_ci.maxSets = 1;
4540 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4541 ds_pool_ci.pPoolSizes = ds_type_count;
4542
4543 VkDescriptorPool ds_pool;
4544 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4545 ASSERT_VK_SUCCESS(err);
4546
Mark Muellerb9896722016-06-16 09:54:29 -06004547 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004548 layout_binding[0].binding = 0;
4549 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4550 layout_binding[0].descriptorCount = 1;
4551 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4552 layout_binding[0].pImmutableSamplers = NULL;
4553
4554 layout_binding[1].binding = 1;
4555 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4556 layout_binding[1].descriptorCount = 1;
4557 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4558 layout_binding[1].pImmutableSamplers = NULL;
4559
4560 VkSamplerCreateInfo sampler_ci = {};
4561 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4562 sampler_ci.pNext = NULL;
4563 sampler_ci.magFilter = VK_FILTER_NEAREST;
4564 sampler_ci.minFilter = VK_FILTER_NEAREST;
4565 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4566 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4567 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4568 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4569 sampler_ci.mipLodBias = 1.0;
4570 sampler_ci.anisotropyEnable = VK_FALSE;
4571 sampler_ci.maxAnisotropy = 1;
4572 sampler_ci.compareEnable = VK_FALSE;
4573 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4574 sampler_ci.minLod = 1.0;
4575 sampler_ci.maxLod = 1.0;
4576 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4577 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4578 VkSampler sampler;
4579
4580 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4581 ASSERT_VK_SUCCESS(err);
4582
4583 layout_binding[2].binding = 2;
4584 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4585 layout_binding[2].descriptorCount = 1;
4586 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4587 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4588
Mark Muellerd4914412016-06-13 17:52:06 -06004589 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4590 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4591 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4592 ds_layout_ci.pBindings = layout_binding;
4593 VkDescriptorSetLayout ds_layout;
4594 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4595 ASSERT_VK_SUCCESS(err);
4596
4597 VkDescriptorSetAllocateInfo alloc_info = {};
4598 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4599 alloc_info.descriptorSetCount = 1;
4600 alloc_info.descriptorPool = ds_pool;
4601 alloc_info.pSetLayouts = &ds_layout;
4602 VkDescriptorSet descriptorSet;
4603 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4604 ASSERT_VK_SUCCESS(err);
4605
4606 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4607 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4608 pipeline_layout_ci.pNext = NULL;
4609 pipeline_layout_ci.setLayoutCount = 1;
4610 pipeline_layout_ci.pSetLayouts = &ds_layout;
4611
4612 VkPipelineLayout pipeline_layout;
4613 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4614 ASSERT_VK_SUCCESS(err);
4615
Mark Mueller5c838ce2016-06-16 09:54:29 -06004616 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004617 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4618 descriptor_write.dstSet = descriptorSet;
4619 descriptor_write.dstBinding = 0;
4620 descriptor_write.descriptorCount = 1;
4621 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4622
Mark Mueller5c838ce2016-06-16 09:54:29 -06004623 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004624 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4625 m_errorMonitor->VerifyFound();
4626
4627 // Create a buffer to update the descriptor with
4628 uint32_t qfi = 0;
4629 VkBufferCreateInfo buffCI = {};
4630 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4631 buffCI.size = 1024;
4632 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4633 buffCI.queueFamilyIndexCount = 1;
4634 buffCI.pQueueFamilyIndices = &qfi;
4635
4636 VkBuffer dyub;
4637 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4638 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004639
Tony Barboure132c5f2016-12-12 11:50:20 -07004640 VkDeviceMemory mem;
4641 VkMemoryRequirements mem_reqs;
4642 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4643
4644 VkMemoryAllocateInfo mem_alloc_info = {};
4645 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4646 mem_alloc_info.allocationSize = mem_reqs.size;
4647 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4648 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4649 ASSERT_VK_SUCCESS(err);
4650
4651 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4652 ASSERT_VK_SUCCESS(err);
4653
4654 VkDescriptorBufferInfo buffInfo[2] = {};
4655 buffInfo[0].buffer = dyub;
4656 buffInfo[0].offset = 0;
4657 buffInfo[0].range = 1024;
4658 buffInfo[1].buffer = dyub;
4659 buffInfo[1].offset = 0;
4660 buffInfo[1].range = 1024;
4661 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004662 descriptor_write.descriptorCount = 2;
4663
Mark Mueller5c838ce2016-06-16 09:54:29 -06004664 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004666 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4667 m_errorMonitor->VerifyFound();
4668
Mark Mueller5c838ce2016-06-16 09:54:29 -06004669 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4670 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004671 descriptor_write.dstBinding = 1;
4672 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004673
Mark Mueller5c838ce2016-06-16 09:54:29 -06004674 // Make pImageInfo index non-null to avoid complaints of it missing
4675 VkDescriptorImageInfo imageInfo = {};
4676 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4677 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004679 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4680 m_errorMonitor->VerifyFound();
4681
Mark Muellerd4914412016-06-13 17:52:06 -06004682 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004683 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004684 vkDestroySampler(m_device->device(), sampler, NULL);
4685 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4686 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4687 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4688}
4689
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004690TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004691 TEST_DESCRIPTION(
4692 "Attempt to draw with a command buffer that is invalid "
4693 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004694 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004695
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004696 VkBuffer buffer;
4697 VkDeviceMemory mem;
4698 VkMemoryRequirements mem_reqs;
4699
4700 VkBufferCreateInfo buf_info = {};
4701 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004702 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004703 buf_info.size = 256;
4704 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4705 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4706 ASSERT_VK_SUCCESS(err);
4707
4708 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4709
4710 VkMemoryAllocateInfo alloc_info = {};
4711 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4712 alloc_info.allocationSize = 256;
4713 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004714 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004715 if (!pass) {
4716 vkDestroyBuffer(m_device->device(), buffer, NULL);
4717 return;
4718 }
4719 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4720 ASSERT_VK_SUCCESS(err);
4721
4722 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4723 ASSERT_VK_SUCCESS(err);
4724
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004725 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004726 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004727 m_commandBuffer->EndCommandBuffer();
4728
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004730 // Destroy buffer dependency prior to submit to cause ERROR
4731 vkDestroyBuffer(m_device->device(), buffer, NULL);
4732
4733 VkSubmitInfo submit_info = {};
4734 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4735 submit_info.commandBufferCount = 1;
4736 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4737 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4738
4739 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004740 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004741 vkFreeMemory(m_device->handle(), mem, NULL);
4742}
4743
Tobin Ehlisea413442016-09-28 10:23:59 -06004744TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4745 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4746
Tony Barbour1fa09702017-03-16 12:09:08 -06004747 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004748 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4749
4750 VkDescriptorPoolSize ds_type_count;
4751 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4752 ds_type_count.descriptorCount = 1;
4753
4754 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4755 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4756 ds_pool_ci.maxSets = 1;
4757 ds_pool_ci.poolSizeCount = 1;
4758 ds_pool_ci.pPoolSizes = &ds_type_count;
4759
4760 VkDescriptorPool ds_pool;
4761 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4762 ASSERT_VK_SUCCESS(err);
4763
4764 VkDescriptorSetLayoutBinding layout_binding;
4765 layout_binding.binding = 0;
4766 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4767 layout_binding.descriptorCount = 1;
4768 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4769 layout_binding.pImmutableSamplers = NULL;
4770
4771 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4772 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4773 ds_layout_ci.bindingCount = 1;
4774 ds_layout_ci.pBindings = &layout_binding;
4775 VkDescriptorSetLayout ds_layout;
4776 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4777 ASSERT_VK_SUCCESS(err);
4778
4779 VkDescriptorSetAllocateInfo alloc_info = {};
4780 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4781 alloc_info.descriptorSetCount = 1;
4782 alloc_info.descriptorPool = ds_pool;
4783 alloc_info.pSetLayouts = &ds_layout;
4784 VkDescriptorSet descriptor_set;
4785 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4786 ASSERT_VK_SUCCESS(err);
4787
4788 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4789 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4790 pipeline_layout_ci.pNext = NULL;
4791 pipeline_layout_ci.setLayoutCount = 1;
4792 pipeline_layout_ci.pSetLayouts = &ds_layout;
4793
4794 VkPipelineLayout pipeline_layout;
4795 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4796 ASSERT_VK_SUCCESS(err);
4797
4798 VkBuffer buffer;
4799 uint32_t queue_family_index = 0;
4800 VkBufferCreateInfo buffer_create_info = {};
4801 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4802 buffer_create_info.size = 1024;
4803 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4804 buffer_create_info.queueFamilyIndexCount = 1;
4805 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4806
4807 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4808 ASSERT_VK_SUCCESS(err);
4809
4810 VkMemoryRequirements memory_reqs;
4811 VkDeviceMemory buffer_memory;
4812
4813 VkMemoryAllocateInfo memory_info = {};
4814 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4815 memory_info.allocationSize = 0;
4816 memory_info.memoryTypeIndex = 0;
4817
4818 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4819 memory_info.allocationSize = memory_reqs.size;
4820 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4821 ASSERT_TRUE(pass);
4822
4823 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4824 ASSERT_VK_SUCCESS(err);
4825 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4826 ASSERT_VK_SUCCESS(err);
4827
4828 VkBufferView view;
4829 VkBufferViewCreateInfo bvci = {};
4830 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4831 bvci.buffer = buffer;
4832 bvci.format = VK_FORMAT_R8_UNORM;
4833 bvci.range = VK_WHOLE_SIZE;
4834
4835 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4836 ASSERT_VK_SUCCESS(err);
4837
4838 VkWriteDescriptorSet descriptor_write = {};
4839 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4840 descriptor_write.dstSet = descriptor_set;
4841 descriptor_write.dstBinding = 0;
4842 descriptor_write.descriptorCount = 1;
4843 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4844 descriptor_write.pTexelBufferView = &view;
4845
4846 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4847
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004848 char const *vsSource =
4849 "#version 450\n"
4850 "\n"
4851 "out gl_PerVertex { \n"
4852 " vec4 gl_Position;\n"
4853 "};\n"
4854 "void main(){\n"
4855 " gl_Position = vec4(1);\n"
4856 "}\n";
4857 char const *fsSource =
4858 "#version 450\n"
4859 "\n"
4860 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4861 "layout(location=0) out vec4 x;\n"
4862 "void main(){\n"
4863 " x = imageLoad(s, 0);\n"
4864 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004865 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4866 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4867 VkPipelineObj pipe(m_device);
4868 pipe.AddShader(&vs);
4869 pipe.AddShader(&fs);
4870 pipe.AddColorAttachment();
4871 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4872
Tobin Ehlisea413442016-09-28 10:23:59 -06004873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4874
Tony Barbour552f6c02016-12-21 14:34:07 -07004875 m_commandBuffer->BeginCommandBuffer();
4876 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4877
Tobin Ehlisea413442016-09-28 10:23:59 -06004878 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4879 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4880 VkRect2D scissor = {{0, 0}, {16, 16}};
4881 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4882 // Bind pipeline to cmd buffer
4883 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4884 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4885 &descriptor_set, 0, nullptr);
4886 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004887 m_commandBuffer->EndRenderPass();
4888 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004889
4890 // Delete BufferView in order to invalidate cmd buffer
4891 vkDestroyBufferView(m_device->device(), view, NULL);
4892 // Now attempt submit of cmd buffer
4893 VkSubmitInfo submit_info = {};
4894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4895 submit_info.commandBufferCount = 1;
4896 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4897 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4898 m_errorMonitor->VerifyFound();
4899
4900 // Clean-up
4901 vkDestroyBuffer(m_device->device(), buffer, NULL);
4902 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4903 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4904 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4905 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4906}
4907
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004908TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004909 TEST_DESCRIPTION(
4910 "Attempt to draw with a command buffer that is invalid "
4911 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004912 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004913
4914 VkImage image;
4915 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4916 VkImageCreateInfo image_create_info = {};
4917 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4918 image_create_info.pNext = NULL;
4919 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4920 image_create_info.format = tex_format;
4921 image_create_info.extent.width = 32;
4922 image_create_info.extent.height = 32;
4923 image_create_info.extent.depth = 1;
4924 image_create_info.mipLevels = 1;
4925 image_create_info.arrayLayers = 1;
4926 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4927 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004928 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004929 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004930 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004932 // Have to bind memory to image before recording cmd in cmd buffer using it
4933 VkMemoryRequirements mem_reqs;
4934 VkDeviceMemory image_mem;
4935 bool pass;
4936 VkMemoryAllocateInfo mem_alloc = {};
4937 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4938 mem_alloc.pNext = NULL;
4939 mem_alloc.memoryTypeIndex = 0;
4940 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4941 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004942 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004943 ASSERT_TRUE(pass);
4944 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4945 ASSERT_VK_SUCCESS(err);
4946 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4947 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004949 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004950 VkClearColorValue ccv;
4951 ccv.float32[0] = 1.0f;
4952 ccv.float32[1] = 1.0f;
4953 ccv.float32[2] = 1.0f;
4954 ccv.float32[3] = 1.0f;
4955 VkImageSubresourceRange isr = {};
4956 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004957 isr.baseArrayLayer = 0;
4958 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004959 isr.layerCount = 1;
4960 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004961 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004962 m_commandBuffer->EndCommandBuffer();
4963
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004965 // Destroy image dependency prior to submit to cause ERROR
4966 vkDestroyImage(m_device->device(), image, NULL);
4967
4968 VkSubmitInfo submit_info = {};
4969 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4970 submit_info.commandBufferCount = 1;
4971 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4972 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4973
4974 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004975 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004976}
4977
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004978TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004979 TEST_DESCRIPTION(
4980 "Attempt to draw with a command buffer that is invalid "
4981 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004982 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004983 VkFormatProperties format_properties;
4984 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004985 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4986 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004987 return;
4988 }
4989
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004990 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4991
4992 VkImageCreateInfo image_ci = {};
4993 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4994 image_ci.pNext = NULL;
4995 image_ci.imageType = VK_IMAGE_TYPE_2D;
4996 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4997 image_ci.extent.width = 32;
4998 image_ci.extent.height = 32;
4999 image_ci.extent.depth = 1;
5000 image_ci.mipLevels = 1;
5001 image_ci.arrayLayers = 1;
5002 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5003 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005004 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005005 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5006 image_ci.flags = 0;
5007 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005008 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005009
5010 VkMemoryRequirements memory_reqs;
5011 VkDeviceMemory image_memory;
5012 bool pass;
5013 VkMemoryAllocateInfo memory_info = {};
5014 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5015 memory_info.pNext = NULL;
5016 memory_info.allocationSize = 0;
5017 memory_info.memoryTypeIndex = 0;
5018 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5019 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005020 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005021 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005022 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005023 ASSERT_VK_SUCCESS(err);
5024 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5025 ASSERT_VK_SUCCESS(err);
5026
5027 VkImageViewCreateInfo ivci = {
5028 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5029 nullptr,
5030 0,
5031 image,
5032 VK_IMAGE_VIEW_TYPE_2D,
5033 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005034 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005035 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5036 };
5037 VkImageView view;
5038 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5039 ASSERT_VK_SUCCESS(err);
5040
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005041 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 VkFramebuffer fb;
5043 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5044 ASSERT_VK_SUCCESS(err);
5045
5046 // Just use default renderpass with our framebuffer
5047 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005048 m_renderPassBeginInfo.renderArea.extent.width = 32;
5049 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005050 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005051 m_commandBuffer->BeginCommandBuffer();
5052 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5053 m_commandBuffer->EndRenderPass();
5054 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005055 // Destroy image attached to framebuffer to invalidate cmd buffer
5056 vkDestroyImage(m_device->device(), image, NULL);
5057 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005059 QueueCommandBuffer(false);
5060 m_errorMonitor->VerifyFound();
5061
5062 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5063 vkDestroyImageView(m_device->device(), view, nullptr);
5064 vkFreeMemory(m_device->device(), image_memory, nullptr);
5065}
5066
Tobin Ehlisb329f992016-10-12 13:20:29 -06005067TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5068 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005069 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005070 VkFormatProperties format_properties;
5071 VkResult err = VK_SUCCESS;
5072 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5073
Tobin Ehlisb329f992016-10-12 13:20:29 -06005074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5075
5076 VkImageObj image(m_device);
5077 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5078 ASSERT_TRUE(image.initialized());
5079 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5080
5081 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5082 VkFramebuffer fb;
5083 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5084 ASSERT_VK_SUCCESS(err);
5085
5086 // Just use default renderpass with our framebuffer
5087 m_renderPassBeginInfo.framebuffer = fb;
5088 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005089 m_commandBuffer->BeginCommandBuffer();
5090 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5091 m_commandBuffer->EndRenderPass();
5092 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005093 // Submit cmd buffer to put it in-flight
5094 VkSubmitInfo submit_info = {};
5095 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5096 submit_info.commandBufferCount = 1;
5097 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5098 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5099 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005101 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5102 m_errorMonitor->VerifyFound();
5103 // Wait for queue to complete so we can safely destroy everything
5104 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005105 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5106 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005107 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5108}
5109
Tobin Ehlis88becd72016-09-21 14:33:41 -06005110TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5111 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005112 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005113 VkFormatProperties format_properties;
5114 VkResult err = VK_SUCCESS;
5115 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005116
Tobin Ehlis88becd72016-09-21 14:33:41 -06005117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5118
5119 VkImageCreateInfo image_ci = {};
5120 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5121 image_ci.pNext = NULL;
5122 image_ci.imageType = VK_IMAGE_TYPE_2D;
5123 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5124 image_ci.extent.width = 256;
5125 image_ci.extent.height = 256;
5126 image_ci.extent.depth = 1;
5127 image_ci.mipLevels = 1;
5128 image_ci.arrayLayers = 1;
5129 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5130 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005131 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005132 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5133 image_ci.flags = 0;
5134 VkImage image;
5135 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5136
5137 VkMemoryRequirements memory_reqs;
5138 VkDeviceMemory image_memory;
5139 bool pass;
5140 VkMemoryAllocateInfo memory_info = {};
5141 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5142 memory_info.pNext = NULL;
5143 memory_info.allocationSize = 0;
5144 memory_info.memoryTypeIndex = 0;
5145 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5146 memory_info.allocationSize = memory_reqs.size;
5147 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5148 ASSERT_TRUE(pass);
5149 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5150 ASSERT_VK_SUCCESS(err);
5151 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5152 ASSERT_VK_SUCCESS(err);
5153
5154 VkImageViewCreateInfo ivci = {
5155 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5156 nullptr,
5157 0,
5158 image,
5159 VK_IMAGE_VIEW_TYPE_2D,
5160 VK_FORMAT_B8G8R8A8_UNORM,
5161 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5162 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5163 };
5164 VkImageView view;
5165 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5166 ASSERT_VK_SUCCESS(err);
5167
5168 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5169 VkFramebuffer fb;
5170 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5171 ASSERT_VK_SUCCESS(err);
5172
5173 // Just use default renderpass with our framebuffer
5174 m_renderPassBeginInfo.framebuffer = fb;
5175 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005176 m_commandBuffer->BeginCommandBuffer();
5177 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5178 m_commandBuffer->EndRenderPass();
5179 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005180 // Submit cmd buffer to put it (and attached imageView) in-flight
5181 VkSubmitInfo submit_info = {};
5182 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5183 submit_info.commandBufferCount = 1;
5184 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5185 // Submit cmd buffer to put framebuffer and children in-flight
5186 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5187 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005189 vkDestroyImage(m_device->device(), image, NULL);
5190 m_errorMonitor->VerifyFound();
5191 // Wait for queue to complete so we can safely destroy image and other objects
5192 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005193 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5194 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005195 vkDestroyImage(m_device->device(), image, NULL);
5196 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5197 vkDestroyImageView(m_device->device(), view, nullptr);
5198 vkFreeMemory(m_device->device(), image_memory, nullptr);
5199}
5200
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005201TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5202 TEST_DESCRIPTION("Delete in-use renderPass.");
5203
Tony Barbour1fa09702017-03-16 12:09:08 -06005204 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005205 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5206
5207 // Create simple renderpass
5208 VkAttachmentReference attach = {};
5209 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5210 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005211 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005212 subpass.pColorAttachments = &attach;
5213 VkRenderPassCreateInfo rpci = {};
5214 rpci.subpassCount = 1;
5215 rpci.pSubpasses = &subpass;
5216 rpci.attachmentCount = 1;
5217 VkAttachmentDescription attach_desc = {};
5218 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5219 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5220 rpci.pAttachments = &attach_desc;
5221 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5222 VkRenderPass rp;
5223 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5224 ASSERT_VK_SUCCESS(err);
5225
5226 // Create a pipeline that uses the given renderpass
5227 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5228 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5229
5230 VkPipelineLayout pipeline_layout;
5231 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5232 ASSERT_VK_SUCCESS(err);
5233
5234 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5235 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5236 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005237 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005238 vp_state_ci.pViewports = &vp;
5239 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005240 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005241 vp_state_ci.pScissors = &scissors;
5242
5243 VkPipelineShaderStageCreateInfo shaderStages[2];
5244 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5245
5246 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005247 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005248 // but add it to be able to run on more devices
5249 shaderStages[0] = vs.GetStageCreateInfo();
5250 shaderStages[1] = fs.GetStageCreateInfo();
5251
5252 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5253 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5254
5255 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5256 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5257 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5258
5259 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5260 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5261 rs_ci.rasterizerDiscardEnable = true;
5262 rs_ci.lineWidth = 1.0f;
5263
5264 VkPipelineColorBlendAttachmentState att = {};
5265 att.blendEnable = VK_FALSE;
5266 att.colorWriteMask = 0xf;
5267
5268 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5269 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5270 cb_ci.attachmentCount = 1;
5271 cb_ci.pAttachments = &att;
5272
5273 VkGraphicsPipelineCreateInfo gp_ci = {};
5274 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5275 gp_ci.stageCount = 2;
5276 gp_ci.pStages = shaderStages;
5277 gp_ci.pVertexInputState = &vi_ci;
5278 gp_ci.pInputAssemblyState = &ia_ci;
5279 gp_ci.pViewportState = &vp_state_ci;
5280 gp_ci.pRasterizationState = &rs_ci;
5281 gp_ci.pColorBlendState = &cb_ci;
5282 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5283 gp_ci.layout = pipeline_layout;
5284 gp_ci.renderPass = rp;
5285
5286 VkPipelineCacheCreateInfo pc_ci = {};
5287 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5288
Dave Houlton756e6742017-03-23 14:33:22 -06005289 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005290 VkPipeline pipeline;
5291 VkPipelineCache pipe_cache;
5292 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5293 ASSERT_VK_SUCCESS(err);
5294
5295 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5296 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005297
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005298 // Bind pipeline to cmd buffer, will also bind renderpass
5299 m_commandBuffer->BeginCommandBuffer();
5300 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5301 m_commandBuffer->EndCommandBuffer();
5302
5303 VkSubmitInfo submit_info = {};
5304 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5305 submit_info.commandBufferCount = 1;
5306 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5307 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005308 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005309
5310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5311 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5312 m_errorMonitor->VerifyFound();
5313
5314 // Wait for queue to complete so we can safely destroy everything
5315 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005316 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5317 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005318 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5319 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5320 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5321 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5322}
5323
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005324TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005326 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005327
5328 VkImage image;
5329 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5330 VkImageCreateInfo image_create_info = {};
5331 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5332 image_create_info.pNext = NULL;
5333 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5334 image_create_info.format = tex_format;
5335 image_create_info.extent.width = 32;
5336 image_create_info.extent.height = 32;
5337 image_create_info.extent.depth = 1;
5338 image_create_info.mipLevels = 1;
5339 image_create_info.arrayLayers = 1;
5340 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5341 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005342 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005343 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005344 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005345 ASSERT_VK_SUCCESS(err);
5346 // Have to bind memory to image before recording cmd in cmd buffer using it
5347 VkMemoryRequirements mem_reqs;
5348 VkDeviceMemory image_mem;
5349 bool pass;
5350 VkMemoryAllocateInfo mem_alloc = {};
5351 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5352 mem_alloc.pNext = NULL;
5353 mem_alloc.memoryTypeIndex = 0;
5354 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5355 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005356 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005357 ASSERT_TRUE(pass);
5358 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5359 ASSERT_VK_SUCCESS(err);
5360
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005361 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005363 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005364
5365 m_commandBuffer->BeginCommandBuffer();
5366 VkClearColorValue ccv;
5367 ccv.float32[0] = 1.0f;
5368 ccv.float32[1] = 1.0f;
5369 ccv.float32[2] = 1.0f;
5370 ccv.float32[3] = 1.0f;
5371 VkImageSubresourceRange isr = {};
5372 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5373 isr.baseArrayLayer = 0;
5374 isr.baseMipLevel = 0;
5375 isr.layerCount = 1;
5376 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005377 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005378 m_commandBuffer->EndCommandBuffer();
5379
5380 m_errorMonitor->VerifyFound();
5381 vkDestroyImage(m_device->device(), image, NULL);
5382 vkFreeMemory(m_device->device(), image_mem, nullptr);
5383}
5384
5385TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005386 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005387 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005388
5389 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005390 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005391 VK_IMAGE_TILING_OPTIMAL, 0);
5392 ASSERT_TRUE(image.initialized());
5393
5394 VkBuffer buffer;
5395 VkDeviceMemory mem;
5396 VkMemoryRequirements mem_reqs;
5397
5398 VkBufferCreateInfo buf_info = {};
5399 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005400 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005401 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005402 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5403 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5404 ASSERT_VK_SUCCESS(err);
5405
5406 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5407
5408 VkMemoryAllocateInfo alloc_info = {};
5409 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005410 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005411 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005412 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005413 if (!pass) {
5414 vkDestroyBuffer(m_device->device(), buffer, NULL);
5415 return;
5416 }
5417 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5418 ASSERT_VK_SUCCESS(err);
5419
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005420 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005422 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005423 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005424 region.bufferRowLength = 16;
5425 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005426 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5427
5428 region.imageSubresource.layerCount = 1;
5429 region.imageExtent.height = 4;
5430 region.imageExtent.width = 4;
5431 region.imageExtent.depth = 1;
5432 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005433 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5434 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005435 m_commandBuffer->EndCommandBuffer();
5436
5437 m_errorMonitor->VerifyFound();
5438
5439 vkDestroyBuffer(m_device->device(), buffer, NULL);
5440 vkFreeMemory(m_device->handle(), mem, NULL);
5441}
5442
Tobin Ehlis85940f52016-07-07 16:57:21 -06005443TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005444 TEST_DESCRIPTION(
5445 "Attempt to draw with a command buffer that is invalid "
5446 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005447 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005448
5449 VkEvent event;
5450 VkEventCreateInfo evci = {};
5451 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5452 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5453 ASSERT_VK_SUCCESS(result);
5454
5455 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005456 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005457 m_commandBuffer->EndCommandBuffer();
5458
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005460 // Destroy event dependency prior to submit to cause ERROR
5461 vkDestroyEvent(m_device->device(), event, NULL);
5462
5463 VkSubmitInfo submit_info = {};
5464 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5465 submit_info.commandBufferCount = 1;
5466 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5467 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5468
5469 m_errorMonitor->VerifyFound();
5470}
5471
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005472TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005473 TEST_DESCRIPTION(
5474 "Attempt to draw with a command buffer that is invalid "
5475 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005476 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005477
5478 VkQueryPool query_pool;
5479 VkQueryPoolCreateInfo qpci{};
5480 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5481 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5482 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005483 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005484 ASSERT_VK_SUCCESS(result);
5485
5486 m_commandBuffer->BeginCommandBuffer();
5487 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5488 m_commandBuffer->EndCommandBuffer();
5489
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005491 // Destroy query pool dependency prior to submit to cause ERROR
5492 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5493
5494 VkSubmitInfo submit_info = {};
5495 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5496 submit_info.commandBufferCount = 1;
5497 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5498 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5499
5500 m_errorMonitor->VerifyFound();
5501}
5502
Tobin Ehlis24130d92016-07-08 15:50:53 -06005503TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005504 TEST_DESCRIPTION(
5505 "Attempt to draw with a command buffer that is invalid "
5506 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005507 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5509
5510 VkResult err;
5511
5512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5514
5515 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005516 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005517 ASSERT_VK_SUCCESS(err);
5518
5519 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5520 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5521 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005522 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005523 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005524 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005525 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005526 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005527
5528 VkPipelineShaderStageCreateInfo shaderStages[2];
5529 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5530
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005531 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005532 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005533 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005534 shaderStages[0] = vs.GetStageCreateInfo();
5535 shaderStages[1] = fs.GetStageCreateInfo();
5536
5537 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5538 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5539
5540 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5541 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5542 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5543
5544 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5545 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005546 rs_ci.rasterizerDiscardEnable = true;
5547 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005548
5549 VkPipelineColorBlendAttachmentState att = {};
5550 att.blendEnable = VK_FALSE;
5551 att.colorWriteMask = 0xf;
5552
5553 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5554 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5555 cb_ci.attachmentCount = 1;
5556 cb_ci.pAttachments = &att;
5557
5558 VkGraphicsPipelineCreateInfo gp_ci = {};
5559 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5560 gp_ci.stageCount = 2;
5561 gp_ci.pStages = shaderStages;
5562 gp_ci.pVertexInputState = &vi_ci;
5563 gp_ci.pInputAssemblyState = &ia_ci;
5564 gp_ci.pViewportState = &vp_state_ci;
5565 gp_ci.pRasterizationState = &rs_ci;
5566 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5568 gp_ci.layout = pipeline_layout;
5569 gp_ci.renderPass = renderPass();
5570
5571 VkPipelineCacheCreateInfo pc_ci = {};
5572 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5573
5574 VkPipeline pipeline;
5575 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005576 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005577 ASSERT_VK_SUCCESS(err);
5578
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005579 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005580 ASSERT_VK_SUCCESS(err);
5581
5582 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005583 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005584 m_commandBuffer->EndCommandBuffer();
5585 // Now destroy pipeline in order to cause error when submitting
5586 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5587
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005589
5590 VkSubmitInfo submit_info = {};
5591 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5592 submit_info.commandBufferCount = 1;
5593 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5594 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5595
5596 m_errorMonitor->VerifyFound();
5597 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5598 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5599}
5600
Tobin Ehlis31289162016-08-17 14:57:58 -06005601TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005602 TEST_DESCRIPTION(
5603 "Attempt to draw with a command buffer that is invalid "
5604 "due to a bound descriptor set with a buffer dependency "
5605 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005606 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005607 ASSERT_NO_FATAL_FAILURE(InitViewport());
5608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5609
5610 VkDescriptorPoolSize ds_type_count = {};
5611 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5612 ds_type_count.descriptorCount = 1;
5613
5614 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5615 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5616 ds_pool_ci.pNext = NULL;
5617 ds_pool_ci.maxSets = 1;
5618 ds_pool_ci.poolSizeCount = 1;
5619 ds_pool_ci.pPoolSizes = &ds_type_count;
5620
5621 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005622 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005623 ASSERT_VK_SUCCESS(err);
5624
5625 VkDescriptorSetLayoutBinding dsl_binding = {};
5626 dsl_binding.binding = 0;
5627 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5628 dsl_binding.descriptorCount = 1;
5629 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5630 dsl_binding.pImmutableSamplers = NULL;
5631
5632 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5633 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5634 ds_layout_ci.pNext = NULL;
5635 ds_layout_ci.bindingCount = 1;
5636 ds_layout_ci.pBindings = &dsl_binding;
5637 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005638 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005639 ASSERT_VK_SUCCESS(err);
5640
5641 VkDescriptorSet descriptorSet;
5642 VkDescriptorSetAllocateInfo alloc_info = {};
5643 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5644 alloc_info.descriptorSetCount = 1;
5645 alloc_info.descriptorPool = ds_pool;
5646 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005647 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005648 ASSERT_VK_SUCCESS(err);
5649
5650 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5651 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5652 pipeline_layout_ci.pNext = NULL;
5653 pipeline_layout_ci.setLayoutCount = 1;
5654 pipeline_layout_ci.pSetLayouts = &ds_layout;
5655
5656 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005657 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005658 ASSERT_VK_SUCCESS(err);
5659
5660 // Create a buffer to update the descriptor with
5661 uint32_t qfi = 0;
5662 VkBufferCreateInfo buffCI = {};
5663 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5664 buffCI.size = 1024;
5665 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5666 buffCI.queueFamilyIndexCount = 1;
5667 buffCI.pQueueFamilyIndices = &qfi;
5668
5669 VkBuffer buffer;
5670 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5671 ASSERT_VK_SUCCESS(err);
5672 // Allocate memory and bind to buffer so we can make it to the appropriate
5673 // error
5674 VkMemoryAllocateInfo mem_alloc = {};
5675 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5676 mem_alloc.pNext = NULL;
5677 mem_alloc.allocationSize = 1024;
5678 mem_alloc.memoryTypeIndex = 0;
5679
5680 VkMemoryRequirements memReqs;
5681 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005682 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005683 if (!pass) {
5684 vkDestroyBuffer(m_device->device(), buffer, NULL);
5685 return;
5686 }
5687
5688 VkDeviceMemory mem;
5689 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5690 ASSERT_VK_SUCCESS(err);
5691 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5692 ASSERT_VK_SUCCESS(err);
5693 // Correctly update descriptor to avoid "NOT_UPDATED" error
5694 VkDescriptorBufferInfo buffInfo = {};
5695 buffInfo.buffer = buffer;
5696 buffInfo.offset = 0;
5697 buffInfo.range = 1024;
5698
5699 VkWriteDescriptorSet descriptor_write;
5700 memset(&descriptor_write, 0, sizeof(descriptor_write));
5701 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5702 descriptor_write.dstSet = descriptorSet;
5703 descriptor_write.dstBinding = 0;
5704 descriptor_write.descriptorCount = 1;
5705 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5706 descriptor_write.pBufferInfo = &buffInfo;
5707
5708 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5709
5710 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005711 char const *vsSource =
5712 "#version 450\n"
5713 "\n"
5714 "out gl_PerVertex { \n"
5715 " vec4 gl_Position;\n"
5716 "};\n"
5717 "void main(){\n"
5718 " gl_Position = vec4(1);\n"
5719 "}\n";
5720 char const *fsSource =
5721 "#version 450\n"
5722 "\n"
5723 "layout(location=0) out vec4 x;\n"
5724 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5725 "void main(){\n"
5726 " x = vec4(bar.y);\n"
5727 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005728 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5729 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5730 VkPipelineObj pipe(m_device);
5731 pipe.AddShader(&vs);
5732 pipe.AddShader(&fs);
5733 pipe.AddColorAttachment();
5734 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5735
Tony Barbour552f6c02016-12-21 14:34:07 -07005736 m_commandBuffer->BeginCommandBuffer();
5737 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005738 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5739 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5740 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005741
5742 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5743 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5744
Tobin Ehlis31289162016-08-17 14:57:58 -06005745 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005746 m_commandBuffer->EndRenderPass();
5747 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005749 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5750 vkDestroyBuffer(m_device->device(), buffer, NULL);
5751 // Attempt to submit cmd buffer
5752 VkSubmitInfo submit_info = {};
5753 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5754 submit_info.commandBufferCount = 1;
5755 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5756 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5757 m_errorMonitor->VerifyFound();
5758 // Cleanup
5759 vkFreeMemory(m_device->device(), mem, NULL);
5760
5761 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5762 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5763 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5764}
5765
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005766TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005767 TEST_DESCRIPTION(
5768 "Attempt to draw with a command buffer that is invalid "
5769 "due to a bound descriptor sets with a combined image "
5770 "sampler having their image, sampler, and descriptor set "
5771 "each respectively destroyed and then attempting to "
5772 "submit associated cmd buffers. Attempt to destroy a "
5773 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005774 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005775 ASSERT_NO_FATAL_FAILURE(InitViewport());
5776 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5777
5778 VkDescriptorPoolSize ds_type_count = {};
5779 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5780 ds_type_count.descriptorCount = 1;
5781
5782 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5783 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5784 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005785 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005786 ds_pool_ci.maxSets = 1;
5787 ds_pool_ci.poolSizeCount = 1;
5788 ds_pool_ci.pPoolSizes = &ds_type_count;
5789
5790 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005791 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005792 ASSERT_VK_SUCCESS(err);
5793
5794 VkDescriptorSetLayoutBinding dsl_binding = {};
5795 dsl_binding.binding = 0;
5796 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5797 dsl_binding.descriptorCount = 1;
5798 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5799 dsl_binding.pImmutableSamplers = NULL;
5800
5801 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5802 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5803 ds_layout_ci.pNext = NULL;
5804 ds_layout_ci.bindingCount = 1;
5805 ds_layout_ci.pBindings = &dsl_binding;
5806 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005807 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005808 ASSERT_VK_SUCCESS(err);
5809
5810 VkDescriptorSet descriptorSet;
5811 VkDescriptorSetAllocateInfo alloc_info = {};
5812 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5813 alloc_info.descriptorSetCount = 1;
5814 alloc_info.descriptorPool = ds_pool;
5815 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005816 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005817 ASSERT_VK_SUCCESS(err);
5818
5819 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5820 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5821 pipeline_layout_ci.pNext = NULL;
5822 pipeline_layout_ci.setLayoutCount = 1;
5823 pipeline_layout_ci.pSetLayouts = &ds_layout;
5824
5825 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005826 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005827 ASSERT_VK_SUCCESS(err);
5828
5829 // Create images to update the descriptor with
5830 VkImage image;
5831 VkImage image2;
5832 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5833 const int32_t tex_width = 32;
5834 const int32_t tex_height = 32;
5835 VkImageCreateInfo image_create_info = {};
5836 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5837 image_create_info.pNext = NULL;
5838 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5839 image_create_info.format = tex_format;
5840 image_create_info.extent.width = tex_width;
5841 image_create_info.extent.height = tex_height;
5842 image_create_info.extent.depth = 1;
5843 image_create_info.mipLevels = 1;
5844 image_create_info.arrayLayers = 1;
5845 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5846 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5847 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5848 image_create_info.flags = 0;
5849 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5850 ASSERT_VK_SUCCESS(err);
5851 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5852 ASSERT_VK_SUCCESS(err);
5853
5854 VkMemoryRequirements memory_reqs;
5855 VkDeviceMemory image_memory;
5856 bool pass;
5857 VkMemoryAllocateInfo memory_info = {};
5858 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5859 memory_info.pNext = NULL;
5860 memory_info.allocationSize = 0;
5861 memory_info.memoryTypeIndex = 0;
5862 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5863 // Allocate enough memory for both images
5864 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005865 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005866 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005867 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005868 ASSERT_VK_SUCCESS(err);
5869 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5870 ASSERT_VK_SUCCESS(err);
5871 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005872 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005873 ASSERT_VK_SUCCESS(err);
5874
5875 VkImageViewCreateInfo image_view_create_info = {};
5876 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5877 image_view_create_info.image = image;
5878 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5879 image_view_create_info.format = tex_format;
5880 image_view_create_info.subresourceRange.layerCount = 1;
5881 image_view_create_info.subresourceRange.baseMipLevel = 0;
5882 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005883 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005884
5885 VkImageView view;
5886 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005887 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005888 ASSERT_VK_SUCCESS(err);
5889 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005890 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005891 ASSERT_VK_SUCCESS(err);
5892 // Create Samplers
5893 VkSamplerCreateInfo sampler_ci = {};
5894 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5895 sampler_ci.pNext = NULL;
5896 sampler_ci.magFilter = VK_FILTER_NEAREST;
5897 sampler_ci.minFilter = VK_FILTER_NEAREST;
5898 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5899 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5900 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5901 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5902 sampler_ci.mipLodBias = 1.0;
5903 sampler_ci.anisotropyEnable = VK_FALSE;
5904 sampler_ci.maxAnisotropy = 1;
5905 sampler_ci.compareEnable = VK_FALSE;
5906 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5907 sampler_ci.minLod = 1.0;
5908 sampler_ci.maxLod = 1.0;
5909 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5910 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5911 VkSampler sampler;
5912 VkSampler sampler2;
5913 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5914 ASSERT_VK_SUCCESS(err);
5915 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5916 ASSERT_VK_SUCCESS(err);
5917 // Update descriptor with image and sampler
5918 VkDescriptorImageInfo img_info = {};
5919 img_info.sampler = sampler;
5920 img_info.imageView = view;
5921 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5922
5923 VkWriteDescriptorSet descriptor_write;
5924 memset(&descriptor_write, 0, sizeof(descriptor_write));
5925 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5926 descriptor_write.dstSet = descriptorSet;
5927 descriptor_write.dstBinding = 0;
5928 descriptor_write.descriptorCount = 1;
5929 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5930 descriptor_write.pImageInfo = &img_info;
5931
5932 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5933
5934 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005935 char const *vsSource =
5936 "#version 450\n"
5937 "\n"
5938 "out gl_PerVertex { \n"
5939 " vec4 gl_Position;\n"
5940 "};\n"
5941 "void main(){\n"
5942 " gl_Position = vec4(1);\n"
5943 "}\n";
5944 char const *fsSource =
5945 "#version 450\n"
5946 "\n"
5947 "layout(set=0, binding=0) uniform sampler2D s;\n"
5948 "layout(location=0) out vec4 x;\n"
5949 "void main(){\n"
5950 " x = texture(s, vec2(1));\n"
5951 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005952 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5953 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5954 VkPipelineObj pipe(m_device);
5955 pipe.AddShader(&vs);
5956 pipe.AddShader(&fs);
5957 pipe.AddColorAttachment();
5958 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5959
5960 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005962 m_commandBuffer->BeginCommandBuffer();
5963 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005964 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5965 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5966 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005967 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5968 VkRect2D scissor = {{0, 0}, {16, 16}};
5969 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5970 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005971 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005972 m_commandBuffer->EndRenderPass();
5973 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005974 // Destroy sampler invalidates the cmd buffer, causing error on submit
5975 vkDestroySampler(m_device->device(), sampler, NULL);
5976 // Attempt to submit cmd buffer
5977 VkSubmitInfo submit_info = {};
5978 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5979 submit_info.commandBufferCount = 1;
5980 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5981 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5982 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005983
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005984 // Now re-update descriptor with valid sampler and delete image
5985 img_info.sampler = sampler2;
5986 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005987
5988 VkCommandBufferBeginInfo info = {};
5989 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5990 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5991
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005993 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005994 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005995 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5996 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5997 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005998 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5999 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006000 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006001 m_commandBuffer->EndRenderPass();
6002 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006003 // Destroy image invalidates the cmd buffer, causing error on submit
6004 vkDestroyImage(m_device->device(), image, NULL);
6005 // Attempt to submit cmd buffer
6006 submit_info = {};
6007 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6008 submit_info.commandBufferCount = 1;
6009 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6010 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6011 m_errorMonitor->VerifyFound();
6012 // Now update descriptor to be valid, but then free descriptor
6013 img_info.imageView = view2;
6014 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006015 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006016 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006017 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6018 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6019 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006020 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6021 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006022 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006023 m_commandBuffer->EndRenderPass();
6024 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006025 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006026
6027 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006029 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006030 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006031
6032 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006033 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006034 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006035 m_errorMonitor->SetUnexpectedError(
6036 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6037 "either be a valid handle or VK_NULL_HANDLE");
6038 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006039 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6040
6041 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006042 submit_info = {};
6043 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6044 submit_info.commandBufferCount = 1;
6045 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006047 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6048 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006049
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006050 // Cleanup
6051 vkFreeMemory(m_device->device(), image_memory, NULL);
6052 vkDestroySampler(m_device->device(), sampler2, NULL);
6053 vkDestroyImage(m_device->device(), image2, NULL);
6054 vkDestroyImageView(m_device->device(), view, NULL);
6055 vkDestroyImageView(m_device->device(), view2, NULL);
6056 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6057 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6058 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6059}
6060
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006061TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6062 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006063 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006064 ASSERT_NO_FATAL_FAILURE(InitViewport());
6065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6066
6067 VkDescriptorPoolSize ds_type_count = {};
6068 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6069 ds_type_count.descriptorCount = 1;
6070
6071 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6072 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6073 ds_pool_ci.pNext = NULL;
6074 ds_pool_ci.maxSets = 1;
6075 ds_pool_ci.poolSizeCount = 1;
6076 ds_pool_ci.pPoolSizes = &ds_type_count;
6077
6078 VkDescriptorPool ds_pool;
6079 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6080 ASSERT_VK_SUCCESS(err);
6081
6082 VkDescriptorSetLayoutBinding dsl_binding = {};
6083 dsl_binding.binding = 0;
6084 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6085 dsl_binding.descriptorCount = 1;
6086 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6087 dsl_binding.pImmutableSamplers = NULL;
6088
6089 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6090 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6091 ds_layout_ci.pNext = NULL;
6092 ds_layout_ci.bindingCount = 1;
6093 ds_layout_ci.pBindings = &dsl_binding;
6094 VkDescriptorSetLayout ds_layout;
6095 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6096 ASSERT_VK_SUCCESS(err);
6097
6098 VkDescriptorSet descriptor_set;
6099 VkDescriptorSetAllocateInfo alloc_info = {};
6100 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6101 alloc_info.descriptorSetCount = 1;
6102 alloc_info.descriptorPool = ds_pool;
6103 alloc_info.pSetLayouts = &ds_layout;
6104 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6105 ASSERT_VK_SUCCESS(err);
6106
6107 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6108 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6109 pipeline_layout_ci.pNext = NULL;
6110 pipeline_layout_ci.setLayoutCount = 1;
6111 pipeline_layout_ci.pSetLayouts = &ds_layout;
6112
6113 VkPipelineLayout pipeline_layout;
6114 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6115 ASSERT_VK_SUCCESS(err);
6116
6117 // Create image to update the descriptor with
6118 VkImageObj image(m_device);
6119 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6120 ASSERT_TRUE(image.initialized());
6121
6122 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6123 // Create Sampler
6124 VkSamplerCreateInfo sampler_ci = {};
6125 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6126 sampler_ci.pNext = NULL;
6127 sampler_ci.magFilter = VK_FILTER_NEAREST;
6128 sampler_ci.minFilter = VK_FILTER_NEAREST;
6129 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6130 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6131 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6132 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6133 sampler_ci.mipLodBias = 1.0;
6134 sampler_ci.anisotropyEnable = VK_FALSE;
6135 sampler_ci.maxAnisotropy = 1;
6136 sampler_ci.compareEnable = VK_FALSE;
6137 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6138 sampler_ci.minLod = 1.0;
6139 sampler_ci.maxLod = 1.0;
6140 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6141 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6142 VkSampler sampler;
6143 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6144 ASSERT_VK_SUCCESS(err);
6145 // Update descriptor with image and sampler
6146 VkDescriptorImageInfo img_info = {};
6147 img_info.sampler = sampler;
6148 img_info.imageView = view;
6149 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6150
6151 VkWriteDescriptorSet descriptor_write;
6152 memset(&descriptor_write, 0, sizeof(descriptor_write));
6153 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6154 descriptor_write.dstSet = descriptor_set;
6155 descriptor_write.dstBinding = 0;
6156 descriptor_write.descriptorCount = 1;
6157 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6158 descriptor_write.pImageInfo = &img_info;
6159
6160 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6161
6162 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006163 char const *vsSource =
6164 "#version 450\n"
6165 "\n"
6166 "out gl_PerVertex { \n"
6167 " vec4 gl_Position;\n"
6168 "};\n"
6169 "void main(){\n"
6170 " gl_Position = vec4(1);\n"
6171 "}\n";
6172 char const *fsSource =
6173 "#version 450\n"
6174 "\n"
6175 "layout(set=0, binding=0) uniform sampler2D s;\n"
6176 "layout(location=0) out vec4 x;\n"
6177 "void main(){\n"
6178 " x = texture(s, vec2(1));\n"
6179 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006180 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6181 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6182 VkPipelineObj pipe(m_device);
6183 pipe.AddShader(&vs);
6184 pipe.AddShader(&fs);
6185 pipe.AddColorAttachment();
6186 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6187
Tony Barbour552f6c02016-12-21 14:34:07 -07006188 m_commandBuffer->BeginCommandBuffer();
6189 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006190 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6191 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6192 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006193
6194 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6195 VkRect2D scissor = {{0, 0}, {16, 16}};
6196 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6197 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6198
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006199 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006200 m_commandBuffer->EndRenderPass();
6201 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006202 // Submit cmd buffer to put pool in-flight
6203 VkSubmitInfo submit_info = {};
6204 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6205 submit_info.commandBufferCount = 1;
6206 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6207 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6208 // Destroy pool while in-flight, causing error
6209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6210 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6211 m_errorMonitor->VerifyFound();
6212 vkQueueWaitIdle(m_device->m_queue);
6213 // Cleanup
6214 vkDestroySampler(m_device->device(), sampler, NULL);
6215 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6216 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006217 m_errorMonitor->SetUnexpectedError(
6218 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6219 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006220 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006221 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006222}
6223
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006224TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6225 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006226 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006227 ASSERT_NO_FATAL_FAILURE(InitViewport());
6228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6229
6230 VkDescriptorPoolSize ds_type_count = {};
6231 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6232 ds_type_count.descriptorCount = 1;
6233
6234 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6235 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6236 ds_pool_ci.pNext = NULL;
6237 ds_pool_ci.maxSets = 1;
6238 ds_pool_ci.poolSizeCount = 1;
6239 ds_pool_ci.pPoolSizes = &ds_type_count;
6240
6241 VkDescriptorPool ds_pool;
6242 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6243 ASSERT_VK_SUCCESS(err);
6244
6245 VkDescriptorSetLayoutBinding dsl_binding = {};
6246 dsl_binding.binding = 0;
6247 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6248 dsl_binding.descriptorCount = 1;
6249 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6250 dsl_binding.pImmutableSamplers = NULL;
6251
6252 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6253 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6254 ds_layout_ci.pNext = NULL;
6255 ds_layout_ci.bindingCount = 1;
6256 ds_layout_ci.pBindings = &dsl_binding;
6257 VkDescriptorSetLayout ds_layout;
6258 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6259 ASSERT_VK_SUCCESS(err);
6260
6261 VkDescriptorSet descriptorSet;
6262 VkDescriptorSetAllocateInfo alloc_info = {};
6263 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6264 alloc_info.descriptorSetCount = 1;
6265 alloc_info.descriptorPool = ds_pool;
6266 alloc_info.pSetLayouts = &ds_layout;
6267 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6268 ASSERT_VK_SUCCESS(err);
6269
6270 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6271 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6272 pipeline_layout_ci.pNext = NULL;
6273 pipeline_layout_ci.setLayoutCount = 1;
6274 pipeline_layout_ci.pSetLayouts = &ds_layout;
6275
6276 VkPipelineLayout pipeline_layout;
6277 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6278 ASSERT_VK_SUCCESS(err);
6279
6280 // Create images to update the descriptor with
6281 VkImage image;
6282 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6283 const int32_t tex_width = 32;
6284 const int32_t tex_height = 32;
6285 VkImageCreateInfo image_create_info = {};
6286 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6287 image_create_info.pNext = NULL;
6288 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6289 image_create_info.format = tex_format;
6290 image_create_info.extent.width = tex_width;
6291 image_create_info.extent.height = tex_height;
6292 image_create_info.extent.depth = 1;
6293 image_create_info.mipLevels = 1;
6294 image_create_info.arrayLayers = 1;
6295 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6296 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6297 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6298 image_create_info.flags = 0;
6299 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6300 ASSERT_VK_SUCCESS(err);
6301 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6302 VkMemoryRequirements memory_reqs;
6303 VkDeviceMemory image_memory;
6304 bool pass;
6305 VkMemoryAllocateInfo memory_info = {};
6306 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6307 memory_info.pNext = NULL;
6308 memory_info.allocationSize = 0;
6309 memory_info.memoryTypeIndex = 0;
6310 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6311 // Allocate enough memory for image
6312 memory_info.allocationSize = memory_reqs.size;
6313 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6314 ASSERT_TRUE(pass);
6315 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6316 ASSERT_VK_SUCCESS(err);
6317 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6318 ASSERT_VK_SUCCESS(err);
6319
6320 VkImageViewCreateInfo image_view_create_info = {};
6321 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6322 image_view_create_info.image = image;
6323 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6324 image_view_create_info.format = tex_format;
6325 image_view_create_info.subresourceRange.layerCount = 1;
6326 image_view_create_info.subresourceRange.baseMipLevel = 0;
6327 image_view_create_info.subresourceRange.levelCount = 1;
6328 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6329
6330 VkImageView view;
6331 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6332 ASSERT_VK_SUCCESS(err);
6333 // Create Samplers
6334 VkSamplerCreateInfo sampler_ci = {};
6335 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6336 sampler_ci.pNext = NULL;
6337 sampler_ci.magFilter = VK_FILTER_NEAREST;
6338 sampler_ci.minFilter = VK_FILTER_NEAREST;
6339 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6340 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6341 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6342 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6343 sampler_ci.mipLodBias = 1.0;
6344 sampler_ci.anisotropyEnable = VK_FALSE;
6345 sampler_ci.maxAnisotropy = 1;
6346 sampler_ci.compareEnable = VK_FALSE;
6347 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6348 sampler_ci.minLod = 1.0;
6349 sampler_ci.maxLod = 1.0;
6350 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6351 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6352 VkSampler sampler;
6353 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6354 ASSERT_VK_SUCCESS(err);
6355 // Update descriptor with image and sampler
6356 VkDescriptorImageInfo img_info = {};
6357 img_info.sampler = sampler;
6358 img_info.imageView = view;
6359 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6360
6361 VkWriteDescriptorSet descriptor_write;
6362 memset(&descriptor_write, 0, sizeof(descriptor_write));
6363 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6364 descriptor_write.dstSet = descriptorSet;
6365 descriptor_write.dstBinding = 0;
6366 descriptor_write.descriptorCount = 1;
6367 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6368 descriptor_write.pImageInfo = &img_info;
6369 // Break memory binding and attempt update
6370 vkFreeMemory(m_device->device(), image_memory, nullptr);
6371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006372 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6374 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6375 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6376 m_errorMonitor->VerifyFound();
6377 // Cleanup
6378 vkDestroyImage(m_device->device(), image, NULL);
6379 vkDestroySampler(m_device->device(), sampler, NULL);
6380 vkDestroyImageView(m_device->device(), view, NULL);
6381 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6382 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6383 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6384}
6385
Karl Schultz6addd812016-02-02 17:17:23 -07006386TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006387 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6388 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006389 // Create a valid cmd buffer
6390 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006391 uint64_t fake_pipeline_handle = 0xbaad6001;
6392 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006393 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6395
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006397 m_commandBuffer->BeginCommandBuffer();
6398 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006399 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006400 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006401
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006402 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006404 Draw(1, 0, 0, 0);
6405 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006406
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006407 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006409 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006410 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6411 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006412}
6413
Karl Schultz6addd812016-02-02 17:17:23 -07006414TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006415 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006416 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006417
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006419
Tony Barbour1fa09702017-03-16 12:09:08 -06006420 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006421 ASSERT_NO_FATAL_FAILURE(InitViewport());
6422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006423 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006424 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6425 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006426
6427 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006428 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6429 ds_pool_ci.pNext = NULL;
6430 ds_pool_ci.maxSets = 1;
6431 ds_pool_ci.poolSizeCount = 1;
6432 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006433
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006434 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006435 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006436 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006437
Tony Barboureb254902015-07-15 12:50:33 -06006438 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006439 dsl_binding.binding = 0;
6440 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6441 dsl_binding.descriptorCount = 1;
6442 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6443 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006444
Tony Barboureb254902015-07-15 12:50:33 -06006445 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006446 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6447 ds_layout_ci.pNext = NULL;
6448 ds_layout_ci.bindingCount = 1;
6449 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006450 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006451 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006452 ASSERT_VK_SUCCESS(err);
6453
6454 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006455 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006456 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006457 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006458 alloc_info.descriptorPool = ds_pool;
6459 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006460 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006461 ASSERT_VK_SUCCESS(err);
6462
Tony Barboureb254902015-07-15 12:50:33 -06006463 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006464 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6465 pipeline_layout_ci.pNext = NULL;
6466 pipeline_layout_ci.setLayoutCount = 1;
6467 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006468
6469 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006470 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006471 ASSERT_VK_SUCCESS(err);
6472
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006473 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006474 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006475 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006476 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006477
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006478 VkPipelineObj pipe(m_device);
6479 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006480 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006481 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006482 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006483
Tony Barbour552f6c02016-12-21 14:34:07 -07006484 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006485 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6486 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6487 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006488
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006489 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006490
Chia-I Wuf7458c52015-10-26 21:10:41 +08006491 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6492 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6493 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006494}
6495
Karl Schultz6addd812016-02-02 17:17:23 -07006496TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006497 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006498 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006499
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006501
Tony Barbour1fa09702017-03-16 12:09:08 -06006502 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006503 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006504 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6505 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006506
6507 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006508 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6509 ds_pool_ci.pNext = NULL;
6510 ds_pool_ci.maxSets = 1;
6511 ds_pool_ci.poolSizeCount = 1;
6512 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006513
6514 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006515 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006516 ASSERT_VK_SUCCESS(err);
6517
6518 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006519 dsl_binding.binding = 0;
6520 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6521 dsl_binding.descriptorCount = 1;
6522 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6523 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006524
6525 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006526 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6527 ds_layout_ci.pNext = NULL;
6528 ds_layout_ci.bindingCount = 1;
6529 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006530 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006531 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006532 ASSERT_VK_SUCCESS(err);
6533
6534 VkDescriptorSet descriptorSet;
6535 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006536 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006537 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006538 alloc_info.descriptorPool = ds_pool;
6539 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006540 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006541 ASSERT_VK_SUCCESS(err);
6542
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006543 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006544 VkWriteDescriptorSet descriptor_write;
6545 memset(&descriptor_write, 0, sizeof(descriptor_write));
6546 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6547 descriptor_write.dstSet = descriptorSet;
6548 descriptor_write.dstBinding = 0;
6549 descriptor_write.descriptorCount = 1;
6550 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6551 descriptor_write.pTexelBufferView = &view;
6552
6553 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6554
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006555 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006556
6557 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6558 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6559}
6560
Mark Youngd339ba32016-05-30 13:28:35 -06006561TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006562 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006563
6564 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006566 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006567
Tony Barbour1fa09702017-03-16 12:09:08 -06006568 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006569
6570 // Create a buffer with no bound memory and then attempt to create
6571 // a buffer view.
6572 VkBufferCreateInfo buff_ci = {};
6573 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006574 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006575 buff_ci.size = 256;
6576 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6577 VkBuffer buffer;
6578 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6579 ASSERT_VK_SUCCESS(err);
6580
6581 VkBufferViewCreateInfo buff_view_ci = {};
6582 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6583 buff_view_ci.buffer = buffer;
6584 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6585 buff_view_ci.range = VK_WHOLE_SIZE;
6586 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006587 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006588
6589 m_errorMonitor->VerifyFound();
6590 vkDestroyBuffer(m_device->device(), buffer, NULL);
6591 // If last error is success, it still created the view, so delete it.
6592 if (err == VK_SUCCESS) {
6593 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6594 }
6595}
6596
Karl Schultz6addd812016-02-02 17:17:23 -07006597TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6598 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6599 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006600 // 1. No dynamicOffset supplied
6601 // 2. Too many dynamicOffsets supplied
6602 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006603 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6605 " requires 1 dynamicOffsets, but only "
6606 "0 dynamicOffsets are left in "
6607 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006608
Tony Barbour1fa09702017-03-16 12:09:08 -06006609 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006610 ASSERT_NO_FATAL_FAILURE(InitViewport());
6611 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6612
6613 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006614 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6615 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006616
6617 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006618 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6619 ds_pool_ci.pNext = NULL;
6620 ds_pool_ci.maxSets = 1;
6621 ds_pool_ci.poolSizeCount = 1;
6622 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006623
6624 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006625 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006626 ASSERT_VK_SUCCESS(err);
6627
6628 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006629 dsl_binding.binding = 0;
6630 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6631 dsl_binding.descriptorCount = 1;
6632 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6633 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006634
6635 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006636 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6637 ds_layout_ci.pNext = NULL;
6638 ds_layout_ci.bindingCount = 1;
6639 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006640 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006641 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006642 ASSERT_VK_SUCCESS(err);
6643
6644 VkDescriptorSet descriptorSet;
6645 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006646 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006647 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006648 alloc_info.descriptorPool = ds_pool;
6649 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006650 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006651 ASSERT_VK_SUCCESS(err);
6652
6653 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006654 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6655 pipeline_layout_ci.pNext = NULL;
6656 pipeline_layout_ci.setLayoutCount = 1;
6657 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006658
6659 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006660 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006661 ASSERT_VK_SUCCESS(err);
6662
6663 // Create a buffer to update the descriptor with
6664 uint32_t qfi = 0;
6665 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006666 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6667 buffCI.size = 1024;
6668 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6669 buffCI.queueFamilyIndexCount = 1;
6670 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006671
6672 VkBuffer dyub;
6673 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6674 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006675 // Allocate memory and bind to buffer so we can make it to the appropriate
6676 // error
6677 VkMemoryAllocateInfo mem_alloc = {};
6678 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6679 mem_alloc.pNext = NULL;
6680 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006681 mem_alloc.memoryTypeIndex = 0;
6682
6683 VkMemoryRequirements memReqs;
6684 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006685 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006686 if (!pass) {
6687 vkDestroyBuffer(m_device->device(), dyub, NULL);
6688 return;
6689 }
6690
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006691 VkDeviceMemory mem;
6692 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6693 ASSERT_VK_SUCCESS(err);
6694 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6695 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006696 // Correctly update descriptor to avoid "NOT_UPDATED" error
6697 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006698 buffInfo.buffer = dyub;
6699 buffInfo.offset = 0;
6700 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006701
6702 VkWriteDescriptorSet descriptor_write;
6703 memset(&descriptor_write, 0, sizeof(descriptor_write));
6704 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6705 descriptor_write.dstSet = descriptorSet;
6706 descriptor_write.dstBinding = 0;
6707 descriptor_write.descriptorCount = 1;
6708 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6709 descriptor_write.pBufferInfo = &buffInfo;
6710
6711 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6712
Tony Barbour552f6c02016-12-21 14:34:07 -07006713 m_commandBuffer->BeginCommandBuffer();
6714 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006715 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6716 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006717 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006718 uint32_t pDynOff[2] = {512, 756};
6719 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6721 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6722 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6723 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006724 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006725 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6727 " dynamic offset 512 combined with "
6728 "offset 0 and range 1024 that "
6729 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006730 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006731 char const *vsSource =
6732 "#version 450\n"
6733 "\n"
6734 "out gl_PerVertex { \n"
6735 " vec4 gl_Position;\n"
6736 "};\n"
6737 "void main(){\n"
6738 " gl_Position = vec4(1);\n"
6739 "}\n";
6740 char const *fsSource =
6741 "#version 450\n"
6742 "\n"
6743 "layout(location=0) out vec4 x;\n"
6744 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6745 "void main(){\n"
6746 " x = vec4(bar.y);\n"
6747 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006748 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6749 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6750 VkPipelineObj pipe(m_device);
6751 pipe.AddShader(&vs);
6752 pipe.AddShader(&fs);
6753 pipe.AddColorAttachment();
6754 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6755
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006756 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6757 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6758 VkRect2D scissor = {{0, 0}, {16, 16}};
6759 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6760
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006761 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006762 // This update should succeed, but offset size of 512 will overstep buffer
6763 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006764 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6765 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006766 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006767 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006768
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006769 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006770 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006771
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006772 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006773 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006774 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6775}
6776
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006777TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006778 TEST_DESCRIPTION(
6779 "Attempt to update a descriptor with a non-sparse buffer "
6780 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006781 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006783 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6785 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006786
Tony Barbour1fa09702017-03-16 12:09:08 -06006787 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006788 ASSERT_NO_FATAL_FAILURE(InitViewport());
6789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6790
6791 VkDescriptorPoolSize ds_type_count = {};
6792 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6793 ds_type_count.descriptorCount = 1;
6794
6795 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6796 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6797 ds_pool_ci.pNext = NULL;
6798 ds_pool_ci.maxSets = 1;
6799 ds_pool_ci.poolSizeCount = 1;
6800 ds_pool_ci.pPoolSizes = &ds_type_count;
6801
6802 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006803 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006804 ASSERT_VK_SUCCESS(err);
6805
6806 VkDescriptorSetLayoutBinding dsl_binding = {};
6807 dsl_binding.binding = 0;
6808 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6809 dsl_binding.descriptorCount = 1;
6810 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6811 dsl_binding.pImmutableSamplers = NULL;
6812
6813 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6814 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6815 ds_layout_ci.pNext = NULL;
6816 ds_layout_ci.bindingCount = 1;
6817 ds_layout_ci.pBindings = &dsl_binding;
6818 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006819 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006820 ASSERT_VK_SUCCESS(err);
6821
6822 VkDescriptorSet descriptorSet;
6823 VkDescriptorSetAllocateInfo alloc_info = {};
6824 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6825 alloc_info.descriptorSetCount = 1;
6826 alloc_info.descriptorPool = ds_pool;
6827 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006828 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006829 ASSERT_VK_SUCCESS(err);
6830
6831 // Create a buffer to update the descriptor with
6832 uint32_t qfi = 0;
6833 VkBufferCreateInfo buffCI = {};
6834 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6835 buffCI.size = 1024;
6836 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6837 buffCI.queueFamilyIndexCount = 1;
6838 buffCI.pQueueFamilyIndices = &qfi;
6839
6840 VkBuffer dyub;
6841 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6842 ASSERT_VK_SUCCESS(err);
6843
6844 // Attempt to update descriptor without binding memory to it
6845 VkDescriptorBufferInfo buffInfo = {};
6846 buffInfo.buffer = dyub;
6847 buffInfo.offset = 0;
6848 buffInfo.range = 1024;
6849
6850 VkWriteDescriptorSet descriptor_write;
6851 memset(&descriptor_write, 0, sizeof(descriptor_write));
6852 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6853 descriptor_write.dstSet = descriptorSet;
6854 descriptor_write.dstBinding = 0;
6855 descriptor_write.descriptorCount = 1;
6856 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6857 descriptor_write.pBufferInfo = &buffInfo;
6858
6859 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6860 m_errorMonitor->VerifyFound();
6861
6862 vkDestroyBuffer(m_device->device(), dyub, NULL);
6863 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6864 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6865}
6866
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006867TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006868 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006869 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006870 ASSERT_NO_FATAL_FAILURE(InitViewport());
6871 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6872
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006873 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006874 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006875 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6876 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6877 pipeline_layout_ci.pushConstantRangeCount = 1;
6878 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6879
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006880 //
6881 // Check for invalid push constant ranges in pipeline layouts.
6882 //
6883 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006884 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006885 char const *msg;
6886 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006887
Karl Schultzc81037d2016-05-12 08:11:23 -06006888 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6889 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6890 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6891 "vkCreatePipelineLayout() call has push constants index 0 with "
6892 "size 0."},
6893 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6894 "vkCreatePipelineLayout() call has push constants index 0 with "
6895 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006896 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006897 "vkCreatePipelineLayout() call has push constants index 0 with "
6898 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006899 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006900 "vkCreatePipelineLayout() call has push constants index 0 with "
6901 "size 0."},
6902 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6903 "vkCreatePipelineLayout() call has push constants index 0 with "
6904 "offset 1. Offset must"},
6905 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6906 "vkCreatePipelineLayout() call has push constants index 0 "
6907 "with offset "},
6908 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6909 "vkCreatePipelineLayout() call has push constants "
6910 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006911 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006912 "vkCreatePipelineLayout() call has push constants index 0 "
6913 "with offset "},
6914 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6915 "vkCreatePipelineLayout() call has push "
6916 "constants index 0 with offset "},
6917 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6918 "vkCreatePipelineLayout() call has push "
6919 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006920 }};
6921
6922 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006923 for (const auto &iter : range_tests) {
6924 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6926 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006927 m_errorMonitor->VerifyFound();
6928 if (VK_SUCCESS == err) {
6929 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6930 }
6931 }
6932
6933 // Check for invalid stage flag
6934 pc_range.offset = 0;
6935 pc_range.size = 16;
6936 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006937 m_errorMonitor->SetDesiredFailureMsg(
6938 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6939 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006940 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006941 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006942 if (VK_SUCCESS == err) {
6943 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6944 }
6945
Karl Schultzc59b72d2017-02-24 15:45:05 -07006946 // Check for duplicate stage flags in a list of push constant ranges.
6947 // A shader can only have one push constant block and that block is mapped
6948 // to the push constant range that has that shader's stage flag set.
6949 // The shader's stage flag can only appear once in all the ranges, so the
6950 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006951 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006952 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006953 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006954 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006955 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006956 // Overlapping ranges are OK, but a stage flag can appear only once.
6957 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6958 {
6959 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6960 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6961 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6962 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006963 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006964 {
6965 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6966 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6967 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6968 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6969 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6970 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6971 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6972 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6973 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6974 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6975 }},
6976 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6977 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6978 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6979 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6980 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6981 {
6982 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6983 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6984 }},
6985 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6986 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6987 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6988 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6989 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6990 {
6991 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6992 }},
6993 },
6994 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006995
Karl Schultzc59b72d2017-02-24 15:45:05 -07006996 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006997 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006998 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007000 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007001 m_errorMonitor->VerifyFound();
7002 if (VK_SUCCESS == err) {
7003 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7004 }
7005 }
7006
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007007 //
7008 // CmdPushConstants tests
7009 //
7010
Karl Schultzc59b72d2017-02-24 15:45:05 -07007011 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007012 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007013 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007014 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007015 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007016 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007017 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007018 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007019
7020 const uint8_t dummy_values[100] = {};
7021
7022 m_commandBuffer->BeginCommandBuffer();
7023 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007024
7025 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007026 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007028 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007029 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007030
Karl Schultzc59b72d2017-02-24 15:45:05 -07007031 m_errorMonitor->ExpectSuccess();
7032 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7033 m_errorMonitor->VerifyNotFound();
7034 m_errorMonitor->ExpectSuccess();
7035 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7036 m_errorMonitor->VerifyNotFound();
7037 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7038 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7039 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7040 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7041 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7042 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7043 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007044 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007045 for (const auto &iter : cmd_range_tests) {
7046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7047 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7048 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007049 m_errorMonitor->VerifyFound();
7050 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007051
Tony Barbour552f6c02016-12-21 14:34:07 -07007052 m_commandBuffer->EndRenderPass();
7053 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007054 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007055}
7056
Karl Schultz6addd812016-02-02 17:17:23 -07007057TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007058 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007059 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007060
Tony Barbour1fa09702017-03-16 12:09:08 -06007061 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007062 ASSERT_NO_FATAL_FAILURE(InitViewport());
7063 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7064
7065 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7066 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007067 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7068 ds_type_count[0].descriptorCount = 10;
7069 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7070 ds_type_count[1].descriptorCount = 2;
7071 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7072 ds_type_count[2].descriptorCount = 2;
7073 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7074 ds_type_count[3].descriptorCount = 5;
7075 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7076 // type
7077 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7078 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7079 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007080
7081 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007082 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7083 ds_pool_ci.pNext = NULL;
7084 ds_pool_ci.maxSets = 5;
7085 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7086 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007087
7088 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007089 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007090 ASSERT_VK_SUCCESS(err);
7091
7092 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7093 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007094 dsl_binding[0].binding = 0;
7095 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7096 dsl_binding[0].descriptorCount = 5;
7097 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7098 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007099
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007100 // Create layout identical to set0 layout but w/ different stageFlags
7101 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007102 dsl_fs_stage_only.binding = 0;
7103 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7104 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007105 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7106 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007107 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007108 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007109 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7110 ds_layout_ci.pNext = NULL;
7111 ds_layout_ci.bindingCount = 1;
7112 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007113 static const uint32_t NUM_LAYOUTS = 4;
7114 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007115 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007116 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7117 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007118 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007119 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007120 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007122 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007123 dsl_binding[0].binding = 0;
7124 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007125 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007126 dsl_binding[1].binding = 1;
7127 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7128 dsl_binding[1].descriptorCount = 2;
7129 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7130 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007131 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007132 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007133 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007134 ASSERT_VK_SUCCESS(err);
7135 dsl_binding[0].binding = 0;
7136 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007137 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007138 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007139 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007140 ASSERT_VK_SUCCESS(err);
7141 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007142 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007143 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007144 ASSERT_VK_SUCCESS(err);
7145
7146 static const uint32_t NUM_SETS = 4;
7147 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7148 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007149 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007150 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007151 alloc_info.descriptorPool = ds_pool;
7152 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007153 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007154 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007155 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007156 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007157 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007158 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007159 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007160
7161 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007162 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7163 pipeline_layout_ci.pNext = NULL;
7164 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7165 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007166
7167 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007168 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007169 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007170 // Create pipelineLayout with only one setLayout
7171 pipeline_layout_ci.setLayoutCount = 1;
7172 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007173 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007174 ASSERT_VK_SUCCESS(err);
7175 // Create pipelineLayout with 2 descriptor setLayout at index 0
7176 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7177 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007178 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007179 ASSERT_VK_SUCCESS(err);
7180 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7181 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7182 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007183 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007184 ASSERT_VK_SUCCESS(err);
7185 // Create pipelineLayout with UB type, but stageFlags for FS only
7186 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7187 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007188 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007189 ASSERT_VK_SUCCESS(err);
7190 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7191 VkDescriptorSetLayout pl_bad_s0[2] = {};
7192 pl_bad_s0[0] = ds_layout_fs_only;
7193 pl_bad_s0[1] = ds_layout[1];
7194 pipeline_layout_ci.setLayoutCount = 2;
7195 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7196 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007197 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007198 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007199
Tobin Ehlis88452832015-12-03 09:40:56 -07007200 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007201 char const *vsSource =
7202 "#version 450\n"
7203 "\n"
7204 "out gl_PerVertex {\n"
7205 " vec4 gl_Position;\n"
7206 "};\n"
7207 "void main(){\n"
7208 " gl_Position = vec4(1);\n"
7209 "}\n";
7210 char const *fsSource =
7211 "#version 450\n"
7212 "\n"
7213 "layout(location=0) out vec4 x;\n"
7214 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7215 "void main(){\n"
7216 " x = vec4(bar.y);\n"
7217 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007218 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7219 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007220 VkPipelineObj pipe(m_device);
7221 pipe.AddShader(&vs);
7222 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007223 pipe.AddColorAttachment();
7224 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007225
Tony Barbour552f6c02016-12-21 14:34:07 -07007226 m_commandBuffer->BeginCommandBuffer();
7227 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007228
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007229 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007230 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7231 // of PSO
7232 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7233 // cmd_pipeline.c
7234 // due to the fact that cmd_alloc_dset_data() has not been called in
7235 // cmd_bind_graphics_pipeline()
7236 // TODO : Want to cause various binding incompatibility issues here to test
7237 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007238 // First cause various verify_layout_compatibility() fails
7239 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007240 // verify_set_layout_compatibility fail cases:
7241 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007243 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7244 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007245 m_errorMonitor->VerifyFound();
7246
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007247 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7249 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7250 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007251 m_errorMonitor->VerifyFound();
7252
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007253 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007254 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7255 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7257 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7258 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007259 m_errorMonitor->VerifyFound();
7260
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007261 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7262 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7264 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7265 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007266 m_errorMonitor->VerifyFound();
7267
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007268 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7269 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7271 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7272 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7273 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007274 m_errorMonitor->VerifyFound();
7275
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007276 // Cause INFO messages due to disturbing previously bound Sets
7277 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007278 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7279 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007280 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7282 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7283 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007284 m_errorMonitor->VerifyFound();
7285
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007286 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7287 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007288 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007289 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7290 " newly bound as set #0 so set #1 and "
7291 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007292 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7293 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007294 m_errorMonitor->VerifyFound();
7295
Tobin Ehlis10fad692016-07-07 12:00:36 -06007296 // Now that we're done actively using the pipelineLayout that gfx pipeline
7297 // was created with, we should be able to delete it. Do that now to verify
7298 // that validation obeys pipelineLayout lifetime
7299 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7300
Tobin Ehlis88452832015-12-03 09:40:56 -07007301 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007302 // 1. Error due to not binding required set (we actually use same code as
7303 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007304 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7305 &descriptorSet[0], 0, NULL);
7306 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7307 &descriptorSet[1], 0, NULL);
7308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007309
7310 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7311 VkRect2D scissor = {{0, 0}, {16, 16}};
7312 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7313 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7314
Tobin Ehlis88452832015-12-03 09:40:56 -07007315 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007316 m_errorMonitor->VerifyFound();
7317
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007318 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007319 // 2. Error due to bound set not being compatible with PSO's
7320 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007321 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7322 &descriptorSet[0], 0, NULL);
7323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007324 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007325 m_errorMonitor->VerifyFound();
7326
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007327 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007328 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007329 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7330 }
7331 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007332 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7333 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7334}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007335
Karl Schultz6addd812016-02-02 17:17:23 -07007336TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7338 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007339
Tony Barbour1fa09702017-03-16 12:09:08 -06007340 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007341 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007342 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007343 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007344
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007345 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007346}
7347
Karl Schultz6addd812016-02-02 17:17:23 -07007348TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7349 VkResult err;
7350 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007351
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007353
Tony Barbour1fa09702017-03-16 12:09:08 -06007354 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007355
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007356 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007357 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007358 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007359 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007360 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007361 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007362
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007363 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007364 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007365
7366 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007367 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007368 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7369
7370 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007371 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007372 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007373 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007374 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007375
7376 // The error should be caught by validation of the BeginCommandBuffer call
7377 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7378
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007379 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007380 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007381}
7382
Karl Schultz6addd812016-02-02 17:17:23 -07007383TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007384 // Cause error due to Begin while recording CB
7385 // Then cause 2 errors for attempting to reset CB w/o having
7386 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7387 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007389
Tony Barbour1fa09702017-03-16 12:09:08 -06007390 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007391
7392 // Calls AllocateCommandBuffers
7393 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7394
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007395 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007396 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007397 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7398 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007399 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7400 cmd_buf_info.pNext = NULL;
7401 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007402 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007403
7404 // Begin CB to transition to recording state
7405 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7406 // Can't re-begin. This should trigger error
7407 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007408 m_errorMonitor->VerifyFound();
7409
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007411 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007412 // Reset attempt will trigger error due to incorrect CommandPool state
7413 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007414 m_errorMonitor->VerifyFound();
7415
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007417 // Transition CB to RECORDED state
7418 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7419 // Now attempting to Begin will implicitly reset, which triggers error
7420 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007421 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007422}
7423
Karl Schultz6addd812016-02-02 17:17:23 -07007424TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007425 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007426 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007427
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7429 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007430
Tony Barbour1fa09702017-03-16 12:09:08 -06007431 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007432 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007433
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007434 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007435 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7436 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007437
7438 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007439 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7440 ds_pool_ci.pNext = NULL;
7441 ds_pool_ci.maxSets = 1;
7442 ds_pool_ci.poolSizeCount = 1;
7443 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007444
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007445 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007446 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007447 ASSERT_VK_SUCCESS(err);
7448
Tony Barboureb254902015-07-15 12:50:33 -06007449 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007450 dsl_binding.binding = 0;
7451 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7452 dsl_binding.descriptorCount = 1;
7453 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7454 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007455
Tony Barboureb254902015-07-15 12:50:33 -06007456 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007457 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7458 ds_layout_ci.pNext = NULL;
7459 ds_layout_ci.bindingCount = 1;
7460 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007461
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007462 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007464 ASSERT_VK_SUCCESS(err);
7465
7466 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007467 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007468 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007469 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007470 alloc_info.descriptorPool = ds_pool;
7471 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007472 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007473 ASSERT_VK_SUCCESS(err);
7474
Tony Barboureb254902015-07-15 12:50:33 -06007475 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007476 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7477 pipeline_layout_ci.setLayoutCount = 1;
7478 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007479
7480 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007481 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007482 ASSERT_VK_SUCCESS(err);
7483
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007484 VkViewport vp = {}; // Just need dummy vp to point to
7485 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007486
7487 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007488 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7489 vp_state_ci.scissorCount = 1;
7490 vp_state_ci.pScissors = &sc;
7491 vp_state_ci.viewportCount = 1;
7492 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007493
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007494 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7495 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7496 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7497 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7498 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7499 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007500 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007501 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007502 rs_state_ci.lineWidth = 1.0f;
7503
7504 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7505 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7506 vi_ci.pNext = nullptr;
7507 vi_ci.vertexBindingDescriptionCount = 0;
7508 vi_ci.pVertexBindingDescriptions = nullptr;
7509 vi_ci.vertexAttributeDescriptionCount = 0;
7510 vi_ci.pVertexAttributeDescriptions = nullptr;
7511
7512 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7513 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7514 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7515
7516 VkPipelineShaderStageCreateInfo shaderStages[2];
7517 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7518
7519 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7520 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007521 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007522 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007523
Tony Barboureb254902015-07-15 12:50:33 -06007524 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007525 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7526 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007527 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007528 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7529 gp_ci.layout = pipeline_layout;
7530 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007531 gp_ci.pVertexInputState = &vi_ci;
7532 gp_ci.pInputAssemblyState = &ia_ci;
7533
7534 gp_ci.stageCount = 1;
7535 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007536
7537 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007538 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7539 pc_ci.initialDataSize = 0;
7540 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007541
7542 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007543 VkPipelineCache pipelineCache;
7544
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007545 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007546 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007547 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007548 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007549
Chia-I Wuf7458c52015-10-26 21:10:41 +08007550 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7551 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7552 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7553 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007554}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007555
Tobin Ehlis912df022015-09-17 08:46:18 -06007556/*// TODO : This test should be good, but needs Tess support in compiler to run
7557TEST_F(VkLayerTest, InvalidPatchControlPoints)
7558{
7559 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007560 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007561
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007563 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7564primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007565
Tony Barbour1fa09702017-03-16 12:09:08 -06007566 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007567 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007568
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007569 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007570 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007571 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007572
7573 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7574 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7575 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007576 ds_pool_ci.poolSizeCount = 1;
7577 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007578
7579 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007580 err = vkCreateDescriptorPool(m_device->device(),
7581VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007582 ASSERT_VK_SUCCESS(err);
7583
7584 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007585 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007586 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007587 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007588 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7589 dsl_binding.pImmutableSamplers = NULL;
7590
7591 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007592 ds_layout_ci.sType =
7593VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007594 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007595 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007596 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007597
7598 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007599 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7600&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007601 ASSERT_VK_SUCCESS(err);
7602
7603 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007604 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7605VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007606 ASSERT_VK_SUCCESS(err);
7607
7608 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007609 pipeline_layout_ci.sType =
7610VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007611 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007612 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007613 pipeline_layout_ci.pSetLayouts = &ds_layout;
7614
7615 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007616 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7617&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007618 ASSERT_VK_SUCCESS(err);
7619
7620 VkPipelineShaderStageCreateInfo shaderStages[3];
7621 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7622
Karl Schultz6addd812016-02-02 17:17:23 -07007623 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7624this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007625 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007626 VkShaderObj
7627tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7628this);
7629 VkShaderObj
7630te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7631this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007632
Karl Schultz6addd812016-02-02 17:17:23 -07007633 shaderStages[0].sType =
7634VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007635 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007636 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007637 shaderStages[1].sType =
7638VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007639 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007640 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007641 shaderStages[2].sType =
7642VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007643 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007644 shaderStages[2].shader = te.handle();
7645
7646 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007647 iaCI.sType =
7648VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007649 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007650
7651 VkPipelineTessellationStateCreateInfo tsCI = {};
7652 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7653 tsCI.patchControlPoints = 0; // This will cause an error
7654
7655 VkGraphicsPipelineCreateInfo gp_ci = {};
7656 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7657 gp_ci.pNext = NULL;
7658 gp_ci.stageCount = 3;
7659 gp_ci.pStages = shaderStages;
7660 gp_ci.pVertexInputState = NULL;
7661 gp_ci.pInputAssemblyState = &iaCI;
7662 gp_ci.pTessellationState = &tsCI;
7663 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007664 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007665 gp_ci.pMultisampleState = NULL;
7666 gp_ci.pDepthStencilState = NULL;
7667 gp_ci.pColorBlendState = NULL;
7668 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7669 gp_ci.layout = pipeline_layout;
7670 gp_ci.renderPass = renderPass();
7671
7672 VkPipelineCacheCreateInfo pc_ci = {};
7673 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7674 pc_ci.pNext = NULL;
7675 pc_ci.initialSize = 0;
7676 pc_ci.initialData = 0;
7677 pc_ci.maxSize = 0;
7678
7679 VkPipeline pipeline;
7680 VkPipelineCache pipelineCache;
7681
Karl Schultz6addd812016-02-02 17:17:23 -07007682 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7683&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007684 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007685 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7686&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007687
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007688 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007689
Chia-I Wuf7458c52015-10-26 21:10:41 +08007690 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7691 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7692 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7693 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007694}
7695*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007696
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007697TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007698 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007699
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007700 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007701
Tony Barbour1fa09702017-03-16 12:09:08 -06007702 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007703 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007704
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007705 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007706 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7707 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007708
7709 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007710 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7711 ds_pool_ci.maxSets = 1;
7712 ds_pool_ci.poolSizeCount = 1;
7713 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007714
7715 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007716 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007717 ASSERT_VK_SUCCESS(err);
7718
7719 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007720 dsl_binding.binding = 0;
7721 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7722 dsl_binding.descriptorCount = 1;
7723 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007724
7725 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007726 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7727 ds_layout_ci.bindingCount = 1;
7728 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007729
7730 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007731 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007732 ASSERT_VK_SUCCESS(err);
7733
7734 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007735 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007736 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007737 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007738 alloc_info.descriptorPool = ds_pool;
7739 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007740 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007741 ASSERT_VK_SUCCESS(err);
7742
7743 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007744 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7745 pipeline_layout_ci.setLayoutCount = 1;
7746 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007747
7748 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007749 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007750 ASSERT_VK_SUCCESS(err);
7751
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007752 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007753 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007754 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007755 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007756 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007757 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007758
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007759 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7760 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7761 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7762 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7763 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7764 rs_state_ci.depthClampEnable = VK_FALSE;
7765 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7766 rs_state_ci.depthBiasEnable = VK_FALSE;
7767
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007768 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7769 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7770 vi_ci.pNext = nullptr;
7771 vi_ci.vertexBindingDescriptionCount = 0;
7772 vi_ci.pVertexBindingDescriptions = nullptr;
7773 vi_ci.vertexAttributeDescriptionCount = 0;
7774 vi_ci.pVertexAttributeDescriptions = nullptr;
7775
7776 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7777 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7778 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7779
7780 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7781 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7782 pipe_ms_state_ci.pNext = NULL;
7783 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7784 pipe_ms_state_ci.sampleShadingEnable = 0;
7785 pipe_ms_state_ci.minSampleShading = 1.0;
7786 pipe_ms_state_ci.pSampleMask = NULL;
7787
Cody Northropeb3a6c12015-10-05 14:44:45 -06007788 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007789 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007790
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007791 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007792 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007793 shaderStages[0] = vs.GetStageCreateInfo();
7794 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007795
7796 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007797 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7798 gp_ci.stageCount = 2;
7799 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007800 gp_ci.pVertexInputState = &vi_ci;
7801 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007802 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007803 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007804 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007805 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7806 gp_ci.layout = pipeline_layout;
7807 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007808
7809 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007810 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007811
7812 VkPipeline pipeline;
7813 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007814 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007815 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007816
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007817 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007818 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007819
7820 // Check case where multiViewport is disabled and viewport count is not 1
7821 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7824 vp_state_ci.scissorCount = 0;
7825 vp_state_ci.viewportCount = 0;
7826 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7827 m_errorMonitor->VerifyFound();
7828 } else {
7829 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007830 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007831 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007832 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007833
7834 // Check is that viewportcount and scissorcount match
7835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7836 vp_state_ci.scissorCount = 1;
7837 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7838 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7839 m_errorMonitor->VerifyFound();
7840
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007841 // Check case where multiViewport is enabled and viewport count is greater than max
7842 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7845 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7846 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7847 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7848 m_errorMonitor->VerifyFound();
7849 }
7850 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007851
Chia-I Wuf7458c52015-10-26 21:10:41 +08007852 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7853 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7854 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7855 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007856}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007857
7858// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
7859// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007860TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007861 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007862
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007863 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7864
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007866
Tony Barbour1fa09702017-03-16 12:09:08 -06007867 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007868 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007869
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007870 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007871 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7872 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007873
7874 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007875 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7876 ds_pool_ci.maxSets = 1;
7877 ds_pool_ci.poolSizeCount = 1;
7878 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007879
7880 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007881 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007882 ASSERT_VK_SUCCESS(err);
7883
7884 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007885 dsl_binding.binding = 0;
7886 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7887 dsl_binding.descriptorCount = 1;
7888 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007889
7890 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007891 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7892 ds_layout_ci.bindingCount = 1;
7893 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007894
7895 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007896 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007897 ASSERT_VK_SUCCESS(err);
7898
7899 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007900 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007901 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007902 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007903 alloc_info.descriptorPool = ds_pool;
7904 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007905 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007906 ASSERT_VK_SUCCESS(err);
7907
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007908 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7909 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7910 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7911
7912 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7913 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7914 vi_ci.pNext = nullptr;
7915 vi_ci.vertexBindingDescriptionCount = 0;
7916 vi_ci.pVertexBindingDescriptions = nullptr;
7917 vi_ci.vertexAttributeDescriptionCount = 0;
7918 vi_ci.pVertexAttributeDescriptions = nullptr;
7919
7920 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7921 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7922 pipe_ms_state_ci.pNext = NULL;
7923 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7924 pipe_ms_state_ci.sampleShadingEnable = 0;
7925 pipe_ms_state_ci.minSampleShading = 1.0;
7926 pipe_ms_state_ci.pSampleMask = NULL;
7927
Tobin Ehlise68360f2015-10-01 11:15:13 -06007928 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007929 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7930 pipeline_layout_ci.setLayoutCount = 1;
7931 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007932
7933 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007934 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007935 ASSERT_VK_SUCCESS(err);
7936
7937 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7938 // Set scissor as dynamic to avoid second error
7939 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007940 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7941 dyn_state_ci.dynamicStateCount = 1;
7942 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007943
Cody Northropeb3a6c12015-10-05 14:44:45 -06007944 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007945 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007947 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007948 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7949 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007950 shaderStages[0] = vs.GetStageCreateInfo();
7951 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007952
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007953 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7954 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7955 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7956 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7957 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7958 rs_state_ci.depthClampEnable = VK_FALSE;
7959 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7960 rs_state_ci.depthBiasEnable = VK_FALSE;
7961
Tobin Ehlise68360f2015-10-01 11:15:13 -06007962 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007963 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7964 gp_ci.stageCount = 2;
7965 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007966 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007967 // Not setting VP state w/o dynamic vp state should cause validation error
7968 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007969 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007970 gp_ci.pVertexInputState = &vi_ci;
7971 gp_ci.pInputAssemblyState = &ia_ci;
7972 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007973 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7974 gp_ci.layout = pipeline_layout;
7975 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007976
7977 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007978 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007979
7980 VkPipeline pipeline;
7981 VkPipelineCache pipelineCache;
7982
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007983 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007984 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007985 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007986
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007987 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007988
Chia-I Wuf7458c52015-10-26 21:10:41 +08007989 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7990 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7991 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7992 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007993}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007994
7995// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7996// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007997TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7998 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007999
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008001
Tony Barbour1fa09702017-03-16 12:09:08 -06008002 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008003
8004 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008005 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008006 return;
8007 }
8008
Tobin Ehlise68360f2015-10-01 11:15:13 -06008009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008010
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008011 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008012 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8013 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008014
8015 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008016 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8017 ds_pool_ci.maxSets = 1;
8018 ds_pool_ci.poolSizeCount = 1;
8019 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008020
8021 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008022 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008023 ASSERT_VK_SUCCESS(err);
8024
8025 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008026 dsl_binding.binding = 0;
8027 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8028 dsl_binding.descriptorCount = 1;
8029 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008030
8031 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008032 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8033 ds_layout_ci.bindingCount = 1;
8034 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008035
8036 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008037 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008038 ASSERT_VK_SUCCESS(err);
8039
8040 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008041 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008042 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008043 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008044 alloc_info.descriptorPool = ds_pool;
8045 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008046 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008047 ASSERT_VK_SUCCESS(err);
8048
8049 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008050 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8051 pipeline_layout_ci.setLayoutCount = 1;
8052 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008053
8054 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008055 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008056 ASSERT_VK_SUCCESS(err);
8057
8058 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008059 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8060 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008061 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008062 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008063 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008064
8065 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8066 // Set scissor as dynamic to avoid that error
8067 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008068 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8069 dyn_state_ci.dynamicStateCount = 1;
8070 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008071
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008072 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8073 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8074 pipe_ms_state_ci.pNext = NULL;
8075 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8076 pipe_ms_state_ci.sampleShadingEnable = 0;
8077 pipe_ms_state_ci.minSampleShading = 1.0;
8078 pipe_ms_state_ci.pSampleMask = NULL;
8079
Cody Northropeb3a6c12015-10-05 14:44:45 -06008080 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008081 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008082
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008083 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008084 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8085 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008086 shaderStages[0] = vs.GetStageCreateInfo();
8087 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008088
Cody Northropf6622dc2015-10-06 10:33:21 -06008089 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8090 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8091 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008092 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008093 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008094 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008095 vi_ci.pVertexAttributeDescriptions = nullptr;
8096
8097 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8098 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8099 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8100
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008101 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008102 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008103 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008104 rs_ci.pNext = nullptr;
8105
Mark Youngc89c6312016-03-31 16:03:20 -06008106 VkPipelineColorBlendAttachmentState att = {};
8107 att.blendEnable = VK_FALSE;
8108 att.colorWriteMask = 0xf;
8109
Cody Northropf6622dc2015-10-06 10:33:21 -06008110 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8111 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8112 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008113 cb_ci.attachmentCount = 1;
8114 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008115
Tobin Ehlise68360f2015-10-01 11:15:13 -06008116 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008117 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8118 gp_ci.stageCount = 2;
8119 gp_ci.pStages = shaderStages;
8120 gp_ci.pVertexInputState = &vi_ci;
8121 gp_ci.pInputAssemblyState = &ia_ci;
8122 gp_ci.pViewportState = &vp_state_ci;
8123 gp_ci.pRasterizationState = &rs_ci;
8124 gp_ci.pColorBlendState = &cb_ci;
8125 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008126 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008127 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8128 gp_ci.layout = pipeline_layout;
8129 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008130
8131 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008132 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008133
8134 VkPipeline pipeline;
8135 VkPipelineCache pipelineCache;
8136
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008137 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008138 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008139 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008140
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008141 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008142
Tobin Ehlisd332f282015-10-02 11:00:56 -06008143 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008144 // First need to successfully create the PSO from above by setting
8145 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008147
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008148 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008149 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008150 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008151 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008152 m_commandBuffer->BeginCommandBuffer();
8153 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008154 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008155 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008156 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008157 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008158 Draw(1, 0, 0, 0);
8159
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008160 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008161
8162 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8163 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8164 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8165 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008166 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008167}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008168
8169// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008170// viewportCount
8171TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8172 VkResult err;
8173
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008174 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008175
Tony Barbour1fa09702017-03-16 12:09:08 -06008176 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008177
8178 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008179 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008180 return;
8181 }
8182
Karl Schultz6addd812016-02-02 17:17:23 -07008183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8184
8185 VkDescriptorPoolSize ds_type_count = {};
8186 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8187 ds_type_count.descriptorCount = 1;
8188
8189 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8190 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8191 ds_pool_ci.maxSets = 1;
8192 ds_pool_ci.poolSizeCount = 1;
8193 ds_pool_ci.pPoolSizes = &ds_type_count;
8194
8195 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008196 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008197 ASSERT_VK_SUCCESS(err);
8198
8199 VkDescriptorSetLayoutBinding dsl_binding = {};
8200 dsl_binding.binding = 0;
8201 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8202 dsl_binding.descriptorCount = 1;
8203 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8204
8205 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8206 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8207 ds_layout_ci.bindingCount = 1;
8208 ds_layout_ci.pBindings = &dsl_binding;
8209
8210 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008211 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008212 ASSERT_VK_SUCCESS(err);
8213
8214 VkDescriptorSet descriptorSet;
8215 VkDescriptorSetAllocateInfo alloc_info = {};
8216 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8217 alloc_info.descriptorSetCount = 1;
8218 alloc_info.descriptorPool = ds_pool;
8219 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008220 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008221 ASSERT_VK_SUCCESS(err);
8222
8223 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8224 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8225 pipeline_layout_ci.setLayoutCount = 1;
8226 pipeline_layout_ci.pSetLayouts = &ds_layout;
8227
8228 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008229 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008230 ASSERT_VK_SUCCESS(err);
8231
8232 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8233 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8234 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008235 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008236 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008237 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008238
8239 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8240 // Set scissor as dynamic to avoid that error
8241 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8242 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8243 dyn_state_ci.dynamicStateCount = 1;
8244 dyn_state_ci.pDynamicStates = &vp_state;
8245
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008246 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8247 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8248 pipe_ms_state_ci.pNext = NULL;
8249 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8250 pipe_ms_state_ci.sampleShadingEnable = 0;
8251 pipe_ms_state_ci.minSampleShading = 1.0;
8252 pipe_ms_state_ci.pSampleMask = NULL;
8253
Karl Schultz6addd812016-02-02 17:17:23 -07008254 VkPipelineShaderStageCreateInfo shaderStages[2];
8255 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8256
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008257 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008258 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8259 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008260 shaderStages[0] = vs.GetStageCreateInfo();
8261 shaderStages[1] = fs.GetStageCreateInfo();
8262
8263 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8264 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8265 vi_ci.pNext = nullptr;
8266 vi_ci.vertexBindingDescriptionCount = 0;
8267 vi_ci.pVertexBindingDescriptions = nullptr;
8268 vi_ci.vertexAttributeDescriptionCount = 0;
8269 vi_ci.pVertexAttributeDescriptions = nullptr;
8270
8271 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8272 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8273 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8274
8275 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8276 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008277 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008278 rs_ci.pNext = nullptr;
8279
Mark Youngc89c6312016-03-31 16:03:20 -06008280 VkPipelineColorBlendAttachmentState att = {};
8281 att.blendEnable = VK_FALSE;
8282 att.colorWriteMask = 0xf;
8283
Karl Schultz6addd812016-02-02 17:17:23 -07008284 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8285 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8286 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008287 cb_ci.attachmentCount = 1;
8288 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008289
8290 VkGraphicsPipelineCreateInfo gp_ci = {};
8291 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8292 gp_ci.stageCount = 2;
8293 gp_ci.pStages = shaderStages;
8294 gp_ci.pVertexInputState = &vi_ci;
8295 gp_ci.pInputAssemblyState = &ia_ci;
8296 gp_ci.pViewportState = &vp_state_ci;
8297 gp_ci.pRasterizationState = &rs_ci;
8298 gp_ci.pColorBlendState = &cb_ci;
8299 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008300 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008301 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8302 gp_ci.layout = pipeline_layout;
8303 gp_ci.renderPass = renderPass();
8304
8305 VkPipelineCacheCreateInfo pc_ci = {};
8306 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8307
8308 VkPipeline pipeline;
8309 VkPipelineCache pipelineCache;
8310
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008311 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008312 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008313 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008314
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008315 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008316
8317 // Now hit second fail case where we set scissor w/ different count than PSO
8318 // First need to successfully create the PSO from above by setting
8319 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8321 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008322
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008323 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008324 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008325 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008326 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008327 m_commandBuffer->BeginCommandBuffer();
8328 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008329 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008330 VkViewport viewports[1] = {};
8331 viewports[0].width = 8;
8332 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008333 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008334 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008335 Draw(1, 0, 0, 0);
8336
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008337 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008338
Chia-I Wuf7458c52015-10-26 21:10:41 +08008339 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8340 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8341 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8342 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008343 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008344}
8345
Mark Young7394fdd2016-03-31 14:56:43 -06008346TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8347 VkResult err;
8348
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008350
Tony Barbour1fa09702017-03-16 12:09:08 -06008351 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008352 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8353
8354 VkDescriptorPoolSize ds_type_count = {};
8355 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8356 ds_type_count.descriptorCount = 1;
8357
8358 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8359 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8360 ds_pool_ci.maxSets = 1;
8361 ds_pool_ci.poolSizeCount = 1;
8362 ds_pool_ci.pPoolSizes = &ds_type_count;
8363
8364 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008365 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008366 ASSERT_VK_SUCCESS(err);
8367
8368 VkDescriptorSetLayoutBinding dsl_binding = {};
8369 dsl_binding.binding = 0;
8370 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8371 dsl_binding.descriptorCount = 1;
8372 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8373
8374 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8375 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8376 ds_layout_ci.bindingCount = 1;
8377 ds_layout_ci.pBindings = &dsl_binding;
8378
8379 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008380 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008381 ASSERT_VK_SUCCESS(err);
8382
8383 VkDescriptorSet descriptorSet;
8384 VkDescriptorSetAllocateInfo alloc_info = {};
8385 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8386 alloc_info.descriptorSetCount = 1;
8387 alloc_info.descriptorPool = ds_pool;
8388 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008389 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008390 ASSERT_VK_SUCCESS(err);
8391
8392 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8393 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8394 pipeline_layout_ci.setLayoutCount = 1;
8395 pipeline_layout_ci.pSetLayouts = &ds_layout;
8396
8397 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008398 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008399 ASSERT_VK_SUCCESS(err);
8400
8401 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8402 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8403 vp_state_ci.scissorCount = 1;
8404 vp_state_ci.pScissors = NULL;
8405 vp_state_ci.viewportCount = 1;
8406 vp_state_ci.pViewports = NULL;
8407
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008408 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008409 // Set scissor as dynamic to avoid that error
8410 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8411 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8412 dyn_state_ci.dynamicStateCount = 2;
8413 dyn_state_ci.pDynamicStates = dynamic_states;
8414
8415 VkPipelineShaderStageCreateInfo shaderStages[2];
8416 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8417
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008418 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8419 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008420 this); // TODO - We shouldn't need a fragment shader
8421 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008422 shaderStages[0] = vs.GetStageCreateInfo();
8423 shaderStages[1] = fs.GetStageCreateInfo();
8424
8425 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8426 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8427 vi_ci.pNext = nullptr;
8428 vi_ci.vertexBindingDescriptionCount = 0;
8429 vi_ci.pVertexBindingDescriptions = nullptr;
8430 vi_ci.vertexAttributeDescriptionCount = 0;
8431 vi_ci.pVertexAttributeDescriptions = nullptr;
8432
8433 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8434 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8435 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8436
8437 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8438 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8439 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008440 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008441
Mark Young47107952016-05-02 15:59:55 -06008442 // Check too low (line width of -1.0f).
8443 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008444
8445 VkPipelineColorBlendAttachmentState att = {};
8446 att.blendEnable = VK_FALSE;
8447 att.colorWriteMask = 0xf;
8448
8449 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8450 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8451 cb_ci.pNext = nullptr;
8452 cb_ci.attachmentCount = 1;
8453 cb_ci.pAttachments = &att;
8454
8455 VkGraphicsPipelineCreateInfo gp_ci = {};
8456 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8457 gp_ci.stageCount = 2;
8458 gp_ci.pStages = shaderStages;
8459 gp_ci.pVertexInputState = &vi_ci;
8460 gp_ci.pInputAssemblyState = &ia_ci;
8461 gp_ci.pViewportState = &vp_state_ci;
8462 gp_ci.pRasterizationState = &rs_ci;
8463 gp_ci.pColorBlendState = &cb_ci;
8464 gp_ci.pDynamicState = &dyn_state_ci;
8465 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8466 gp_ci.layout = pipeline_layout;
8467 gp_ci.renderPass = renderPass();
8468
8469 VkPipelineCacheCreateInfo pc_ci = {};
8470 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8471
8472 VkPipeline pipeline;
8473 VkPipelineCache pipelineCache;
8474
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008475 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008476 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008477 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008478
8479 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008480 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008481
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008483
8484 // Check too high (line width of 65536.0f).
8485 rs_ci.lineWidth = 65536.0f;
8486
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008487 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008488 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008489 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008490
8491 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008492 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008493
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008495
8496 dyn_state_ci.dynamicStateCount = 3;
8497
8498 rs_ci.lineWidth = 1.0f;
8499
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008500 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008501 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008502 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008503 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008504 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008505
8506 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008507 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008508 m_errorMonitor->VerifyFound();
8509
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008511
8512 // Check too high with dynamic setting.
8513 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8514 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008515 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008516
8517 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8518 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8519 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8520 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008521 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008522}
8523
Karl Schultz6addd812016-02-02 17:17:23 -07008524TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008525 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008527 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008528
Tony Barbour1fa09702017-03-16 12:09:08 -06008529 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008530 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008531
Tony Barbour552f6c02016-12-21 14:34:07 -07008532 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008533 // Don't care about RenderPass handle b/c error should be flagged before
8534 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008535 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008536
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008537 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008538}
8539
Karl Schultz6addd812016-02-02 17:17:23 -07008540TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008541 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8543 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008544
Tony Barbour1fa09702017-03-16 12:09:08 -06008545 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008547
Tony Barbour552f6c02016-12-21 14:34:07 -07008548 m_commandBuffer->BeginCommandBuffer();
8549 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008550 // Just create a dummy Renderpass that's non-NULL so we can get to the
8551 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008552 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008553
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008554 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008555}
8556
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008557TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008558 TEST_DESCRIPTION(
8559 "Begin a renderPass where clearValueCount is less than"
8560 "the number of renderPass attachments that use loadOp"
8561 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008562
Tony Barbour1fa09702017-03-16 12:09:08 -06008563 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008564 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8565
8566 // Create a renderPass with a single attachment that uses loadOp CLEAR
8567 VkAttachmentReference attach = {};
8568 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8569 VkSubpassDescription subpass = {};
8570 subpass.inputAttachmentCount = 1;
8571 subpass.pInputAttachments = &attach;
8572 VkRenderPassCreateInfo rpci = {};
8573 rpci.subpassCount = 1;
8574 rpci.pSubpasses = &subpass;
8575 rpci.attachmentCount = 1;
8576 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008577 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008578 // Set loadOp to CLEAR
8579 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8580 rpci.pAttachments = &attach_desc;
8581 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8582 VkRenderPass rp;
8583 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8584
8585 VkCommandBufferInheritanceInfo hinfo = {};
8586 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8587 hinfo.renderPass = VK_NULL_HANDLE;
8588 hinfo.subpass = 0;
8589 hinfo.framebuffer = VK_NULL_HANDLE;
8590 hinfo.occlusionQueryEnable = VK_FALSE;
8591 hinfo.queryFlags = 0;
8592 hinfo.pipelineStatistics = 0;
8593 VkCommandBufferBeginInfo info = {};
8594 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8595 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8596 info.pInheritanceInfo = &hinfo;
8597
8598 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8599 VkRenderPassBeginInfo rp_begin = {};
8600 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8601 rp_begin.pNext = NULL;
8602 rp_begin.renderPass = renderPass();
8603 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008604 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008605
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008607
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008608 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008609
8610 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008611
8612 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008613}
8614
Slawomir Cygan0808f392016-11-28 17:53:23 +01008615TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008616 TEST_DESCRIPTION(
8617 "Begin a renderPass where clearValueCount is greater than"
8618 "the number of renderPass attachments that use loadOp"
8619 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008620
Tony Barbour1fa09702017-03-16 12:09:08 -06008621 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008622 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8623
8624 // Create a renderPass with a single attachment that uses loadOp CLEAR
8625 VkAttachmentReference attach = {};
8626 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8627 VkSubpassDescription subpass = {};
8628 subpass.inputAttachmentCount = 1;
8629 subpass.pInputAttachments = &attach;
8630 VkRenderPassCreateInfo rpci = {};
8631 rpci.subpassCount = 1;
8632 rpci.pSubpasses = &subpass;
8633 rpci.attachmentCount = 1;
8634 VkAttachmentDescription attach_desc = {};
8635 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8636 // Set loadOp to CLEAR
8637 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8638 rpci.pAttachments = &attach_desc;
8639 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8640 VkRenderPass rp;
8641 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8642
8643 VkCommandBufferBeginInfo info = {};
8644 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8645 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8646
8647 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8648 VkRenderPassBeginInfo rp_begin = {};
8649 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8650 rp_begin.pNext = NULL;
8651 rp_begin.renderPass = renderPass();
8652 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008653 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008654
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8656 " has a clearValueCount of"
8657 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008658
8659 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8660
8661 m_errorMonitor->VerifyFound();
8662
8663 vkDestroyRenderPass(m_device->device(), rp, NULL);
8664}
8665
Cody Northrop3bb4d962016-05-09 16:15:57 -06008666TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008667 TEST_DESCRIPTION("End a command buffer with an active render pass");
8668
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8670 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008671
Tony Barbour1fa09702017-03-16 12:09:08 -06008672 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008673 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8674
Tony Barbour552f6c02016-12-21 14:34:07 -07008675 m_commandBuffer->BeginCommandBuffer();
8676 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8677 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008678
8679 m_errorMonitor->VerifyFound();
8680
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008681 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8682 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008683}
8684
Karl Schultz6addd812016-02-02 17:17:23 -07008685TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008686 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8688 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008689
Tony Barbour1fa09702017-03-16 12:09:08 -06008690 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008691 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008692
Tony Barbour552f6c02016-12-21 14:34:07 -07008693 m_commandBuffer->BeginCommandBuffer();
8694 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008695
8696 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008697 vk_testing::Buffer dstBuffer;
8698 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008699
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008700 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008701
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008702 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008703}
8704
Karl Schultz6addd812016-02-02 17:17:23 -07008705TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008706 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8708 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008709
Tony Barbour1fa09702017-03-16 12:09:08 -06008710 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008712
Tony Barbour552f6c02016-12-21 14:34:07 -07008713 m_commandBuffer->BeginCommandBuffer();
8714 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008715
8716 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008717 vk_testing::Buffer dstBuffer;
8718 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008719
Karl Schultz6addd812016-02-02 17:17:23 -07008720 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008721 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8722 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8723 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008724
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008725 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008726}
8727
Karl Schultz6addd812016-02-02 17:17:23 -07008728TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008729 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8731 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008732
Tony Barbour1fa09702017-03-16 12:09:08 -06008733 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008734 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008735
Tony Barbour552f6c02016-12-21 14:34:07 -07008736 m_commandBuffer->BeginCommandBuffer();
8737 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008738
Michael Lentine0a369f62016-02-03 16:51:46 -06008739 VkClearColorValue clear_color;
8740 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008741 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8742 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8743 const int32_t tex_width = 32;
8744 const int32_t tex_height = 32;
8745 VkImageCreateInfo image_create_info = {};
8746 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8747 image_create_info.pNext = NULL;
8748 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8749 image_create_info.format = tex_format;
8750 image_create_info.extent.width = tex_width;
8751 image_create_info.extent.height = tex_height;
8752 image_create_info.extent.depth = 1;
8753 image_create_info.mipLevels = 1;
8754 image_create_info.arrayLayers = 1;
8755 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8756 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008757 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008758
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008759 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008760 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008761
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008762 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008763
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008764 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008765
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008766 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008767}
8768
Karl Schultz6addd812016-02-02 17:17:23 -07008769TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008770 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8772 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008773
Tony Barbour1fa09702017-03-16 12:09:08 -06008774 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008775 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008776
Dave Houlton1d2022c2017-03-29 11:43:58 -06008777 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008778 if (!depth_format) {
8779 printf(" No Depth + Stencil format found. Skipped.\n");
8780 return;
8781 }
8782
Tony Barbour552f6c02016-12-21 14:34:07 -07008783 m_commandBuffer->BeginCommandBuffer();
8784 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008785
8786 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008787 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008788 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8789 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008790 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008791 image_create_info.extent.width = 64;
8792 image_create_info.extent.height = 64;
8793 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8794 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008795
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008796 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008797 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008798
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008799 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008800
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008801 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8802 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008803
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008804 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008805}
8806
Karl Schultz6addd812016-02-02 17:17:23 -07008807TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008808 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008809 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008810
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8812 "vkCmdClearAttachments(): This call "
8813 "must be issued inside an active "
8814 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008815
Tony Barbour1fa09702017-03-16 12:09:08 -06008816 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008817 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008818
8819 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008820 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008821 ASSERT_VK_SUCCESS(err);
8822
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008823 VkClearAttachment color_attachment;
8824 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8825 color_attachment.clearValue.color.float32[0] = 0;
8826 color_attachment.clearValue.color.float32[1] = 0;
8827 color_attachment.clearValue.color.float32[2] = 0;
8828 color_attachment.clearValue.color.float32[3] = 0;
8829 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008830 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008831 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008832
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008833 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008834}
8835
Chris Forbes3b97e932016-09-07 11:29:24 +12008836TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008837 TEST_DESCRIPTION(
8838 "Test that an error is produced when CmdNextSubpass is "
8839 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008840
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8842 "vkCmdNextSubpass(): Attempted to advance "
8843 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008844
Tony Barbour1fa09702017-03-16 12:09:08 -06008845 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008846 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8847
Tony Barbour552f6c02016-12-21 14:34:07 -07008848 m_commandBuffer->BeginCommandBuffer();
8849 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008850
8851 // error here.
8852 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8853 m_errorMonitor->VerifyFound();
8854
Tony Barbour552f6c02016-12-21 14:34:07 -07008855 m_commandBuffer->EndRenderPass();
8856 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008857}
8858
Chris Forbes6d624702016-09-07 13:57:05 +12008859TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008860 TEST_DESCRIPTION(
8861 "Test that an error is produced when CmdEndRenderPass is "
8862 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008863
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8865 "vkCmdEndRenderPass(): Called before reaching "
8866 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008867
Tony Barbour1fa09702017-03-16 12:09:08 -06008868 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008869 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8870 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008871
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008872 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008873
8874 VkRenderPass rp;
8875 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8876 ASSERT_VK_SUCCESS(err);
8877
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008878 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008879
8880 VkFramebuffer fb;
8881 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8882 ASSERT_VK_SUCCESS(err);
8883
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008884 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008885
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008886 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008887
8888 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8889
8890 // Error here.
8891 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8892 m_errorMonitor->VerifyFound();
8893
8894 // Clean up.
8895 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8896 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8897}
8898
Karl Schultz9e66a292016-04-21 15:57:51 -06008899TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8900 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8902 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008903
Tony Barbour1fa09702017-03-16 12:09:08 -06008904 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008905 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008906
8907 VkBufferMemoryBarrier buf_barrier = {};
8908 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8909 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8910 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8911 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8912 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8913 buf_barrier.buffer = VK_NULL_HANDLE;
8914 buf_barrier.offset = 0;
8915 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008916 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8917 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008918
8919 m_errorMonitor->VerifyFound();
8920}
8921
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008922TEST_F(VkLayerTest, InvalidBarriers) {
8923 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8924
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008926
Tony Barbour1fa09702017-03-16 12:09:08 -06008927 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06008928 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008929 if (!depth_format) {
8930 printf(" No Depth + Stencil format found. Skipped.\n");
8931 return;
8932 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8934
8935 VkMemoryBarrier mem_barrier = {};
8936 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8937 mem_barrier.pNext = NULL;
8938 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8939 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008940 m_commandBuffer->BeginCommandBuffer();
8941 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008942 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008943 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008944 &mem_barrier, 0, nullptr, 0, nullptr);
8945 m_errorMonitor->VerifyFound();
8946
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008948 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008949 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008950 ASSERT_TRUE(image.initialized());
8951 VkImageMemoryBarrier img_barrier = {};
8952 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8953 img_barrier.pNext = NULL;
8954 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8955 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8956 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8957 // New layout can't be UNDEFINED
8958 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8959 img_barrier.image = image.handle();
8960 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8961 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8962 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8963 img_barrier.subresourceRange.baseArrayLayer = 0;
8964 img_barrier.subresourceRange.baseMipLevel = 0;
8965 img_barrier.subresourceRange.layerCount = 1;
8966 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008967 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8968 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008969 m_errorMonitor->VerifyFound();
8970 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8971
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8973 "Subresource must have the sum of the "
8974 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008975 // baseArrayLayer + layerCount must be <= image's arrayLayers
8976 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008977 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8978 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008979 m_errorMonitor->VerifyFound();
8980 img_barrier.subresourceRange.baseArrayLayer = 0;
8981
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008983 // baseMipLevel + levelCount must be <= image's mipLevels
8984 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008985 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8986 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008987 m_errorMonitor->VerifyFound();
8988 img_barrier.subresourceRange.baseMipLevel = 0;
8989
Mike Weiblen7053aa32017-01-25 15:21:10 -07008990 // levelCount must be non-zero.
8991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8992 img_barrier.subresourceRange.levelCount = 0;
8993 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8994 nullptr, 0, nullptr, 1, &img_barrier);
8995 m_errorMonitor->VerifyFound();
8996 img_barrier.subresourceRange.levelCount = 1;
8997
8998 // layerCount must be non-zero.
8999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9000 img_barrier.subresourceRange.layerCount = 0;
9001 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9002 nullptr, 0, nullptr, 1, &img_barrier);
9003 m_errorMonitor->VerifyFound();
9004 img_barrier.subresourceRange.layerCount = 1;
9005
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009007 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009008 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9009 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009010 VkBufferMemoryBarrier buf_barrier = {};
9011 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9012 buf_barrier.pNext = NULL;
9013 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9014 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9015 buf_barrier.buffer = buffer.handle();
9016 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9017 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9018 buf_barrier.offset = 0;
9019 buf_barrier.size = VK_WHOLE_SIZE;
9020 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009021 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9022 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009023 m_errorMonitor->VerifyFound();
9024 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009027 buf_barrier.offset = 257;
9028 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009029 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9030 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009031 m_errorMonitor->VerifyFound();
9032 buf_barrier.offset = 0;
9033
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009035 buf_barrier.size = 257;
9036 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009037 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9038 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009039 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009040
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009041 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009042 m_errorMonitor->SetDesiredFailureMsg(
9043 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009044 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009045 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009046 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009047 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009048 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9049 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009050 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009051
9052 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009053 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009054 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9055 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009056 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009057
9058 // Having anything other than DEPTH or STENCIL is an error
9059 m_errorMonitor->SetDesiredFailureMsg(
9060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9061 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9062 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9063 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9064 nullptr, 0, nullptr, 1, &img_barrier);
9065 m_errorMonitor->VerifyFound();
9066
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009067 // Now test depth-only
9068 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009069 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9070 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009071 VkDepthStencilObj d_image(m_device);
9072 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9073 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009074 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009075 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009076 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009077
9078 // DEPTH bit must be set
9079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9080 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009081 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009082 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9083 0, nullptr, 0, nullptr, 1, &img_barrier);
9084 m_errorMonitor->VerifyFound();
9085
9086 // No bits other than DEPTH may be set
9087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9088 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9089 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009090 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9091 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009092 m_errorMonitor->VerifyFound();
9093 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009094
9095 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009096 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9097 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009098 VkDepthStencilObj s_image(m_device);
9099 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9100 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009101 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009102 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009103 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009104 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9106 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009107 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009108 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9109 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009110 m_errorMonitor->VerifyFound();
9111 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009112
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009113 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009114 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009115 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009116 ASSERT_TRUE(c_image.initialized());
9117 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9118 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9119 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009120
9121 // COLOR bit must be set
9122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9123 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009124 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009125 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9126 nullptr, 0, nullptr, 1, &img_barrier);
9127 m_errorMonitor->VerifyFound();
9128
9129 // No bits other than COLOR may be set
9130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9131 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9132 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009133 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9134 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009135 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009136
Mike Weiblene6e01172017-03-07 22:18:40 -07009137 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9138 {
9139 VkImageObj img_color(m_device);
9140 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9141 ASSERT_TRUE(img_color.initialized());
9142
9143 VkImageObj img_ds(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -06009144 img_ds.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009145 ASSERT_TRUE(img_ds.initialized());
9146
9147 VkImageObj img_xfer_src(m_device);
9148 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
9149 ASSERT_TRUE(img_xfer_src.initialized());
9150
9151 VkImageObj img_xfer_dst(m_device);
9152 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9153 ASSERT_TRUE(img_xfer_dst.initialized());
9154
9155 VkImageObj img_sampled(m_device);
9156 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
9157 ASSERT_TRUE(img_sampled.initialized());
9158
9159 VkImageObj img_input(m_device);
9160 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9161 ASSERT_TRUE(img_input.initialized());
9162
9163 const struct {
9164 VkImageObj &image_obj;
9165 VkImageLayout bad_layout;
9166 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9167 } bad_buffer_layouts[] = {
9168 // clang-format off
9169 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9170 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9171 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9172 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9173 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9174 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9175 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9176 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9177 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9178 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9179 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9180 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9181 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9182 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9183 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9184 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9185 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9186 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9187 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9188 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9189 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9190 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9191 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9192 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9193 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9194 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9195 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9196 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9197 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9198 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9199 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9200 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9201 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9202 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9203 // clang-format on
9204 };
9205 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9206
9207 for (uint32_t i = 0; i < layout_count; ++i) {
9208 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9209 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9210 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9211 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9212 : VK_IMAGE_ASPECT_COLOR_BIT;
9213
9214 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9215 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9217 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9218 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9219 m_errorMonitor->VerifyFound();
9220
9221 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9222 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9224 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9225 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9226 m_errorMonitor->VerifyFound();
9227 }
9228
9229 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9230 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9231 }
9232
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009233 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9234
9235 // Create command pool with incompatible queueflags
9236 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009237 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009238 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009239 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009240 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009241 }
9242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9243
9244 VkCommandPool command_pool;
9245 VkCommandPoolCreateInfo pool_create_info{};
9246 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9247 pool_create_info.queueFamilyIndex = queue_family_index;
9248 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9249 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9250
9251 // Allocate a command buffer
9252 VkCommandBuffer bad_command_buffer;
9253 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9254 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9255 command_buffer_allocate_info.commandPool = command_pool;
9256 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9257 command_buffer_allocate_info.commandBufferCount = 1;
9258 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9259
9260 VkCommandBufferBeginInfo cbbi = {};
9261 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9262 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9263 buf_barrier.offset = 0;
9264 buf_barrier.size = VK_WHOLE_SIZE;
9265 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9266 &buf_barrier, 0, nullptr);
9267 m_errorMonitor->VerifyFound();
9268
9269 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9270 vkEndCommandBuffer(bad_command_buffer);
9271 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009272 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009273 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009274 }
9275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9276 VkEvent event;
9277 VkEventCreateInfo event_create_info{};
9278 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9279 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9280 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9281 nullptr, 0, nullptr);
9282 m_errorMonitor->VerifyFound();
9283
9284 vkEndCommandBuffer(bad_command_buffer);
9285 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009286}
9287
Tony Barbour18ba25c2016-09-29 13:42:40 -06009288TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9289 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9290
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009292 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009293 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -07009294 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
9295 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009296 ASSERT_TRUE(image.initialized());
9297
9298 VkImageMemoryBarrier barrier = {};
9299 VkImageSubresourceRange range;
9300 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9301 barrier.srcAccessMask = 0;
9302 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9303 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9304 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9305 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9306 barrier.image = image.handle();
9307 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9308 range.baseMipLevel = 0;
9309 range.levelCount = 1;
9310 range.baseArrayLayer = 0;
9311 range.layerCount = 1;
9312 barrier.subresourceRange = range;
9313 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9314 cmdbuf.BeginCommandBuffer();
9315 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9316 &barrier);
9317 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9318 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9319 barrier.srcAccessMask = 0;
9320 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9321 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9322 &barrier);
9323
9324 m_errorMonitor->VerifyFound();
9325}
9326
Karl Schultz6addd812016-02-02 17:17:23 -07009327TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009328 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009329 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009330 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009331
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009332 uint32_t const indices[] = {0};
9333 VkBufferCreateInfo buf_info = {};
9334 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9335 buf_info.size = 1024;
9336 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9337 buf_info.queueFamilyIndexCount = 1;
9338 buf_info.pQueueFamilyIndices = indices;
9339
9340 VkBuffer buffer;
9341 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9342 ASSERT_VK_SUCCESS(err);
9343
9344 VkMemoryRequirements requirements;
9345 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9346
9347 VkMemoryAllocateInfo alloc_info{};
9348 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9349 alloc_info.pNext = NULL;
9350 alloc_info.memoryTypeIndex = 0;
9351 alloc_info.allocationSize = requirements.size;
9352 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9353 ASSERT_TRUE(pass);
9354
9355 VkDeviceMemory memory;
9356 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9357 ASSERT_VK_SUCCESS(err);
9358
9359 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009360 ASSERT_VK_SUCCESS(err);
9361
Tony Barbour552f6c02016-12-21 14:34:07 -07009362 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009363 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009364
Karl Schultz6addd812016-02-02 17:17:23 -07009365 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9366 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009367 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9369 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009370 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009371
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009372 vkFreeMemory(m_device->device(), memory, NULL);
9373 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009374}
9375
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009376TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9377 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009378 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009379 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9380 VkBufferCreateInfo buffCI = {};
9381 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9382 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009383 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009384 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009385 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009386 uint32_t qfi[2];
9387 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009388 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009389
9390 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009391 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009392
9393 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9395 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9396 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009397 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009398 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009399
9400 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009401 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9403
9404 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9405 buffCI.queueFamilyIndexCount = 2;
9406 qfi[0] = 1;
9407 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009408 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009409 VkDeviceMemory mem;
9410 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009411 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009412
9413 VkMemoryAllocateInfo alloc_info = {};
9414 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9415 alloc_info.allocationSize = 1024;
9416 bool pass = false;
9417 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9418 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009419 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009420 return;
9421 }
9422 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009423 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009424
9425 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009426 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009427 m_commandBuffer->end();
9428 QueueCommandBuffer(false);
9429 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009430 vkDestroyBuffer(m_device->device(), ib2, NULL);
9431 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009432 }
9433
Tony Barbourdf4c0042016-06-01 15:55:43 -06009434 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009435}
9436
Karl Schultz6addd812016-02-02 17:17:23 -07009437TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009438 TEST_DESCRIPTION(
9439 "Attempt vkCmdExecuteCommands with a primary command buffer"
9440 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009441
Tony Barbour1fa09702017-03-16 12:09:08 -06009442 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009444
Chris Forbesf29a84f2016-10-06 18:39:28 +13009445 // An empty primary command buffer
9446 VkCommandBufferObj cb(m_device, m_commandPool);
9447 cb.BeginCommandBuffer();
9448 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009449
Chris Forbesf29a84f2016-10-06 18:39:28 +13009450 m_commandBuffer->BeginCommandBuffer();
9451 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9452 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009453
Chris Forbesf29a84f2016-10-06 18:39:28 +13009454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9455 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009456 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009457
9458 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009459}
9460
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009461TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009462 TEST_DESCRIPTION(
9463 "Attempt to update descriptor sets for images and buffers "
9464 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009465 VkResult err;
9466
Tony Barbour1fa09702017-03-16 12:09:08 -06009467 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009468 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9469 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9470 ds_type_count[i].type = VkDescriptorType(i);
9471 ds_type_count[i].descriptorCount = 1;
9472 }
9473 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9474 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9475 ds_pool_ci.pNext = NULL;
9476 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9477 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9478 ds_pool_ci.pPoolSizes = ds_type_count;
9479
9480 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009481 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009482 ASSERT_VK_SUCCESS(err);
9483
9484 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009485 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009486 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9487 dsl_binding[i].binding = 0;
9488 dsl_binding[i].descriptorType = VkDescriptorType(i);
9489 dsl_binding[i].descriptorCount = 1;
9490 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9491 dsl_binding[i].pImmutableSamplers = NULL;
9492 }
9493
9494 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9495 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9496 ds_layout_ci.pNext = NULL;
9497 ds_layout_ci.bindingCount = 1;
9498 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9499 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9500 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009501 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009502 ASSERT_VK_SUCCESS(err);
9503 }
9504 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9505 VkDescriptorSetAllocateInfo alloc_info = {};
9506 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9507 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9508 alloc_info.descriptorPool = ds_pool;
9509 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009510 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009511 ASSERT_VK_SUCCESS(err);
9512
9513 // Create a buffer & bufferView to be used for invalid updates
9514 VkBufferCreateInfo buff_ci = {};
9515 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009516 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009517 buff_ci.size = 256;
9518 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009519 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009520 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9521 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009522
9523 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9524 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9525 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9526 ASSERT_VK_SUCCESS(err);
9527
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009528 VkMemoryRequirements mem_reqs;
9529 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9530 VkMemoryAllocateInfo mem_alloc_info = {};
9531 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9532 mem_alloc_info.pNext = NULL;
9533 mem_alloc_info.memoryTypeIndex = 0;
9534 mem_alloc_info.allocationSize = mem_reqs.size;
9535 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9536 if (!pass) {
9537 vkDestroyBuffer(m_device->device(), buffer, NULL);
9538 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9539 return;
9540 }
9541 VkDeviceMemory mem;
9542 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9543 ASSERT_VK_SUCCESS(err);
9544 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9545 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009546
9547 VkBufferViewCreateInfo buff_view_ci = {};
9548 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9549 buff_view_ci.buffer = buffer;
9550 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9551 buff_view_ci.range = VK_WHOLE_SIZE;
9552 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009553 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009554 ASSERT_VK_SUCCESS(err);
9555
Tony Barbour415497c2017-01-24 10:06:09 -07009556 // Now get resources / view for storage_texel_buffer
9557 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9558 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9559 if (!pass) {
9560 vkDestroyBuffer(m_device->device(), buffer, NULL);
9561 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9562 vkFreeMemory(m_device->device(), mem, NULL);
9563 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9564 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9565 return;
9566 }
9567 VkDeviceMemory storage_texel_buffer_mem;
9568 VkBufferView storage_texel_buffer_view;
9569 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9570 ASSERT_VK_SUCCESS(err);
9571 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9572 ASSERT_VK_SUCCESS(err);
9573 buff_view_ci.buffer = storage_texel_buffer;
9574 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9575 ASSERT_VK_SUCCESS(err);
9576
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009577 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009578 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009579 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009580 image_ci.format = VK_FORMAT_UNDEFINED;
9581 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9582 VkFormat format = static_cast<VkFormat>(f);
9583 VkFormatProperties fProps = m_device->format_properties(format);
9584 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9585 image_ci.format = format;
9586 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9587 break;
9588 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9589 image_ci.format = format;
9590 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9591 break;
9592 }
9593 }
9594 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9595 return;
9596 }
9597
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009598 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9599 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009600 image_ci.extent.width = 64;
9601 image_ci.extent.height = 64;
9602 image_ci.extent.depth = 1;
9603 image_ci.mipLevels = 1;
9604 image_ci.arrayLayers = 1;
9605 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009606 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009607 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009608 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9609 VkImage image;
9610 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9611 ASSERT_VK_SUCCESS(err);
9612 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009613 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009614
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009615 VkMemoryAllocateInfo mem_alloc = {};
9616 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9617 mem_alloc.pNext = NULL;
9618 mem_alloc.allocationSize = 0;
9619 mem_alloc.memoryTypeIndex = 0;
9620 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9621 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009622 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009623 ASSERT_TRUE(pass);
9624 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9625 ASSERT_VK_SUCCESS(err);
9626 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9627 ASSERT_VK_SUCCESS(err);
9628 // Now create view for image
9629 VkImageViewCreateInfo image_view_ci = {};
9630 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9631 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009632 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009633 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9634 image_view_ci.subresourceRange.layerCount = 1;
9635 image_view_ci.subresourceRange.baseArrayLayer = 0;
9636 image_view_ci.subresourceRange.levelCount = 1;
9637 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9638 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009639 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009640 ASSERT_VK_SUCCESS(err);
9641
9642 VkDescriptorBufferInfo buff_info = {};
9643 buff_info.buffer = buffer;
9644 VkDescriptorImageInfo img_info = {};
9645 img_info.imageView = image_view;
9646 VkWriteDescriptorSet descriptor_write = {};
9647 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9648 descriptor_write.dstBinding = 0;
9649 descriptor_write.descriptorCount = 1;
9650 descriptor_write.pTexelBufferView = &buff_view;
9651 descriptor_write.pBufferInfo = &buff_info;
9652 descriptor_write.pImageInfo = &img_info;
9653
9654 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009655 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009656 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9657 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9658 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9659 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9660 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9661 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9662 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9663 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9664 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9665 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9666 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009667 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009668 // Start loop at 1 as SAMPLER desc type has no usage bit error
9669 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009670 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9671 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9672 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9673 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009674 descriptor_write.descriptorType = VkDescriptorType(i);
9675 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009677
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009678 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009679
9680 m_errorMonitor->VerifyFound();
9681 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009682 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9683 descriptor_write.pTexelBufferView = &buff_view;
9684 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009685 }
Tony Barbour415497c2017-01-24 10:06:09 -07009686
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009687 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9688 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009689 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009690 vkDestroyImageView(m_device->device(), image_view, NULL);
9691 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009692 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009693 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009694 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009695 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009696 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009697 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9698}
9699
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009700TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009701 TEST_DESCRIPTION(
9702 "Attempt to update buffer descriptor set that has incorrect "
9703 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009704 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009705 "2. range value of 0\n"
9706 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009707 VkResult err;
9708
Tony Barbour1fa09702017-03-16 12:09:08 -06009709 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009710 VkDescriptorPoolSize ds_type_count = {};
9711 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9712 ds_type_count.descriptorCount = 1;
9713
9714 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9715 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9716 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009717 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009718 ds_pool_ci.maxSets = 1;
9719 ds_pool_ci.poolSizeCount = 1;
9720 ds_pool_ci.pPoolSizes = &ds_type_count;
9721
9722 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009723 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009724 ASSERT_VK_SUCCESS(err);
9725
9726 // Create layout with single uniform buffer descriptor
9727 VkDescriptorSetLayoutBinding dsl_binding = {};
9728 dsl_binding.binding = 0;
9729 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9730 dsl_binding.descriptorCount = 1;
9731 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9732 dsl_binding.pImmutableSamplers = NULL;
9733
9734 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9735 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9736 ds_layout_ci.pNext = NULL;
9737 ds_layout_ci.bindingCount = 1;
9738 ds_layout_ci.pBindings = &dsl_binding;
9739 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009740 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009741 ASSERT_VK_SUCCESS(err);
9742
9743 VkDescriptorSet descriptor_set = {};
9744 VkDescriptorSetAllocateInfo alloc_info = {};
9745 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9746 alloc_info.descriptorSetCount = 1;
9747 alloc_info.descriptorPool = ds_pool;
9748 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009749 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009750 ASSERT_VK_SUCCESS(err);
9751
9752 // Create a buffer to be used for invalid updates
9753 VkBufferCreateInfo buff_ci = {};
9754 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9755 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009756 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009757 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9758 VkBuffer buffer;
9759 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9760 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009761
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009762 // Have to bind memory to buffer before descriptor update
9763 VkMemoryAllocateInfo mem_alloc = {};
9764 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9765 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009766 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009767 mem_alloc.memoryTypeIndex = 0;
9768
9769 VkMemoryRequirements mem_reqs;
9770 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009771 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009772 if (!pass) {
9773 vkDestroyBuffer(m_device->device(), buffer, NULL);
9774 return;
9775 }
9776
9777 VkDeviceMemory mem;
9778 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9779 ASSERT_VK_SUCCESS(err);
9780 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9781 ASSERT_VK_SUCCESS(err);
9782
9783 VkDescriptorBufferInfo buff_info = {};
9784 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009785 // Cause error due to offset out of range
9786 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009787 buff_info.range = VK_WHOLE_SIZE;
9788 VkWriteDescriptorSet descriptor_write = {};
9789 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9790 descriptor_write.dstBinding = 0;
9791 descriptor_write.descriptorCount = 1;
9792 descriptor_write.pTexelBufferView = nullptr;
9793 descriptor_write.pBufferInfo = &buff_info;
9794 descriptor_write.pImageInfo = nullptr;
9795
9796 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9797 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009799
9800 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9801
9802 m_errorMonitor->VerifyFound();
9803 // Now cause error due to range of 0
9804 buff_info.offset = 0;
9805 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009807
9808 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9809
9810 m_errorMonitor->VerifyFound();
9811 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009812 buff_info.offset = 0;
9813 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009815
9816 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9817
9818 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009819 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009820 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9821 vkDestroyBuffer(m_device->device(), buffer, NULL);
9822 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9823 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9824}
9825
Tobin Ehlis845887e2017-02-02 19:01:44 -07009826TEST_F(VkLayerTest, DSBufferLimitErrors) {
9827 TEST_DESCRIPTION(
9828 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9829 "Test cases include:\n"
9830 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9831 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9832 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9833 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9834 VkResult err;
9835
Tony Barbour1fa09702017-03-16 12:09:08 -06009836 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009837 VkDescriptorPoolSize ds_type_count[2] = {};
9838 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9839 ds_type_count[0].descriptorCount = 1;
9840 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9841 ds_type_count[1].descriptorCount = 1;
9842
9843 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9844 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9845 ds_pool_ci.pNext = NULL;
9846 ds_pool_ci.maxSets = 1;
9847 ds_pool_ci.poolSizeCount = 2;
9848 ds_pool_ci.pPoolSizes = ds_type_count;
9849
9850 VkDescriptorPool ds_pool;
9851 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9852 ASSERT_VK_SUCCESS(err);
9853
9854 // Create layout with single uniform buffer & single storage buffer descriptor
9855 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9856 dsl_binding[0].binding = 0;
9857 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9858 dsl_binding[0].descriptorCount = 1;
9859 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9860 dsl_binding[0].pImmutableSamplers = NULL;
9861 dsl_binding[1].binding = 1;
9862 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9863 dsl_binding[1].descriptorCount = 1;
9864 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9865 dsl_binding[1].pImmutableSamplers = NULL;
9866
9867 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9868 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9869 ds_layout_ci.pNext = NULL;
9870 ds_layout_ci.bindingCount = 2;
9871 ds_layout_ci.pBindings = dsl_binding;
9872 VkDescriptorSetLayout ds_layout;
9873 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9874 ASSERT_VK_SUCCESS(err);
9875
9876 VkDescriptorSet descriptor_set = {};
9877 VkDescriptorSetAllocateInfo alloc_info = {};
9878 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9879 alloc_info.descriptorSetCount = 1;
9880 alloc_info.descriptorPool = ds_pool;
9881 alloc_info.pSetLayouts = &ds_layout;
9882 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9883 ASSERT_VK_SUCCESS(err);
9884
9885 // Create a buffer to be used for invalid updates
9886 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9887 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9888 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9889 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9890 VkBufferCreateInfo ub_ci = {};
9891 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9892 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9893 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9894 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9895 VkBuffer uniform_buffer;
9896 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9897 ASSERT_VK_SUCCESS(err);
9898 VkBufferCreateInfo sb_ci = {};
9899 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9900 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9901 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9902 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9903 VkBuffer storage_buffer;
9904 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9905 ASSERT_VK_SUCCESS(err);
9906 // Have to bind memory to buffer before descriptor update
9907 VkMemoryAllocateInfo mem_alloc = {};
9908 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9909 mem_alloc.pNext = NULL;
9910 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9911 mem_alloc.memoryTypeIndex = 0;
9912
Cort Stratton77a0d592017-02-17 13:14:13 -08009913 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9914 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9915 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9916 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9917 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009918 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009919 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009920 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009921 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9922 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009923 return;
9924 }
9925
9926 VkDeviceMemory mem;
9927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009928 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009929 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009930 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9931 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9932 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9933 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9934 return;
9935 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009936 ASSERT_VK_SUCCESS(err);
9937 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9938 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009939 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009940 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9941 ASSERT_VK_SUCCESS(err);
9942
9943 VkDescriptorBufferInfo buff_info = {};
9944 buff_info.buffer = uniform_buffer;
9945 buff_info.range = ub_ci.size; // This will exceed limit
9946 VkWriteDescriptorSet descriptor_write = {};
9947 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9948 descriptor_write.dstBinding = 0;
9949 descriptor_write.descriptorCount = 1;
9950 descriptor_write.pTexelBufferView = nullptr;
9951 descriptor_write.pBufferInfo = &buff_info;
9952 descriptor_write.pImageInfo = nullptr;
9953
9954 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9955 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -06009956 if (max_ub_range != UINT32_MAX) {
9957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9958 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9959 m_errorMonitor->VerifyFound();
9960 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009961 // Reduce size of range to acceptable limit & cause offset error
9962 buff_info.range = max_ub_range;
9963 buff_info.offset = min_ub_align - 1;
9964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9965 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9966 m_errorMonitor->VerifyFound();
9967
9968 // Now break storage updates
9969 buff_info.buffer = storage_buffer;
9970 buff_info.range = sb_ci.size; // This will exceed limit
9971 buff_info.offset = 0; // Reset offset for this update
9972
9973 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9974 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -06009975 if (max_ub_range != UINT32_MAX) {
9976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9977 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9978 m_errorMonitor->VerifyFound();
9979 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009980
9981 // Reduce size of range to acceptable limit & cause offset error
9982 buff_info.range = max_sb_range;
9983 buff_info.offset = min_sb_align - 1;
9984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9985 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9986 m_errorMonitor->VerifyFound();
9987
9988 vkFreeMemory(m_device->device(), mem, NULL);
9989 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9990 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9991 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9992 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9993}
9994
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009995TEST_F(VkLayerTest, DSAspectBitsErrors) {
9996 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9997 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009998 TEST_DESCRIPTION(
9999 "Attempt to update descriptor sets for images "
10000 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010001 VkResult err;
10002
Tony Barbour1fa09702017-03-16 12:09:08 -060010003 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010004 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010005 if (!depth_format) {
10006 printf(" No Depth + Stencil format found. Skipped.\n");
10007 return;
10008 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010009 VkDescriptorPoolSize ds_type_count = {};
10010 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10011 ds_type_count.descriptorCount = 1;
10012
10013 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10014 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10015 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010016 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010017 ds_pool_ci.maxSets = 5;
10018 ds_pool_ci.poolSizeCount = 1;
10019 ds_pool_ci.pPoolSizes = &ds_type_count;
10020
10021 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010022 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010023 ASSERT_VK_SUCCESS(err);
10024
10025 VkDescriptorSetLayoutBinding dsl_binding = {};
10026 dsl_binding.binding = 0;
10027 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10028 dsl_binding.descriptorCount = 1;
10029 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10030 dsl_binding.pImmutableSamplers = NULL;
10031
10032 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10033 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10034 ds_layout_ci.pNext = NULL;
10035 ds_layout_ci.bindingCount = 1;
10036 ds_layout_ci.pBindings = &dsl_binding;
10037 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010038 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010039 ASSERT_VK_SUCCESS(err);
10040
10041 VkDescriptorSet descriptor_set = {};
10042 VkDescriptorSetAllocateInfo alloc_info = {};
10043 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10044 alloc_info.descriptorSetCount = 1;
10045 alloc_info.descriptorPool = ds_pool;
10046 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010047 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010048 ASSERT_VK_SUCCESS(err);
10049
10050 // Create an image to be used for invalid updates
10051 VkImageCreateInfo image_ci = {};
10052 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10053 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010054 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010055 image_ci.extent.width = 64;
10056 image_ci.extent.height = 64;
10057 image_ci.extent.depth = 1;
10058 image_ci.mipLevels = 1;
10059 image_ci.arrayLayers = 1;
10060 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010061 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010062 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10063 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10064 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10065 VkImage image;
10066 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10067 ASSERT_VK_SUCCESS(err);
10068 // Bind memory to image
10069 VkMemoryRequirements mem_reqs;
10070 VkDeviceMemory image_mem;
10071 bool pass;
10072 VkMemoryAllocateInfo mem_alloc = {};
10073 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10074 mem_alloc.pNext = NULL;
10075 mem_alloc.allocationSize = 0;
10076 mem_alloc.memoryTypeIndex = 0;
10077 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10078 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010079 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010080 ASSERT_TRUE(pass);
10081 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10082 ASSERT_VK_SUCCESS(err);
10083 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10084 ASSERT_VK_SUCCESS(err);
10085 // Now create view for image
10086 VkImageViewCreateInfo image_view_ci = {};
10087 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10088 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010089 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010090 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10091 image_view_ci.subresourceRange.layerCount = 1;
10092 image_view_ci.subresourceRange.baseArrayLayer = 0;
10093 image_view_ci.subresourceRange.levelCount = 1;
10094 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010095 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010096
10097 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010098 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010099 ASSERT_VK_SUCCESS(err);
10100
10101 VkDescriptorImageInfo img_info = {};
10102 img_info.imageView = image_view;
10103 VkWriteDescriptorSet descriptor_write = {};
10104 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10105 descriptor_write.dstBinding = 0;
10106 descriptor_write.descriptorCount = 1;
10107 descriptor_write.pTexelBufferView = NULL;
10108 descriptor_write.pBufferInfo = NULL;
10109 descriptor_write.pImageInfo = &img_info;
10110 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10111 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010112 const char *error_msg =
10113 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10114 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010116
10117 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10118
10119 m_errorMonitor->VerifyFound();
10120 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10121 vkDestroyImage(m_device->device(), image, NULL);
10122 vkFreeMemory(m_device->device(), image_mem, NULL);
10123 vkDestroyImageView(m_device->device(), image_view, NULL);
10124 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10125 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10126}
10127
Karl Schultz6addd812016-02-02 17:17:23 -070010128TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010129 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010130 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010131
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10133 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10134 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010135
Tony Barbour1fa09702017-03-16 12:09:08 -060010136 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010137 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010138 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010139 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10140 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010141
10142 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010143 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10144 ds_pool_ci.pNext = NULL;
10145 ds_pool_ci.maxSets = 1;
10146 ds_pool_ci.poolSizeCount = 1;
10147 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010148
Tobin Ehlis3b780662015-05-28 12:11:26 -060010149 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010150 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010151 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010152 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010153 dsl_binding.binding = 0;
10154 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10155 dsl_binding.descriptorCount = 1;
10156 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10157 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010158
Tony Barboureb254902015-07-15 12:50:33 -060010159 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010160 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10161 ds_layout_ci.pNext = NULL;
10162 ds_layout_ci.bindingCount = 1;
10163 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010164
Tobin Ehlis3b780662015-05-28 12:11:26 -060010165 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010166 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010167 ASSERT_VK_SUCCESS(err);
10168
10169 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010170 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010171 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010172 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010173 alloc_info.descriptorPool = ds_pool;
10174 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010175 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010176 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010177
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010178 VkSamplerCreateInfo sampler_ci = {};
10179 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10180 sampler_ci.pNext = NULL;
10181 sampler_ci.magFilter = VK_FILTER_NEAREST;
10182 sampler_ci.minFilter = VK_FILTER_NEAREST;
10183 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10184 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10185 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10186 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10187 sampler_ci.mipLodBias = 1.0;
10188 sampler_ci.anisotropyEnable = VK_FALSE;
10189 sampler_ci.maxAnisotropy = 1;
10190 sampler_ci.compareEnable = VK_FALSE;
10191 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10192 sampler_ci.minLod = 1.0;
10193 sampler_ci.maxLod = 1.0;
10194 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10195 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10196 VkSampler sampler;
10197 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10198 ASSERT_VK_SUCCESS(err);
10199
10200 VkDescriptorImageInfo info = {};
10201 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010202
10203 VkWriteDescriptorSet descriptor_write;
10204 memset(&descriptor_write, 0, sizeof(descriptor_write));
10205 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010206 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010207 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010208 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010209 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010210 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010211
10212 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10213
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010214 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010215
Chia-I Wuf7458c52015-10-26 21:10:41 +080010216 vkDestroySampler(m_device->device(), sampler, NULL);
10217 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10218 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010219}
10220
Karl Schultz6addd812016-02-02 17:17:23 -070010221TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010222 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010223 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010224
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010226
Tony Barbour1fa09702017-03-16 12:09:08 -060010227 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010228 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010229 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010230 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10231 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010232
10233 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010234 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10235 ds_pool_ci.pNext = NULL;
10236 ds_pool_ci.maxSets = 1;
10237 ds_pool_ci.poolSizeCount = 1;
10238 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010239
Tobin Ehlis3b780662015-05-28 12:11:26 -060010240 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010241 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010242 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010243
Tony Barboureb254902015-07-15 12:50:33 -060010244 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010245 dsl_binding.binding = 0;
10246 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10247 dsl_binding.descriptorCount = 1;
10248 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10249 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010250
10251 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010252 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10253 ds_layout_ci.pNext = NULL;
10254 ds_layout_ci.bindingCount = 1;
10255 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010256
Tobin Ehlis3b780662015-05-28 12:11:26 -060010257 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010258 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010259 ASSERT_VK_SUCCESS(err);
10260
10261 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010262 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010263 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010264 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010265 alloc_info.descriptorPool = ds_pool;
10266 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010267 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010268 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010269
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010270 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10271
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010272 // Correctly update descriptor to avoid "NOT_UPDATED" error
10273 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010274 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010275 buff_info.offset = 0;
10276 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010277
10278 VkWriteDescriptorSet descriptor_write;
10279 memset(&descriptor_write, 0, sizeof(descriptor_write));
10280 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010281 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010282 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010283 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010284 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10285 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010286
10287 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10288
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010289 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010290
Chia-I Wuf7458c52015-10-26 21:10:41 +080010291 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10292 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010293}
10294
Karl Schultz6addd812016-02-02 17:17:23 -070010295TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010296 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010297 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010298
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010300
Tony Barbour1fa09702017-03-16 12:09:08 -060010301 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010302 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010303 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010304 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10305 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010306
10307 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010308 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10309 ds_pool_ci.pNext = NULL;
10310 ds_pool_ci.maxSets = 1;
10311 ds_pool_ci.poolSizeCount = 1;
10312 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010313
Tobin Ehlis3b780662015-05-28 12:11:26 -060010314 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010315 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010316 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010317
Tony Barboureb254902015-07-15 12:50:33 -060010318 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010319 dsl_binding.binding = 0;
10320 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10321 dsl_binding.descriptorCount = 1;
10322 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10323 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010324
10325 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010326 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10327 ds_layout_ci.pNext = NULL;
10328 ds_layout_ci.bindingCount = 1;
10329 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010330 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010331 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010332 ASSERT_VK_SUCCESS(err);
10333
10334 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010335 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010336 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010337 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010338 alloc_info.descriptorPool = ds_pool;
10339 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010340 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010341 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010342
Tony Barboureb254902015-07-15 12:50:33 -060010343 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010344 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10345 sampler_ci.pNext = NULL;
10346 sampler_ci.magFilter = VK_FILTER_NEAREST;
10347 sampler_ci.minFilter = VK_FILTER_NEAREST;
10348 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10349 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10350 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10351 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10352 sampler_ci.mipLodBias = 1.0;
10353 sampler_ci.anisotropyEnable = VK_FALSE;
10354 sampler_ci.maxAnisotropy = 1;
10355 sampler_ci.compareEnable = VK_FALSE;
10356 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10357 sampler_ci.minLod = 1.0;
10358 sampler_ci.maxLod = 1.0;
10359 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10360 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010361
Tobin Ehlis3b780662015-05-28 12:11:26 -060010362 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010363 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010364 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010365
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010366 VkDescriptorImageInfo info = {};
10367 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010368
10369 VkWriteDescriptorSet descriptor_write;
10370 memset(&descriptor_write, 0, sizeof(descriptor_write));
10371 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010372 descriptor_write.dstSet = descriptorSet;
10373 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010374 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010375 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010376 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010377 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010378
10379 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10380
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010381 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010382
Chia-I Wuf7458c52015-10-26 21:10:41 +080010383 vkDestroySampler(m_device->device(), sampler, NULL);
10384 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10385 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010386}
10387
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010388TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10389 // Create layout w/ empty binding and attempt to update it
10390 VkResult err;
10391
Tony Barbour1fa09702017-03-16 12:09:08 -060010392 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010393
10394 VkDescriptorPoolSize ds_type_count = {};
10395 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10396 ds_type_count.descriptorCount = 1;
10397
10398 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10399 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10400 ds_pool_ci.pNext = NULL;
10401 ds_pool_ci.maxSets = 1;
10402 ds_pool_ci.poolSizeCount = 1;
10403 ds_pool_ci.pPoolSizes = &ds_type_count;
10404
10405 VkDescriptorPool ds_pool;
10406 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10407 ASSERT_VK_SUCCESS(err);
10408
10409 VkDescriptorSetLayoutBinding dsl_binding = {};
10410 dsl_binding.binding = 0;
10411 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10412 dsl_binding.descriptorCount = 0;
10413 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10414 dsl_binding.pImmutableSamplers = NULL;
10415
10416 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10417 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10418 ds_layout_ci.pNext = NULL;
10419 ds_layout_ci.bindingCount = 1;
10420 ds_layout_ci.pBindings = &dsl_binding;
10421 VkDescriptorSetLayout ds_layout;
10422 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10423 ASSERT_VK_SUCCESS(err);
10424
10425 VkDescriptorSet descriptor_set;
10426 VkDescriptorSetAllocateInfo alloc_info = {};
10427 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10428 alloc_info.descriptorSetCount = 1;
10429 alloc_info.descriptorPool = ds_pool;
10430 alloc_info.pSetLayouts = &ds_layout;
10431 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10432 ASSERT_VK_SUCCESS(err);
10433
10434 VkSamplerCreateInfo sampler_ci = {};
10435 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10436 sampler_ci.magFilter = VK_FILTER_NEAREST;
10437 sampler_ci.minFilter = VK_FILTER_NEAREST;
10438 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10439 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10440 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10441 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10442 sampler_ci.mipLodBias = 1.0;
10443 sampler_ci.maxAnisotropy = 1;
10444 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10445 sampler_ci.minLod = 1.0;
10446 sampler_ci.maxLod = 1.0;
10447 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10448
10449 VkSampler sampler;
10450 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10451 ASSERT_VK_SUCCESS(err);
10452
10453 VkDescriptorImageInfo info = {};
10454 info.sampler = sampler;
10455
10456 VkWriteDescriptorSet descriptor_write;
10457 memset(&descriptor_write, 0, sizeof(descriptor_write));
10458 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10459 descriptor_write.dstSet = descriptor_set;
10460 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010461 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010462 // This is the wrong type, but empty binding error will be flagged first
10463 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10464 descriptor_write.pImageInfo = &info;
10465
10466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10467 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10468 m_errorMonitor->VerifyFound();
10469
10470 vkDestroySampler(m_device->device(), sampler, NULL);
10471 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10472 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10473}
10474
Karl Schultz6addd812016-02-02 17:17:23 -070010475TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10476 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10477 // types
10478 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010479
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010481
Tony Barbour1fa09702017-03-16 12:09:08 -060010482 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010483
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010484 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010485 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10486 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010487
10488 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010489 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10490 ds_pool_ci.pNext = NULL;
10491 ds_pool_ci.maxSets = 1;
10492 ds_pool_ci.poolSizeCount = 1;
10493 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010494
Tobin Ehlis3b780662015-05-28 12:11:26 -060010495 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010496 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010497 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010498 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010499 dsl_binding.binding = 0;
10500 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10501 dsl_binding.descriptorCount = 1;
10502 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10503 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010504
Tony Barboureb254902015-07-15 12:50:33 -060010505 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010506 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10507 ds_layout_ci.pNext = NULL;
10508 ds_layout_ci.bindingCount = 1;
10509 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010510
Tobin Ehlis3b780662015-05-28 12:11:26 -060010511 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010512 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010513 ASSERT_VK_SUCCESS(err);
10514
10515 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010516 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010517 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010518 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010519 alloc_info.descriptorPool = ds_pool;
10520 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010521 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010522 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010523
Tony Barboureb254902015-07-15 12:50:33 -060010524 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010525 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10526 sampler_ci.pNext = NULL;
10527 sampler_ci.magFilter = VK_FILTER_NEAREST;
10528 sampler_ci.minFilter = VK_FILTER_NEAREST;
10529 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10530 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10531 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10532 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10533 sampler_ci.mipLodBias = 1.0;
10534 sampler_ci.anisotropyEnable = VK_FALSE;
10535 sampler_ci.maxAnisotropy = 1;
10536 sampler_ci.compareEnable = VK_FALSE;
10537 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10538 sampler_ci.minLod = 1.0;
10539 sampler_ci.maxLod = 1.0;
10540 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10541 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010542 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010543 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010544 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010545
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010546 VkDescriptorImageInfo info = {};
10547 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010548
10549 VkWriteDescriptorSet descriptor_write;
10550 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010551 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010552 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010553 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010554 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010555 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010556 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010557
10558 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10559
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010560 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010561
Chia-I Wuf7458c52015-10-26 21:10:41 +080010562 vkDestroySampler(m_device->device(), sampler, NULL);
10563 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10564 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010565}
10566
Karl Schultz6addd812016-02-02 17:17:23 -070010567TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010568 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010569 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010570
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010572
Tony Barbour1fa09702017-03-16 12:09:08 -060010573 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010574 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10575 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010576 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010577 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10578 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010579
10580 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010581 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10582 ds_pool_ci.pNext = NULL;
10583 ds_pool_ci.maxSets = 1;
10584 ds_pool_ci.poolSizeCount = 1;
10585 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010586
10587 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010588 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010589 ASSERT_VK_SUCCESS(err);
10590
10591 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010592 dsl_binding.binding = 0;
10593 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10594 dsl_binding.descriptorCount = 1;
10595 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10596 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010597
10598 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010599 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10600 ds_layout_ci.pNext = NULL;
10601 ds_layout_ci.bindingCount = 1;
10602 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010603 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010604 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010605 ASSERT_VK_SUCCESS(err);
10606
10607 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010608 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010609 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010610 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010611 alloc_info.descriptorPool = ds_pool;
10612 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010613 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010614 ASSERT_VK_SUCCESS(err);
10615
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010616 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010617
10618 VkDescriptorImageInfo descriptor_info;
10619 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10620 descriptor_info.sampler = sampler;
10621
10622 VkWriteDescriptorSet descriptor_write;
10623 memset(&descriptor_write, 0, sizeof(descriptor_write));
10624 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010625 descriptor_write.dstSet = descriptorSet;
10626 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010627 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010628 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10629 descriptor_write.pImageInfo = &descriptor_info;
10630
10631 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10632
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010633 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010634
Chia-I Wuf7458c52015-10-26 21:10:41 +080010635 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10636 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010637}
10638
Karl Schultz6addd812016-02-02 17:17:23 -070010639TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10640 // Create a single combined Image/Sampler descriptor and send it an invalid
10641 // imageView
10642 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010643
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010645
Tony Barbour1fa09702017-03-16 12:09:08 -060010646 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010647 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010648 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10649 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010650
10651 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010652 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10653 ds_pool_ci.pNext = NULL;
10654 ds_pool_ci.maxSets = 1;
10655 ds_pool_ci.poolSizeCount = 1;
10656 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010657
10658 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010659 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010660 ASSERT_VK_SUCCESS(err);
10661
10662 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010663 dsl_binding.binding = 0;
10664 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10665 dsl_binding.descriptorCount = 1;
10666 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10667 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010668
10669 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010670 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10671 ds_layout_ci.pNext = NULL;
10672 ds_layout_ci.bindingCount = 1;
10673 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010674 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010675 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010676 ASSERT_VK_SUCCESS(err);
10677
10678 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010679 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010680 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010681 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010682 alloc_info.descriptorPool = ds_pool;
10683 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010684 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010685 ASSERT_VK_SUCCESS(err);
10686
10687 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010688 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10689 sampler_ci.pNext = NULL;
10690 sampler_ci.magFilter = VK_FILTER_NEAREST;
10691 sampler_ci.minFilter = VK_FILTER_NEAREST;
10692 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10693 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10694 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10695 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10696 sampler_ci.mipLodBias = 1.0;
10697 sampler_ci.anisotropyEnable = VK_FALSE;
10698 sampler_ci.maxAnisotropy = 1;
10699 sampler_ci.compareEnable = VK_FALSE;
10700 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10701 sampler_ci.minLod = 1.0;
10702 sampler_ci.maxLod = 1.0;
10703 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10704 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010705
10706 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010707 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010708 ASSERT_VK_SUCCESS(err);
10709
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010710 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010711
10712 VkDescriptorImageInfo descriptor_info;
10713 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10714 descriptor_info.sampler = sampler;
10715 descriptor_info.imageView = view;
10716
10717 VkWriteDescriptorSet descriptor_write;
10718 memset(&descriptor_write, 0, sizeof(descriptor_write));
10719 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010720 descriptor_write.dstSet = descriptorSet;
10721 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010722 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010723 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10724 descriptor_write.pImageInfo = &descriptor_info;
10725
10726 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10727
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010728 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010729
Chia-I Wuf7458c52015-10-26 21:10:41 +080010730 vkDestroySampler(m_device->device(), sampler, NULL);
10731 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10732 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010733}
10734
Karl Schultz6addd812016-02-02 17:17:23 -070010735TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10736 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10737 // into the other
10738 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010739
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10741 " binding #1 with type "
10742 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10743 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010744
Tony Barbour1fa09702017-03-16 12:09:08 -060010745 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010746 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010747 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010748 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10749 ds_type_count[0].descriptorCount = 1;
10750 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10751 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010752
10753 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010754 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10755 ds_pool_ci.pNext = NULL;
10756 ds_pool_ci.maxSets = 1;
10757 ds_pool_ci.poolSizeCount = 2;
10758 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010759
10760 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010761 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010762 ASSERT_VK_SUCCESS(err);
10763 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010764 dsl_binding[0].binding = 0;
10765 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10766 dsl_binding[0].descriptorCount = 1;
10767 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10768 dsl_binding[0].pImmutableSamplers = NULL;
10769 dsl_binding[1].binding = 1;
10770 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10771 dsl_binding[1].descriptorCount = 1;
10772 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10773 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010774
10775 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010776 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10777 ds_layout_ci.pNext = NULL;
10778 ds_layout_ci.bindingCount = 2;
10779 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010780
10781 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010782 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010783 ASSERT_VK_SUCCESS(err);
10784
10785 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010786 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010787 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010788 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010789 alloc_info.descriptorPool = ds_pool;
10790 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010791 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010792 ASSERT_VK_SUCCESS(err);
10793
10794 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010795 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10796 sampler_ci.pNext = NULL;
10797 sampler_ci.magFilter = VK_FILTER_NEAREST;
10798 sampler_ci.minFilter = VK_FILTER_NEAREST;
10799 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10800 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10801 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10802 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10803 sampler_ci.mipLodBias = 1.0;
10804 sampler_ci.anisotropyEnable = VK_FALSE;
10805 sampler_ci.maxAnisotropy = 1;
10806 sampler_ci.compareEnable = VK_FALSE;
10807 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10808 sampler_ci.minLod = 1.0;
10809 sampler_ci.maxLod = 1.0;
10810 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10811 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010812
10813 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010814 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010815 ASSERT_VK_SUCCESS(err);
10816
10817 VkDescriptorImageInfo info = {};
10818 info.sampler = sampler;
10819
10820 VkWriteDescriptorSet descriptor_write;
10821 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010823 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010824 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010825 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10827 descriptor_write.pImageInfo = &info;
10828 // This write update should succeed
10829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10830 // Now perform a copy update that fails due to type mismatch
10831 VkCopyDescriptorSet copy_ds_update;
10832 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10833 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10834 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010835 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010836 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010837 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10838 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010839 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10840
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010841 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010842 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010844 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10845 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10846 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010847 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010848 copy_ds_update.dstSet = descriptorSet;
10849 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010850 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010851 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10852
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010853 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010854
Tobin Ehlis04356f92015-10-27 16:35:27 -060010855 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10857 " binding#1 with offset index of 1 plus "
10858 "update array offset of 0 and update of "
10859 "5 descriptors oversteps total number "
10860 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010861
Tobin Ehlis04356f92015-10-27 16:35:27 -060010862 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10863 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10864 copy_ds_update.srcSet = descriptorSet;
10865 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010866 copy_ds_update.dstSet = descriptorSet;
10867 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010868 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010869 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10870
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010871 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010872
Chia-I Wuf7458c52015-10-26 21:10:41 +080010873 vkDestroySampler(m_device->device(), sampler, NULL);
10874 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10875 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010876}
10877
Karl Schultz6addd812016-02-02 17:17:23 -070010878TEST_F(VkLayerTest, NumSamplesMismatch) {
10879 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10880 // sampleCount
10881 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010882
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010884
Tony Barbour1fa09702017-03-16 12:09:08 -060010885 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010887 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010888 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010889 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010890
10891 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010892 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10893 ds_pool_ci.pNext = NULL;
10894 ds_pool_ci.maxSets = 1;
10895 ds_pool_ci.poolSizeCount = 1;
10896 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010897
Tobin Ehlis3b780662015-05-28 12:11:26 -060010898 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010899 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010900 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010901
Tony Barboureb254902015-07-15 12:50:33 -060010902 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010903 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010904 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010905 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010906 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10907 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010908
Tony Barboureb254902015-07-15 12:50:33 -060010909 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10910 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10911 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010912 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010913 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010914
Tobin Ehlis3b780662015-05-28 12:11:26 -060010915 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010916 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010917 ASSERT_VK_SUCCESS(err);
10918
10919 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010920 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010921 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010922 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010923 alloc_info.descriptorPool = ds_pool;
10924 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010925 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010926 ASSERT_VK_SUCCESS(err);
10927
Tony Barboureb254902015-07-15 12:50:33 -060010928 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010929 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010930 pipe_ms_state_ci.pNext = NULL;
10931 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10932 pipe_ms_state_ci.sampleShadingEnable = 0;
10933 pipe_ms_state_ci.minSampleShading = 1.0;
10934 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010935
Tony Barboureb254902015-07-15 12:50:33 -060010936 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010937 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10938 pipeline_layout_ci.pNext = NULL;
10939 pipeline_layout_ci.setLayoutCount = 1;
10940 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010941
10942 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010943 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010944 ASSERT_VK_SUCCESS(err);
10945
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010946 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010947 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010948 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010949 VkPipelineObj pipe(m_device);
10950 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010951 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010952 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010953 pipe.SetMSAA(&pipe_ms_state_ci);
10954 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010955
Tony Barbour552f6c02016-12-21 14:34:07 -070010956 m_commandBuffer->BeginCommandBuffer();
10957 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010958 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010959
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010960 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10961 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10962 VkRect2D scissor = {{0, 0}, {16, 16}};
10963 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10964
Mark Young29927482016-05-04 14:38:51 -060010965 // Render triangle (the error should trigger on the attempt to draw).
10966 Draw(3, 1, 0, 0);
10967
10968 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010969 m_commandBuffer->EndRenderPass();
10970 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010971
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010972 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010973
Chia-I Wuf7458c52015-10-26 21:10:41 +080010974 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10975 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10976 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010977}
Mark Young29927482016-05-04 14:38:51 -060010978
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010979TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010980 TEST_DESCRIPTION(
10981 "Hit RenderPass incompatible cases. "
10982 "Initial case is drawing with an active renderpass that's "
10983 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010984 VkResult err;
10985
Tony Barbour1fa09702017-03-16 12:09:08 -060010986 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10988
10989 VkDescriptorSetLayoutBinding dsl_binding = {};
10990 dsl_binding.binding = 0;
10991 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10992 dsl_binding.descriptorCount = 1;
10993 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10994 dsl_binding.pImmutableSamplers = NULL;
10995
10996 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10997 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10998 ds_layout_ci.pNext = NULL;
10999 ds_layout_ci.bindingCount = 1;
11000 ds_layout_ci.pBindings = &dsl_binding;
11001
11002 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011003 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011004 ASSERT_VK_SUCCESS(err);
11005
11006 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11007 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11008 pipeline_layout_ci.pNext = NULL;
11009 pipeline_layout_ci.setLayoutCount = 1;
11010 pipeline_layout_ci.pSetLayouts = &ds_layout;
11011
11012 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011013 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011014 ASSERT_VK_SUCCESS(err);
11015
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011016 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011017 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011018 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011019 // Create a renderpass that will be incompatible with default renderpass
11020 VkAttachmentReference attach = {};
11021 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11022 VkAttachmentReference color_att = {};
11023 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11024 VkSubpassDescription subpass = {};
11025 subpass.inputAttachmentCount = 1;
11026 subpass.pInputAttachments = &attach;
11027 subpass.colorAttachmentCount = 1;
11028 subpass.pColorAttachments = &color_att;
11029 VkRenderPassCreateInfo rpci = {};
11030 rpci.subpassCount = 1;
11031 rpci.pSubpasses = &subpass;
11032 rpci.attachmentCount = 1;
11033 VkAttachmentDescription attach_desc = {};
11034 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011035 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11036 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011037 rpci.pAttachments = &attach_desc;
11038 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11039 VkRenderPass rp;
11040 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11041 VkPipelineObj pipe(m_device);
11042 pipe.AddShader(&vs);
11043 pipe.AddShader(&fs);
11044 pipe.AddColorAttachment();
11045 VkViewport view_port = {};
11046 m_viewports.push_back(view_port);
11047 pipe.SetViewport(m_viewports);
11048 VkRect2D rect = {};
11049 m_scissors.push_back(rect);
11050 pipe.SetScissor(m_scissors);
11051 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11052
11053 VkCommandBufferInheritanceInfo cbii = {};
11054 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11055 cbii.renderPass = rp;
11056 cbii.subpass = 0;
11057 VkCommandBufferBeginInfo cbbi = {};
11058 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11059 cbbi.pInheritanceInfo = &cbii;
11060 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11061 VkRenderPassBeginInfo rpbi = {};
11062 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11063 rpbi.framebuffer = m_framebuffer;
11064 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011065 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11066 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011067
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011069 // Render triangle (the error should trigger on the attempt to draw).
11070 Draw(3, 1, 0, 0);
11071
11072 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011073 m_commandBuffer->EndRenderPass();
11074 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011075
11076 m_errorMonitor->VerifyFound();
11077
11078 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11079 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11080 vkDestroyRenderPass(m_device->device(), rp, NULL);
11081}
11082
Mark Youngc89c6312016-03-31 16:03:20 -060011083TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11084 // Create Pipeline where the number of blend attachments doesn't match the
11085 // number of color attachments. In this case, we don't add any color
11086 // blend attachments even though we have a color attachment.
11087 VkResult err;
11088
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011090
Tony Barbour1fa09702017-03-16 12:09:08 -060011091 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011092 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11093 VkDescriptorPoolSize ds_type_count = {};
11094 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11095 ds_type_count.descriptorCount = 1;
11096
11097 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11098 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11099 ds_pool_ci.pNext = NULL;
11100 ds_pool_ci.maxSets = 1;
11101 ds_pool_ci.poolSizeCount = 1;
11102 ds_pool_ci.pPoolSizes = &ds_type_count;
11103
11104 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011105 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011106 ASSERT_VK_SUCCESS(err);
11107
11108 VkDescriptorSetLayoutBinding dsl_binding = {};
11109 dsl_binding.binding = 0;
11110 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11111 dsl_binding.descriptorCount = 1;
11112 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11113 dsl_binding.pImmutableSamplers = NULL;
11114
11115 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11116 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11117 ds_layout_ci.pNext = NULL;
11118 ds_layout_ci.bindingCount = 1;
11119 ds_layout_ci.pBindings = &dsl_binding;
11120
11121 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011122 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011123 ASSERT_VK_SUCCESS(err);
11124
11125 VkDescriptorSet descriptorSet;
11126 VkDescriptorSetAllocateInfo alloc_info = {};
11127 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11128 alloc_info.descriptorSetCount = 1;
11129 alloc_info.descriptorPool = ds_pool;
11130 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011131 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011132 ASSERT_VK_SUCCESS(err);
11133
11134 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011135 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011136 pipe_ms_state_ci.pNext = NULL;
11137 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11138 pipe_ms_state_ci.sampleShadingEnable = 0;
11139 pipe_ms_state_ci.minSampleShading = 1.0;
11140 pipe_ms_state_ci.pSampleMask = NULL;
11141
11142 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11143 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11144 pipeline_layout_ci.pNext = NULL;
11145 pipeline_layout_ci.setLayoutCount = 1;
11146 pipeline_layout_ci.pSetLayouts = &ds_layout;
11147
11148 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011149 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011150 ASSERT_VK_SUCCESS(err);
11151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011152 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011153 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011154 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011155 VkPipelineObj pipe(m_device);
11156 pipe.AddShader(&vs);
11157 pipe.AddShader(&fs);
11158 pipe.SetMSAA(&pipe_ms_state_ci);
11159 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011160 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011161
11162 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11163 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11164 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11165}
Mark Young29927482016-05-04 14:38:51 -060011166
Mark Muellerd4914412016-06-13 17:52:06 -060011167TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011168 TEST_DESCRIPTION(
11169 "Points to a wrong colorAttachment index in a VkClearAttachment "
11170 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011171 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011173
11174 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11175 m_errorMonitor->VerifyFound();
11176}
11177
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011178TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011179 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11180 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011181
Tony Barbour1fa09702017-03-16 12:09:08 -060011182 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011184
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011185 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011186 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11187 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011188
11189 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011190 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11191 ds_pool_ci.pNext = NULL;
11192 ds_pool_ci.maxSets = 1;
11193 ds_pool_ci.poolSizeCount = 1;
11194 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011195
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011196 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011197 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011198 ASSERT_VK_SUCCESS(err);
11199
Tony Barboureb254902015-07-15 12:50:33 -060011200 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011201 dsl_binding.binding = 0;
11202 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11203 dsl_binding.descriptorCount = 1;
11204 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11205 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011206
Tony Barboureb254902015-07-15 12:50:33 -060011207 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011208 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11209 ds_layout_ci.pNext = NULL;
11210 ds_layout_ci.bindingCount = 1;
11211 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011212
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011213 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011214 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011215 ASSERT_VK_SUCCESS(err);
11216
11217 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011218 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011219 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011220 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011221 alloc_info.descriptorPool = ds_pool;
11222 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011223 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011224 ASSERT_VK_SUCCESS(err);
11225
Tony Barboureb254902015-07-15 12:50:33 -060011226 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011228 pipe_ms_state_ci.pNext = NULL;
11229 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11230 pipe_ms_state_ci.sampleShadingEnable = 0;
11231 pipe_ms_state_ci.minSampleShading = 1.0;
11232 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011233
Tony Barboureb254902015-07-15 12:50:33 -060011234 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011235 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11236 pipeline_layout_ci.pNext = NULL;
11237 pipeline_layout_ci.setLayoutCount = 1;
11238 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011239
11240 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011241 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011242 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011243
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011244 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011245 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011246 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011247 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011248
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011249 VkPipelineObj pipe(m_device);
11250 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011251 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011252 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011253 pipe.SetMSAA(&pipe_ms_state_ci);
11254 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011255
Tony Barbour552f6c02016-12-21 14:34:07 -070011256 m_commandBuffer->BeginCommandBuffer();
11257 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011258
Karl Schultz6addd812016-02-02 17:17:23 -070011259 // Main thing we care about for this test is that the VkImage obj we're
11260 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011261 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011262 VkClearAttachment color_attachment;
11263 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11264 color_attachment.clearValue.color.float32[0] = 1.0;
11265 color_attachment.clearValue.color.float32[1] = 1.0;
11266 color_attachment.clearValue.color.float32[2] = 1.0;
11267 color_attachment.clearValue.color.float32[3] = 1.0;
11268 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011269 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011270
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011271 // Call for full-sized FB Color attachment prior to issuing a Draw
11272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011273 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011274 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011275 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011276
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011277 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11278 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11280 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11281 m_errorMonitor->VerifyFound();
11282
11283 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11284 clear_rect.layerCount = 2;
11285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11286 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011287 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011288
Chia-I Wuf7458c52015-10-26 21:10:41 +080011289 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11290 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11291 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011292}
11293
Karl Schultz6addd812016-02-02 17:17:23 -070011294TEST_F(VkLayerTest, VtxBufferBadIndex) {
11295 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011296
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11298 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011299
Tony Barbour1fa09702017-03-16 12:09:08 -060011300 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011301 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011303
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011304 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011305 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11306 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011307
11308 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011309 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11310 ds_pool_ci.pNext = NULL;
11311 ds_pool_ci.maxSets = 1;
11312 ds_pool_ci.poolSizeCount = 1;
11313 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011314
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011315 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011316 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011317 ASSERT_VK_SUCCESS(err);
11318
Tony Barboureb254902015-07-15 12:50:33 -060011319 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011320 dsl_binding.binding = 0;
11321 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11322 dsl_binding.descriptorCount = 1;
11323 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11324 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011325
Tony Barboureb254902015-07-15 12:50:33 -060011326 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011327 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11328 ds_layout_ci.pNext = NULL;
11329 ds_layout_ci.bindingCount = 1;
11330 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011331
Tobin Ehlis502480b2015-06-24 15:53:07 -060011332 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011333 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011334 ASSERT_VK_SUCCESS(err);
11335
11336 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011337 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011338 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011339 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011340 alloc_info.descriptorPool = ds_pool;
11341 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011342 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011343 ASSERT_VK_SUCCESS(err);
11344
Tony Barboureb254902015-07-15 12:50:33 -060011345 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011346 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011347 pipe_ms_state_ci.pNext = NULL;
11348 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11349 pipe_ms_state_ci.sampleShadingEnable = 0;
11350 pipe_ms_state_ci.minSampleShading = 1.0;
11351 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011352
Tony Barboureb254902015-07-15 12:50:33 -060011353 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011354 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11355 pipeline_layout_ci.pNext = NULL;
11356 pipeline_layout_ci.setLayoutCount = 1;
11357 pipeline_layout_ci.pSetLayouts = &ds_layout;
11358 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011359
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011360 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011361 ASSERT_VK_SUCCESS(err);
11362
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011363 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011364 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011365 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011366 VkPipelineObj pipe(m_device);
11367 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011368 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011369 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011370 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011371 pipe.SetViewport(m_viewports);
11372 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011373 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011374
Tony Barbour552f6c02016-12-21 14:34:07 -070011375 m_commandBuffer->BeginCommandBuffer();
11376 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011377 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011378 // Don't care about actual data, just need to get to draw to flag error
11379 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011380 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011381 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011382 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011383
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011384 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011385
Chia-I Wuf7458c52015-10-26 21:10:41 +080011386 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11387 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11388 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011389}
Mark Muellerdfe37552016-07-07 14:47:42 -060011390
Mark Mueller2ee294f2016-08-04 12:59:48 -060011391TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011392 TEST_DESCRIPTION(
11393 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11394 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011395 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011396
Mark Mueller880fce52016-08-17 15:23:23 -060011397 // The following test fails with recent NVidia drivers.
11398 // By the time core_validation is reached, the NVidia
11399 // driver has sanitized the invalid condition and core_validation
11400 // is not introduced to the failure condition. This is not the case
11401 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011402 // uint32_t count = static_cast<uint32_t>(~0);
11403 // VkPhysicalDevice physical_device;
11404 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11405 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011406
Mark Mueller2ee294f2016-08-04 12:59:48 -060011407 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011408 VkDeviceQueueCreateInfo queue_create_info = {};
11409 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11410 queue_create_info.queueCount = 1;
11411 queue_create_info.pQueuePriorities = &queue_priority;
11412 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11413
11414 VkPhysicalDeviceFeatures features = m_device->phy().features();
11415 VkDevice testDevice;
11416 VkDeviceCreateInfo device_create_info = {};
11417 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11418 device_create_info.queueCreateInfoCount = 1;
11419 device_create_info.pQueueCreateInfos = &queue_create_info;
11420 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011421
11422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11423 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011424 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11425 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11426 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011427 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11428 m_errorMonitor->VerifyFound();
11429
11430 queue_create_info.queueFamilyIndex = 1;
11431
11432 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11433 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11434 for (unsigned i = 0; i < feature_count; i++) {
11435 if (VK_FALSE == feature_array[i]) {
11436 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011437 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11439 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011440 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11441 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11442 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11444 "You requested features that are unavailable on this device. You should first "
11445 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011446 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11447 m_errorMonitor->VerifyFound();
11448 break;
11449 }
11450 }
11451}
11452
Tobin Ehlis16edf082016-11-21 12:33:49 -070011453TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11454 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11455
Tony Barbour1fa09702017-03-16 12:09:08 -060011456 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011457
11458 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11459 std::vector<VkDeviceQueueCreateInfo> queue_info;
11460 queue_info.reserve(queue_props.size());
11461 std::vector<std::vector<float>> queue_priorities;
11462 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11463 VkDeviceQueueCreateInfo qi{};
11464 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11465 qi.queueFamilyIndex = i;
11466 qi.queueCount = queue_props[i].queueCount;
11467 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11468 qi.pQueuePriorities = queue_priorities[i].data();
11469 queue_info.push_back(qi);
11470 }
11471
11472 std::vector<const char *> device_extension_names;
11473
11474 VkDevice local_device;
11475 VkDeviceCreateInfo device_create_info = {};
11476 auto features = m_device->phy().features();
11477 // Intentionally disable pipeline stats
11478 features.pipelineStatisticsQuery = VK_FALSE;
11479 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11480 device_create_info.pNext = NULL;
11481 device_create_info.queueCreateInfoCount = queue_info.size();
11482 device_create_info.pQueueCreateInfos = queue_info.data();
11483 device_create_info.enabledLayerCount = 0;
11484 device_create_info.ppEnabledLayerNames = NULL;
11485 device_create_info.pEnabledFeatures = &features;
11486 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11487 ASSERT_VK_SUCCESS(err);
11488
11489 VkQueryPoolCreateInfo qpci{};
11490 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11491 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11492 qpci.queryCount = 1;
11493 VkQueryPool query_pool;
11494
11495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11496 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11497 m_errorMonitor->VerifyFound();
11498
11499 vkDestroyDevice(local_device, nullptr);
11500}
11501
Mark Mueller2ee294f2016-08-04 12:59:48 -060011502TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011503 TEST_DESCRIPTION(
11504 "Use an invalid queue index in a vkCmdWaitEvents call."
11505 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011506
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011507 const char *invalid_queue_index =
11508 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11509 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11510 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011511
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011512 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011513
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011515
Tony Barbour1fa09702017-03-16 12:09:08 -060011516 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011517
11518 VkEvent event;
11519 VkEventCreateInfo event_create_info{};
11520 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11521 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11522
Mark Mueller2ee294f2016-08-04 12:59:48 -060011523 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011524 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011525
Tony Barbour552f6c02016-12-21 14:34:07 -070011526 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011527
11528 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011529 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011530 ASSERT_TRUE(image.initialized());
11531 VkImageMemoryBarrier img_barrier = {};
11532 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11533 img_barrier.pNext = NULL;
11534 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11535 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11536 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11537 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11538 img_barrier.image = image.handle();
11539 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011540
11541 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11542 // that layer validation catches the case when it is not.
11543 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011544 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11545 img_barrier.subresourceRange.baseArrayLayer = 0;
11546 img_barrier.subresourceRange.baseMipLevel = 0;
11547 img_barrier.subresourceRange.layerCount = 1;
11548 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011549 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11550 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011551 m_errorMonitor->VerifyFound();
11552
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011554
11555 VkQueryPool query_pool;
11556 VkQueryPoolCreateInfo query_pool_create_info = {};
11557 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11558 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11559 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011560 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011562 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011563 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11564
11565 vkEndCommandBuffer(m_commandBuffer->handle());
11566 m_errorMonitor->VerifyFound();
11567
11568 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11569 vkDestroyEvent(m_device->device(), event, nullptr);
11570}
11571
Mark Muellerdfe37552016-07-07 14:47:42 -060011572TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011573 TEST_DESCRIPTION(
11574 "Submit a command buffer using deleted vertex buffer, "
11575 "delete a buffer twice, use an invalid offset for each "
11576 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011577
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011578 const char *deleted_buffer_in_command_buffer =
11579 "Cannot submit cmd buffer "
11580 "using deleted buffer ";
11581 const char *invalid_offset_message =
11582 "vkBindBufferMemory(): "
11583 "memoryOffset is 0x";
11584 const char *invalid_storage_buffer_offset_message =
11585 "vkBindBufferMemory(): "
11586 "storage memoryOffset "
11587 "is 0x";
11588 const char *invalid_texel_buffer_offset_message =
11589 "vkBindBufferMemory(): "
11590 "texel memoryOffset "
11591 "is 0x";
11592 const char *invalid_uniform_buffer_offset_message =
11593 "vkBindBufferMemory(): "
11594 "uniform memoryOffset "
11595 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011596
Tony Barbour1fa09702017-03-16 12:09:08 -060011597 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011598 ASSERT_NO_FATAL_FAILURE(InitViewport());
11599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11600
11601 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011602 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011603 pipe_ms_state_ci.pNext = NULL;
11604 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11605 pipe_ms_state_ci.sampleShadingEnable = 0;
11606 pipe_ms_state_ci.minSampleShading = 1.0;
11607 pipe_ms_state_ci.pSampleMask = nullptr;
11608
11609 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11610 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11611 VkPipelineLayout pipeline_layout;
11612
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011613 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011614 ASSERT_VK_SUCCESS(err);
11615
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011616 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11617 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011618 VkPipelineObj pipe(m_device);
11619 pipe.AddShader(&vs);
11620 pipe.AddShader(&fs);
11621 pipe.AddColorAttachment();
11622 pipe.SetMSAA(&pipe_ms_state_ci);
11623 pipe.SetViewport(m_viewports);
11624 pipe.SetScissor(m_scissors);
11625 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11626
Tony Barbour552f6c02016-12-21 14:34:07 -070011627 m_commandBuffer->BeginCommandBuffer();
11628 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011629 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011630
11631 {
11632 // Create and bind a vertex buffer in a reduced scope, which will cause
11633 // it to be deleted upon leaving this scope
11634 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011635 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011636 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11637 draw_verticies.AddVertexInputToPipe(pipe);
11638 }
11639
11640 Draw(1, 0, 0, 0);
11641
Tony Barbour552f6c02016-12-21 14:34:07 -070011642 m_commandBuffer->EndRenderPass();
11643 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011644
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011646 QueueCommandBuffer(false);
11647 m_errorMonitor->VerifyFound();
11648
11649 {
11650 // Create and bind a vertex buffer in a reduced scope, and delete it
11651 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011652 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011654 buffer_test.TestDoubleDestroy();
11655 }
11656 m_errorMonitor->VerifyFound();
11657
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011658 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011659 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011660 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011662 m_errorMonitor->SetUnexpectedError(
11663 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11664 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011665 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11666 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011667 m_errorMonitor->VerifyFound();
11668 }
11669
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011670 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11671 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011672 // Create and bind a memory buffer with an invalid offset again,
11673 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011675 m_errorMonitor->SetUnexpectedError(
11676 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11677 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011678 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11679 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011680 m_errorMonitor->VerifyFound();
11681 }
11682
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011683 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011684 // Create and bind a memory buffer with an invalid offset again, but
11685 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011687 m_errorMonitor->SetUnexpectedError(
11688 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11689 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011690 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11691 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011692 m_errorMonitor->VerifyFound();
11693 }
11694
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011695 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011696 // Create and bind a memory buffer with an invalid offset again, but
11697 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011699 m_errorMonitor->SetUnexpectedError(
11700 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11701 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011702 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11703 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011704 m_errorMonitor->VerifyFound();
11705 }
11706
11707 {
11708 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011710 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11711 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011712 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11713 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011714 m_errorMonitor->VerifyFound();
11715 }
11716
11717 {
11718 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011720 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11721 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011722 }
11723 m_errorMonitor->VerifyFound();
11724
11725 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11726}
11727
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011728// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11729TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011730 TEST_DESCRIPTION(
11731 "Hit all possible validation checks associated with the "
11732 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11733 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011734 // 3 in ValidateCmdBufImageLayouts
11735 // * -1 Attempt to submit cmd buf w/ deleted image
11736 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11737 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011738
Tony Barbour1fa09702017-03-16 12:09:08 -060011739 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011740 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011741 if (!depth_format) {
11742 printf(" No Depth + Stencil format found. Skipped.\n");
11743 return;
11744 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011745 // Create src & dst images to use for copy operations
11746 VkImage src_image;
11747 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011748 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011749
11750 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11751 const int32_t tex_width = 32;
11752 const int32_t tex_height = 32;
11753
11754 VkImageCreateInfo image_create_info = {};
11755 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11756 image_create_info.pNext = NULL;
11757 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11758 image_create_info.format = tex_format;
11759 image_create_info.extent.width = tex_width;
11760 image_create_info.extent.height = tex_height;
11761 image_create_info.extent.depth = 1;
11762 image_create_info.mipLevels = 1;
11763 image_create_info.arrayLayers = 4;
11764 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11765 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11766 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011767 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011768 image_create_info.flags = 0;
11769
11770 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11771 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011772 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011773 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11774 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011775 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11776 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11777 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11778 ASSERT_VK_SUCCESS(err);
11779
11780 // Allocate memory
11781 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011782 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011783 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011784 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11785 mem_alloc.pNext = NULL;
11786 mem_alloc.allocationSize = 0;
11787 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011788
11789 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011790 mem_alloc.allocationSize = img_mem_reqs.size;
11791 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011792 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011793 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011794 ASSERT_VK_SUCCESS(err);
11795
11796 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011797 mem_alloc.allocationSize = img_mem_reqs.size;
11798 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011799 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011800 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011801 ASSERT_VK_SUCCESS(err);
11802
11803 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011804 mem_alloc.allocationSize = img_mem_reqs.size;
11805 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011806 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011807 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011808 ASSERT_VK_SUCCESS(err);
11809
11810 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11811 ASSERT_VK_SUCCESS(err);
11812 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11813 ASSERT_VK_SUCCESS(err);
11814 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11815 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011816
Tony Barbour552f6c02016-12-21 14:34:07 -070011817 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011818 VkImageCopy copy_region;
11819 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11820 copy_region.srcSubresource.mipLevel = 0;
11821 copy_region.srcSubresource.baseArrayLayer = 0;
11822 copy_region.srcSubresource.layerCount = 1;
11823 copy_region.srcOffset.x = 0;
11824 copy_region.srcOffset.y = 0;
11825 copy_region.srcOffset.z = 0;
11826 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11827 copy_region.dstSubresource.mipLevel = 0;
11828 copy_region.dstSubresource.baseArrayLayer = 0;
11829 copy_region.dstSubresource.layerCount = 1;
11830 copy_region.dstOffset.x = 0;
11831 copy_region.dstOffset.y = 0;
11832 copy_region.dstOffset.z = 0;
11833 copy_region.extent.width = 1;
11834 copy_region.extent.height = 1;
11835 copy_region.extent.depth = 1;
11836
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11838 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11839 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011840
Cort530cf382016-12-08 09:59:47 -080011841 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011842 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011843 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11844 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011845 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11846 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011847 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011848 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011850 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11851 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011852 m_errorMonitor->SetUnexpectedError(
11853 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011854 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011855 m_errorMonitor->VerifyFound();
11856 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011858 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011859 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011860 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011861 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011862 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011863 m_errorMonitor->VerifyFound();
11864 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11866 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11867 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011868 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011869 m_errorMonitor->VerifyFound();
11870 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011872 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011873 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011874 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011875 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011876 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011877 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011879 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11880 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011881 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011882 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011883 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011884 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011885
Cort3b021012016-12-07 12:00:57 -080011886 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11887 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11888 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11889 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11890 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11891 transfer_dst_image_barrier[0].srcAccessMask = 0;
11892 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11893 transfer_dst_image_barrier[0].image = dst_image;
11894 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11895 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11896 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11897 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11898 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11899 transfer_dst_image_barrier[0].image = depth_image;
11900 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11901 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11902 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11903
11904 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011905 VkClearColorValue color_clear_value = {};
11906 VkImageSubresourceRange clear_range;
11907 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11908 clear_range.baseMipLevel = 0;
11909 clear_range.baseArrayLayer = 0;
11910 clear_range.layerCount = 1;
11911 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011912
Cort3b021012016-12-07 12:00:57 -080011913 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11914 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011917 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011918 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011919 // Fail due to provided layout not matching actual current layout for color clear.
11920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011921 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011922 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011923
Cort530cf382016-12-08 09:59:47 -080011924 VkClearDepthStencilValue depth_clear_value = {};
11925 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011926
11927 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11928 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011931 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011932 m_errorMonitor->VerifyFound();
11933 // Fail due to provided layout not matching actual current layout for depth clear.
11934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011935 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011936 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011937
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011938 // Now cause error due to bad image layout transition in PipelineBarrier
11939 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011940 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011941 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011942 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011943 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011944 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11945 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011946 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011948 "you cannot transition the layout of aspect 1 from "
11949 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11950 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011952 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11953 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011954 m_errorMonitor->VerifyFound();
11955
11956 // Finally some layout errors at RenderPass create time
11957 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11958 VkAttachmentReference attach = {};
11959 // perf warning for GENERAL layout w/ non-DS input attachment
11960 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11961 VkSubpassDescription subpass = {};
11962 subpass.inputAttachmentCount = 1;
11963 subpass.pInputAttachments = &attach;
11964 VkRenderPassCreateInfo rpci = {};
11965 rpci.subpassCount = 1;
11966 rpci.pSubpasses = &subpass;
11967 rpci.attachmentCount = 1;
11968 VkAttachmentDescription attach_desc = {};
11969 attach_desc.format = VK_FORMAT_UNDEFINED;
11970 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011971 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011972 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11974 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011975 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11976 m_errorMonitor->VerifyFound();
11977 // error w/ non-general layout
11978 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11979
11980 m_errorMonitor->SetDesiredFailureMsg(
11981 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11982 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11983 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11984 m_errorMonitor->VerifyFound();
11985 subpass.inputAttachmentCount = 0;
11986 subpass.colorAttachmentCount = 1;
11987 subpass.pColorAttachments = &attach;
11988 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11989 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11991 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011992 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11993 m_errorMonitor->VerifyFound();
11994 // error w/ non-color opt or GENERAL layout for color attachment
11995 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11996 m_errorMonitor->SetDesiredFailureMsg(
11997 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11998 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11999 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12000 m_errorMonitor->VerifyFound();
12001 subpass.colorAttachmentCount = 0;
12002 subpass.pDepthStencilAttachment = &attach;
12003 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12004 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12006 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012007 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12008 m_errorMonitor->VerifyFound();
12009 // error w/ non-ds opt or GENERAL layout for color attachment
12010 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12012 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12013 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012014 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12015 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012016 // For this error we need a valid renderpass so create default one
12017 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12018 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012019 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012020 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12021 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12022 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12023 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12024 // Can't do a CLEAR load on READ_ONLY initialLayout
12025 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12026 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12027 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012029 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012030 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12031 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012032
Cort3b021012016-12-07 12:00:57 -080012033 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12034 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12035 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012036 vkDestroyImage(m_device->device(), src_image, NULL);
12037 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012038 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012039}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012040
Tobin Ehlise0936662016-10-11 08:10:51 -060012041TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12042 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12043 VkResult err;
12044
Tony Barbour1fa09702017-03-16 12:09:08 -060012045 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012046
12047 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12048 VkImageTiling tiling;
12049 VkFormatProperties format_properties;
12050 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12051 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12052 tiling = VK_IMAGE_TILING_LINEAR;
12053 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12054 tiling = VK_IMAGE_TILING_OPTIMAL;
12055 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012056 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012057 return;
12058 }
12059
12060 VkDescriptorPoolSize ds_type = {};
12061 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12062 ds_type.descriptorCount = 1;
12063
12064 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12065 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12066 ds_pool_ci.maxSets = 1;
12067 ds_pool_ci.poolSizeCount = 1;
12068 ds_pool_ci.pPoolSizes = &ds_type;
12069 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12070
12071 VkDescriptorPool ds_pool;
12072 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12073 ASSERT_VK_SUCCESS(err);
12074
12075 VkDescriptorSetLayoutBinding dsl_binding = {};
12076 dsl_binding.binding = 0;
12077 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12078 dsl_binding.descriptorCount = 1;
12079 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12080 dsl_binding.pImmutableSamplers = NULL;
12081
12082 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12083 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12084 ds_layout_ci.pNext = NULL;
12085 ds_layout_ci.bindingCount = 1;
12086 ds_layout_ci.pBindings = &dsl_binding;
12087
12088 VkDescriptorSetLayout ds_layout;
12089 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12090 ASSERT_VK_SUCCESS(err);
12091
12092 VkDescriptorSetAllocateInfo alloc_info = {};
12093 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12094 alloc_info.descriptorSetCount = 1;
12095 alloc_info.descriptorPool = ds_pool;
12096 alloc_info.pSetLayouts = &ds_layout;
12097 VkDescriptorSet descriptor_set;
12098 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12099 ASSERT_VK_SUCCESS(err);
12100
12101 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12102 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12103 pipeline_layout_ci.pNext = NULL;
12104 pipeline_layout_ci.setLayoutCount = 1;
12105 pipeline_layout_ci.pSetLayouts = &ds_layout;
12106 VkPipelineLayout pipeline_layout;
12107 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12108 ASSERT_VK_SUCCESS(err);
12109
12110 VkImageObj image(m_device);
12111 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12112 ASSERT_TRUE(image.initialized());
12113 VkImageView view = image.targetView(tex_format);
12114
12115 VkDescriptorImageInfo image_info = {};
12116 image_info.imageView = view;
12117 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12118
12119 VkWriteDescriptorSet descriptor_write = {};
12120 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12121 descriptor_write.dstSet = descriptor_set;
12122 descriptor_write.dstBinding = 0;
12123 descriptor_write.descriptorCount = 1;
12124 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12125 descriptor_write.pImageInfo = &image_info;
12126
12127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12128 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12129 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12130 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12131 m_errorMonitor->VerifyFound();
12132
12133 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12134 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12135 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12136 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12137}
12138
Mark Mueller93b938f2016-08-18 10:27:40 -060012139TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012140 TEST_DESCRIPTION(
12141 "Use vkCmdExecuteCommands with invalid state "
12142 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012143
Tony Barbour1fa09702017-03-16 12:09:08 -060012144 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012145 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12146
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012147 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012148 const char *simultaneous_use_message2 =
12149 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12150 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012151
12152 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012153 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012154 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012155 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12156 command_buffer_allocate_info.commandBufferCount = 1;
12157
12158 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012159 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012160 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12161 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012162 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012163 command_buffer_inheritance_info.renderPass = m_renderPass;
12164 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012165
Mark Mueller93b938f2016-08-18 10:27:40 -060012166 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012167 command_buffer_begin_info.flags =
12168 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012169 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12170
12171 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12172 vkEndCommandBuffer(secondary_command_buffer);
12173
Mark Mueller93b938f2016-08-18 10:27:40 -060012174 VkSubmitInfo submit_info = {};
12175 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12176 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012177 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012178
Mark Mueller4042b652016-09-05 22:52:21 -060012179 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012180 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12182 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012183 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012184 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012185 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12186 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012187
Dave Houltonfbf52152017-01-06 12:55:29 -070012188 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012189 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012190 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012191
Mark Mueller4042b652016-09-05 22:52:21 -060012192 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012193 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12194 m_errorMonitor->SetUnexpectedError(
12195 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12196 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012197 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012198 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012199
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12201 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012202 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012203 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12204 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012205
12206 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012207
12208 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012209}
12210
Tony Barbour626994c2017-02-08 15:29:37 -070012211TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12212 TEST_DESCRIPTION(
12213 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12214 "errors");
12215 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12216 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
Tony Barbour1fa09702017-03-16 12:09:08 -060012217 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012218
12219 VkCommandBuffer cmd_bufs[2];
12220 VkCommandBufferAllocateInfo alloc_info;
12221 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12222 alloc_info.pNext = NULL;
12223 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012224 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012225 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12226 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12227
12228 VkCommandBufferBeginInfo cb_binfo;
12229 cb_binfo.pNext = NULL;
12230 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12231 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12232 cb_binfo.flags = 0;
12233 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12234 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12235 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12236 vkEndCommandBuffer(cmd_bufs[0]);
12237 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12238
12239 VkSubmitInfo submit_info = {};
12240 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12241 submit_info.commandBufferCount = 2;
12242 submit_info.pCommandBuffers = duplicates;
12243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12244 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12245 m_errorMonitor->VerifyFound();
12246 vkQueueWaitIdle(m_device->m_queue);
12247
12248 // Set one time use and now look for one time submit
12249 duplicates[0] = duplicates[1] = cmd_bufs[1];
12250 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12251 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12252 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12253 vkEndCommandBuffer(cmd_bufs[1]);
12254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12255 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12256 m_errorMonitor->VerifyFound();
12257 vkQueueWaitIdle(m_device->m_queue);
12258}
12259
Tobin Ehlisb093da82017-01-19 12:05:27 -070012260TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012261 TEST_DESCRIPTION(
12262 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12263 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012264
Tony Barbour1fa09702017-03-16 12:09:08 -060012265 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012266 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12267
12268 std::vector<const char *> device_extension_names;
12269 auto features = m_device->phy().features();
12270 // Make sure gs & ts are disabled
12271 features.geometryShader = false;
12272 features.tessellationShader = false;
12273 // The sacrificial device object
12274 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12275
12276 VkCommandPoolCreateInfo pool_create_info{};
12277 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12278 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12279
12280 VkCommandPool command_pool;
12281 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12282
12283 VkCommandBufferAllocateInfo cmd = {};
12284 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12285 cmd.pNext = NULL;
12286 cmd.commandPool = command_pool;
12287 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12288 cmd.commandBufferCount = 1;
12289
12290 VkCommandBuffer cmd_buffer;
12291 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12292 ASSERT_VK_SUCCESS(err);
12293
12294 VkEvent event;
12295 VkEventCreateInfo evci = {};
12296 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12297 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12298 ASSERT_VK_SUCCESS(result);
12299
12300 VkCommandBufferBeginInfo cbbi = {};
12301 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12302 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12304 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12305 m_errorMonitor->VerifyFound();
12306
12307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12308 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12309 m_errorMonitor->VerifyFound();
12310
12311 vkDestroyEvent(test_device.handle(), event, NULL);
12312 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12313}
12314
Mark Mueller917f6bc2016-08-30 10:57:19 -060012315TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012316 TEST_DESCRIPTION(
12317 "Use vkCmdExecuteCommands with invalid state "
12318 "in primary and secondary command buffers. "
12319 "Delete objects that are inuse. Call VkQueueSubmit "
12320 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012321
Tony Barbour1fa09702017-03-16 12:09:08 -060012322 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012323 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12324
Tony Barbour552f6c02016-12-21 14:34:07 -070012325 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012326
12327 VkEvent event;
12328 VkEventCreateInfo event_create_info = {};
12329 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12330 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012331 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012332
Tony Barbour552f6c02016-12-21 14:34:07 -070012333 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012334 vkDestroyEvent(m_device->device(), event, nullptr);
12335
12336 VkSubmitInfo submit_info = {};
12337 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12338 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012339 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012341 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12342 m_errorMonitor->VerifyFound();
12343
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012344 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012345 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12346
12347 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12348
Mark Mueller917f6bc2016-08-30 10:57:19 -060012349 VkSemaphoreCreateInfo semaphore_create_info = {};
12350 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12351 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012352 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012353 VkFenceCreateInfo fence_create_info = {};
12354 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12355 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012356 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012357
12358 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012359 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012360 descriptor_pool_type_count.descriptorCount = 1;
12361
12362 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12363 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12364 descriptor_pool_create_info.maxSets = 1;
12365 descriptor_pool_create_info.poolSizeCount = 1;
12366 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012367 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012368
12369 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012370 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012371
12372 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012373 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012374 descriptorset_layout_binding.descriptorCount = 1;
12375 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12376
12377 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012378 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012379 descriptorset_layout_create_info.bindingCount = 1;
12380 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12381
12382 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012383 ASSERT_VK_SUCCESS(
12384 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012385
12386 VkDescriptorSet descriptorset;
12387 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012388 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012389 descriptorset_allocate_info.descriptorSetCount = 1;
12390 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12391 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012392 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012393
Mark Mueller4042b652016-09-05 22:52:21 -060012394 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12395
12396 VkDescriptorBufferInfo buffer_info = {};
12397 buffer_info.buffer = buffer_test.GetBuffer();
12398 buffer_info.offset = 0;
12399 buffer_info.range = 1024;
12400
12401 VkWriteDescriptorSet write_descriptor_set = {};
12402 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12403 write_descriptor_set.dstSet = descriptorset;
12404 write_descriptor_set.descriptorCount = 1;
12405 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12406 write_descriptor_set.pBufferInfo = &buffer_info;
12407
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012408 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012409
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012410 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12411 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012412
12413 VkPipelineObj pipe(m_device);
12414 pipe.AddColorAttachment();
12415 pipe.AddShader(&vs);
12416 pipe.AddShader(&fs);
12417
12418 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012419 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012420 pipeline_layout_create_info.setLayoutCount = 1;
12421 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12422
12423 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012424 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012425
12426 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12427
Tony Barbour552f6c02016-12-21 14:34:07 -070012428 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012429 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012430
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012431 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12432 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12433 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012434
Tony Barbour552f6c02016-12-21 14:34:07 -070012435 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012436
Mark Mueller917f6bc2016-08-30 10:57:19 -060012437 submit_info.signalSemaphoreCount = 1;
12438 submit_info.pSignalSemaphores = &semaphore;
12439 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012440 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012441
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012443 vkDestroyEvent(m_device->device(), event, nullptr);
12444 m_errorMonitor->VerifyFound();
12445
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012447 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12448 m_errorMonitor->VerifyFound();
12449
Jeremy Hayes08369882017-02-02 10:31:06 -070012450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012451 vkDestroyFence(m_device->device(), fence, nullptr);
12452 m_errorMonitor->VerifyFound();
12453
Tobin Ehlis122207b2016-09-01 08:50:06 -070012454 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012455 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12456 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012457 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012458 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12459 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012460 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012461 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12462 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012463 vkDestroyEvent(m_device->device(), event, nullptr);
12464 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012465 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012466 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12467}
12468
Tobin Ehlis2adda372016-09-01 08:51:06 -070012469TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12470 TEST_DESCRIPTION("Delete in-use query pool.");
12471
Tony Barbour1fa09702017-03-16 12:09:08 -060012472 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12474
12475 VkQueryPool query_pool;
12476 VkQueryPoolCreateInfo query_pool_ci{};
12477 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12478 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12479 query_pool_ci.queryCount = 1;
12480 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012481 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012482 // Reset query pool to create binding with cmd buffer
12483 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12484
Tony Barbour552f6c02016-12-21 14:34:07 -070012485 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012486
12487 VkSubmitInfo submit_info = {};
12488 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12489 submit_info.commandBufferCount = 1;
12490 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12491 // Submit cmd buffer and then destroy query pool while in-flight
12492 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12493
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012495 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12496 m_errorMonitor->VerifyFound();
12497
12498 vkQueueWaitIdle(m_device->m_queue);
12499 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012500 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12501 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012502 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12503}
12504
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012505TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12506 TEST_DESCRIPTION("Delete in-use pipeline.");
12507
Tony Barbour1fa09702017-03-16 12:09:08 -060012508 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12510
12511 // Empty pipeline layout used for binding PSO
12512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12514 pipeline_layout_ci.setLayoutCount = 0;
12515 pipeline_layout_ci.pSetLayouts = NULL;
12516
12517 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012518 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012519 ASSERT_VK_SUCCESS(err);
12520
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012522 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012523 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12524 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012525 // Store pipeline handle so we can actually delete it before test finishes
12526 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012527 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012528 VkPipelineObj pipe(m_device);
12529 pipe.AddShader(&vs);
12530 pipe.AddShader(&fs);
12531 pipe.AddColorAttachment();
12532 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12533 delete_this_pipeline = pipe.handle();
12534
Tony Barbour552f6c02016-12-21 14:34:07 -070012535 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012536 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012537 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012538
Tony Barbour552f6c02016-12-21 14:34:07 -070012539 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012540
12541 VkSubmitInfo submit_info = {};
12542 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12543 submit_info.commandBufferCount = 1;
12544 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12545 // Submit cmd buffer and then pipeline destroyed while in-flight
12546 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012547 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012548 m_errorMonitor->VerifyFound();
12549 // Make sure queue finished and then actually delete pipeline
12550 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012551 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12552 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012553 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12554 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12555}
12556
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012557TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12558 TEST_DESCRIPTION("Delete in-use imageView.");
12559
Tony Barbour1fa09702017-03-16 12:09:08 -060012560 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012561 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12562
12563 VkDescriptorPoolSize ds_type_count;
12564 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12565 ds_type_count.descriptorCount = 1;
12566
12567 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12568 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12569 ds_pool_ci.maxSets = 1;
12570 ds_pool_ci.poolSizeCount = 1;
12571 ds_pool_ci.pPoolSizes = &ds_type_count;
12572
12573 VkDescriptorPool ds_pool;
12574 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12575 ASSERT_VK_SUCCESS(err);
12576
12577 VkSamplerCreateInfo sampler_ci = {};
12578 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12579 sampler_ci.pNext = NULL;
12580 sampler_ci.magFilter = VK_FILTER_NEAREST;
12581 sampler_ci.minFilter = VK_FILTER_NEAREST;
12582 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12583 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12584 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12585 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12586 sampler_ci.mipLodBias = 1.0;
12587 sampler_ci.anisotropyEnable = VK_FALSE;
12588 sampler_ci.maxAnisotropy = 1;
12589 sampler_ci.compareEnable = VK_FALSE;
12590 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12591 sampler_ci.minLod = 1.0;
12592 sampler_ci.maxLod = 1.0;
12593 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12594 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12595 VkSampler sampler;
12596
12597 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12598 ASSERT_VK_SUCCESS(err);
12599
12600 VkDescriptorSetLayoutBinding layout_binding;
12601 layout_binding.binding = 0;
12602 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12603 layout_binding.descriptorCount = 1;
12604 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12605 layout_binding.pImmutableSamplers = NULL;
12606
12607 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12608 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12609 ds_layout_ci.bindingCount = 1;
12610 ds_layout_ci.pBindings = &layout_binding;
12611 VkDescriptorSetLayout ds_layout;
12612 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12613 ASSERT_VK_SUCCESS(err);
12614
12615 VkDescriptorSetAllocateInfo alloc_info = {};
12616 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12617 alloc_info.descriptorSetCount = 1;
12618 alloc_info.descriptorPool = ds_pool;
12619 alloc_info.pSetLayouts = &ds_layout;
12620 VkDescriptorSet descriptor_set;
12621 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12622 ASSERT_VK_SUCCESS(err);
12623
12624 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12625 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12626 pipeline_layout_ci.pNext = NULL;
12627 pipeline_layout_ci.setLayoutCount = 1;
12628 pipeline_layout_ci.pSetLayouts = &ds_layout;
12629
12630 VkPipelineLayout pipeline_layout;
12631 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12632 ASSERT_VK_SUCCESS(err);
12633
12634 VkImageObj image(m_device);
12635 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12636 ASSERT_TRUE(image.initialized());
12637
12638 VkImageView view;
12639 VkImageViewCreateInfo ivci = {};
12640 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12641 ivci.image = image.handle();
12642 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12643 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12644 ivci.subresourceRange.layerCount = 1;
12645 ivci.subresourceRange.baseMipLevel = 0;
12646 ivci.subresourceRange.levelCount = 1;
12647 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12648
12649 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12650 ASSERT_VK_SUCCESS(err);
12651
12652 VkDescriptorImageInfo image_info{};
12653 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12654 image_info.imageView = view;
12655 image_info.sampler = sampler;
12656
12657 VkWriteDescriptorSet descriptor_write = {};
12658 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12659 descriptor_write.dstSet = descriptor_set;
12660 descriptor_write.dstBinding = 0;
12661 descriptor_write.descriptorCount = 1;
12662 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12663 descriptor_write.pImageInfo = &image_info;
12664
12665 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12666
12667 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012668 char const *vsSource =
12669 "#version 450\n"
12670 "\n"
12671 "out gl_PerVertex { \n"
12672 " vec4 gl_Position;\n"
12673 "};\n"
12674 "void main(){\n"
12675 " gl_Position = vec4(1);\n"
12676 "}\n";
12677 char const *fsSource =
12678 "#version 450\n"
12679 "\n"
12680 "layout(set=0, binding=0) uniform sampler2D s;\n"
12681 "layout(location=0) out vec4 x;\n"
12682 "void main(){\n"
12683 " x = texture(s, vec2(1));\n"
12684 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012685 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12686 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12687 VkPipelineObj pipe(m_device);
12688 pipe.AddShader(&vs);
12689 pipe.AddShader(&fs);
12690 pipe.AddColorAttachment();
12691 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12692
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012694
Tony Barbour552f6c02016-12-21 14:34:07 -070012695 m_commandBuffer->BeginCommandBuffer();
12696 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012697 // Bind pipeline to cmd buffer
12698 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12699 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12700 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012701
12702 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12703 VkRect2D scissor = {{0, 0}, {16, 16}};
12704 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12705 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12706
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012707 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012708 m_commandBuffer->EndRenderPass();
12709 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012710 // Submit cmd buffer then destroy sampler
12711 VkSubmitInfo submit_info = {};
12712 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12713 submit_info.commandBufferCount = 1;
12714 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12715 // Submit cmd buffer and then destroy imageView while in-flight
12716 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12717
12718 vkDestroyImageView(m_device->device(), view, nullptr);
12719 m_errorMonitor->VerifyFound();
12720 vkQueueWaitIdle(m_device->m_queue);
12721 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012722 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12723 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012724 vkDestroyImageView(m_device->device(), view, NULL);
12725 vkDestroySampler(m_device->device(), sampler, nullptr);
12726 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12727 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12728 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12729}
12730
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012731TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12732 TEST_DESCRIPTION("Delete in-use bufferView.");
12733
Tony Barbour1fa09702017-03-16 12:09:08 -060012734 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12736
12737 VkDescriptorPoolSize ds_type_count;
12738 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12739 ds_type_count.descriptorCount = 1;
12740
12741 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12742 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12743 ds_pool_ci.maxSets = 1;
12744 ds_pool_ci.poolSizeCount = 1;
12745 ds_pool_ci.pPoolSizes = &ds_type_count;
12746
12747 VkDescriptorPool ds_pool;
12748 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12749 ASSERT_VK_SUCCESS(err);
12750
12751 VkDescriptorSetLayoutBinding layout_binding;
12752 layout_binding.binding = 0;
12753 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12754 layout_binding.descriptorCount = 1;
12755 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12756 layout_binding.pImmutableSamplers = NULL;
12757
12758 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12759 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12760 ds_layout_ci.bindingCount = 1;
12761 ds_layout_ci.pBindings = &layout_binding;
12762 VkDescriptorSetLayout ds_layout;
12763 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12764 ASSERT_VK_SUCCESS(err);
12765
12766 VkDescriptorSetAllocateInfo alloc_info = {};
12767 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12768 alloc_info.descriptorSetCount = 1;
12769 alloc_info.descriptorPool = ds_pool;
12770 alloc_info.pSetLayouts = &ds_layout;
12771 VkDescriptorSet descriptor_set;
12772 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12773 ASSERT_VK_SUCCESS(err);
12774
12775 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12776 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12777 pipeline_layout_ci.pNext = NULL;
12778 pipeline_layout_ci.setLayoutCount = 1;
12779 pipeline_layout_ci.pSetLayouts = &ds_layout;
12780
12781 VkPipelineLayout pipeline_layout;
12782 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12783 ASSERT_VK_SUCCESS(err);
12784
12785 VkBuffer buffer;
12786 uint32_t queue_family_index = 0;
12787 VkBufferCreateInfo buffer_create_info = {};
12788 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12789 buffer_create_info.size = 1024;
12790 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12791 buffer_create_info.queueFamilyIndexCount = 1;
12792 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12793
12794 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12795 ASSERT_VK_SUCCESS(err);
12796
12797 VkMemoryRequirements memory_reqs;
12798 VkDeviceMemory buffer_memory;
12799
12800 VkMemoryAllocateInfo memory_info = {};
12801 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12802 memory_info.allocationSize = 0;
12803 memory_info.memoryTypeIndex = 0;
12804
12805 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12806 memory_info.allocationSize = memory_reqs.size;
12807 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12808 ASSERT_TRUE(pass);
12809
12810 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12811 ASSERT_VK_SUCCESS(err);
12812 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12813 ASSERT_VK_SUCCESS(err);
12814
12815 VkBufferView view;
12816 VkBufferViewCreateInfo bvci = {};
12817 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12818 bvci.buffer = buffer;
12819 bvci.format = VK_FORMAT_R8_UNORM;
12820 bvci.range = VK_WHOLE_SIZE;
12821
12822 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12823 ASSERT_VK_SUCCESS(err);
12824
12825 VkWriteDescriptorSet descriptor_write = {};
12826 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12827 descriptor_write.dstSet = descriptor_set;
12828 descriptor_write.dstBinding = 0;
12829 descriptor_write.descriptorCount = 1;
12830 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12831 descriptor_write.pTexelBufferView = &view;
12832
12833 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12834
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012835 char const *vsSource =
12836 "#version 450\n"
12837 "\n"
12838 "out gl_PerVertex { \n"
12839 " vec4 gl_Position;\n"
12840 "};\n"
12841 "void main(){\n"
12842 " gl_Position = vec4(1);\n"
12843 "}\n";
12844 char const *fsSource =
12845 "#version 450\n"
12846 "\n"
12847 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12848 "layout(location=0) out vec4 x;\n"
12849 "void main(){\n"
12850 " x = imageLoad(s, 0);\n"
12851 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012852 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12853 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12854 VkPipelineObj pipe(m_device);
12855 pipe.AddShader(&vs);
12856 pipe.AddShader(&fs);
12857 pipe.AddColorAttachment();
12858 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12859
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012861
Tony Barbour552f6c02016-12-21 14:34:07 -070012862 m_commandBuffer->BeginCommandBuffer();
12863 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012864 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12865 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12866 VkRect2D scissor = {{0, 0}, {16, 16}};
12867 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12868 // Bind pipeline to cmd buffer
12869 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12870 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12871 &descriptor_set, 0, nullptr);
12872 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012873 m_commandBuffer->EndRenderPass();
12874 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012875
12876 VkSubmitInfo submit_info = {};
12877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12878 submit_info.commandBufferCount = 1;
12879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12880 // Submit cmd buffer and then destroy bufferView while in-flight
12881 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12882
12883 vkDestroyBufferView(m_device->device(), view, nullptr);
12884 m_errorMonitor->VerifyFound();
12885 vkQueueWaitIdle(m_device->m_queue);
12886 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012887 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12888 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012889 vkDestroyBufferView(m_device->device(), view, NULL);
12890 vkDestroyBuffer(m_device->device(), buffer, NULL);
12891 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12892 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12893 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12894 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12895}
12896
Tobin Ehlis209532e2016-09-07 13:52:18 -060012897TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12898 TEST_DESCRIPTION("Delete in-use sampler.");
12899
Tony Barbour1fa09702017-03-16 12:09:08 -060012900 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012901 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12902
12903 VkDescriptorPoolSize ds_type_count;
12904 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12905 ds_type_count.descriptorCount = 1;
12906
12907 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12908 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12909 ds_pool_ci.maxSets = 1;
12910 ds_pool_ci.poolSizeCount = 1;
12911 ds_pool_ci.pPoolSizes = &ds_type_count;
12912
12913 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012914 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012915 ASSERT_VK_SUCCESS(err);
12916
12917 VkSamplerCreateInfo sampler_ci = {};
12918 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12919 sampler_ci.pNext = NULL;
12920 sampler_ci.magFilter = VK_FILTER_NEAREST;
12921 sampler_ci.minFilter = VK_FILTER_NEAREST;
12922 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12923 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12924 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12925 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12926 sampler_ci.mipLodBias = 1.0;
12927 sampler_ci.anisotropyEnable = VK_FALSE;
12928 sampler_ci.maxAnisotropy = 1;
12929 sampler_ci.compareEnable = VK_FALSE;
12930 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12931 sampler_ci.minLod = 1.0;
12932 sampler_ci.maxLod = 1.0;
12933 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12934 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12935 VkSampler sampler;
12936
12937 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12938 ASSERT_VK_SUCCESS(err);
12939
12940 VkDescriptorSetLayoutBinding layout_binding;
12941 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012942 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012943 layout_binding.descriptorCount = 1;
12944 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12945 layout_binding.pImmutableSamplers = NULL;
12946
12947 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12948 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12949 ds_layout_ci.bindingCount = 1;
12950 ds_layout_ci.pBindings = &layout_binding;
12951 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012952 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012953 ASSERT_VK_SUCCESS(err);
12954
12955 VkDescriptorSetAllocateInfo alloc_info = {};
12956 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12957 alloc_info.descriptorSetCount = 1;
12958 alloc_info.descriptorPool = ds_pool;
12959 alloc_info.pSetLayouts = &ds_layout;
12960 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012961 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012962 ASSERT_VK_SUCCESS(err);
12963
12964 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12965 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12966 pipeline_layout_ci.pNext = NULL;
12967 pipeline_layout_ci.setLayoutCount = 1;
12968 pipeline_layout_ci.pSetLayouts = &ds_layout;
12969
12970 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012971 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012972 ASSERT_VK_SUCCESS(err);
12973
12974 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012975 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012976 ASSERT_TRUE(image.initialized());
12977
12978 VkImageView view;
12979 VkImageViewCreateInfo ivci = {};
12980 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12981 ivci.image = image.handle();
12982 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12983 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12984 ivci.subresourceRange.layerCount = 1;
12985 ivci.subresourceRange.baseMipLevel = 0;
12986 ivci.subresourceRange.levelCount = 1;
12987 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12988
12989 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12990 ASSERT_VK_SUCCESS(err);
12991
12992 VkDescriptorImageInfo image_info{};
12993 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12994 image_info.imageView = view;
12995 image_info.sampler = sampler;
12996
12997 VkWriteDescriptorSet descriptor_write = {};
12998 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12999 descriptor_write.dstSet = descriptor_set;
13000 descriptor_write.dstBinding = 0;
13001 descriptor_write.descriptorCount = 1;
13002 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13003 descriptor_write.pImageInfo = &image_info;
13004
13005 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13006
13007 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013008 char const *vsSource =
13009 "#version 450\n"
13010 "\n"
13011 "out gl_PerVertex { \n"
13012 " vec4 gl_Position;\n"
13013 "};\n"
13014 "void main(){\n"
13015 " gl_Position = vec4(1);\n"
13016 "}\n";
13017 char const *fsSource =
13018 "#version 450\n"
13019 "\n"
13020 "layout(set=0, binding=0) uniform sampler2D s;\n"
13021 "layout(location=0) out vec4 x;\n"
13022 "void main(){\n"
13023 " x = texture(s, vec2(1));\n"
13024 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013025 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13026 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13027 VkPipelineObj pipe(m_device);
13028 pipe.AddShader(&vs);
13029 pipe.AddShader(&fs);
13030 pipe.AddColorAttachment();
13031 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13032
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013034
Tony Barbour552f6c02016-12-21 14:34:07 -070013035 m_commandBuffer->BeginCommandBuffer();
13036 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013037 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013038 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13039 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13040 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013041
13042 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13043 VkRect2D scissor = {{0, 0}, {16, 16}};
13044 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13045 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13046
Tobin Ehlis209532e2016-09-07 13:52:18 -060013047 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013048 m_commandBuffer->EndRenderPass();
13049 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013050 // Submit cmd buffer then destroy sampler
13051 VkSubmitInfo submit_info = {};
13052 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13053 submit_info.commandBufferCount = 1;
13054 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13055 // Submit cmd buffer and then destroy sampler while in-flight
13056 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13057
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013058 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013059 m_errorMonitor->VerifyFound();
13060 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013061
Tobin Ehlis209532e2016-09-07 13:52:18 -060013062 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013063 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13064 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013065 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013066 vkDestroyImageView(m_device->device(), view, NULL);
13067 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13068 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13069 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13070}
13071
Mark Mueller1cd9f412016-08-25 13:23:52 -060013072TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013073 TEST_DESCRIPTION(
13074 "Call VkQueueSubmit with a semaphore that is already "
13075 "signaled but not waited on by the queue. Wait on a "
13076 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013077
Tony Barbour1fa09702017-03-16 12:09:08 -060013078 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013079 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13080
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013081 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013082 const char *invalid_fence_wait_message =
13083 " which has not been submitted on a Queue or during "
13084 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013085
Tony Barbour552f6c02016-12-21 14:34:07 -070013086 m_commandBuffer->BeginCommandBuffer();
13087 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013088
13089 VkSemaphoreCreateInfo semaphore_create_info = {};
13090 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13091 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013092 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013093 VkSubmitInfo submit_info = {};
13094 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13095 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013096 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013097 submit_info.signalSemaphoreCount = 1;
13098 submit_info.pSignalSemaphores = &semaphore;
13099 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013100 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013101 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013102 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013103 m_commandBuffer->BeginCommandBuffer();
13104 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013106 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13107 m_errorMonitor->VerifyFound();
13108
Mark Mueller1cd9f412016-08-25 13:23:52 -060013109 VkFenceCreateInfo fence_create_info = {};
13110 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13111 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013112 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013113
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013115 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13116 m_errorMonitor->VerifyFound();
13117
Mark Mueller4042b652016-09-05 22:52:21 -060013118 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013119 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013120 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13121}
13122
Tobin Ehlis4af23302016-07-19 10:50:30 -060013123TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013124 TEST_DESCRIPTION(
13125 "Bind a secondary command buffer with with a framebuffer "
13126 "that does not match the framebuffer for the active "
13127 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013129 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13130
13131 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013132 VkAttachmentDescription attachment = {0,
13133 VK_FORMAT_B8G8R8A8_UNORM,
13134 VK_SAMPLE_COUNT_1_BIT,
13135 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13136 VK_ATTACHMENT_STORE_OP_STORE,
13137 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13138 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13139 VK_IMAGE_LAYOUT_UNDEFINED,
13140 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013141
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013142 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013143
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013144 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013145
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013146 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013147
13148 VkRenderPass rp;
13149 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13150 ASSERT_VK_SUCCESS(err);
13151
13152 // A compatible framebuffer.
13153 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013154 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013155 ASSERT_TRUE(image.initialized());
13156
13157 VkImageViewCreateInfo ivci = {
13158 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13159 nullptr,
13160 0,
13161 image.handle(),
13162 VK_IMAGE_VIEW_TYPE_2D,
13163 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013164 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13165 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013166 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13167 };
13168 VkImageView view;
13169 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13170 ASSERT_VK_SUCCESS(err);
13171
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013172 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013173 VkFramebuffer fb;
13174 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13175 ASSERT_VK_SUCCESS(err);
13176
13177 VkCommandBufferAllocateInfo cbai = {};
13178 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013179 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013180 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13181 cbai.commandBufferCount = 1;
13182
13183 VkCommandBuffer sec_cb;
13184 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13185 ASSERT_VK_SUCCESS(err);
13186 VkCommandBufferBeginInfo cbbi = {};
13187 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013188 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013189 cbii.renderPass = renderPass();
13190 cbii.framebuffer = fb;
13191 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13192 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013193 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013194 cbbi.pInheritanceInfo = &cbii;
13195 vkBeginCommandBuffer(sec_cb, &cbbi);
13196 vkEndCommandBuffer(sec_cb);
13197
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013198 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013199 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13200 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013201
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013203 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013204 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13205 m_errorMonitor->VerifyFound();
13206 // Cleanup
13207 vkDestroyImageView(m_device->device(), view, NULL);
13208 vkDestroyRenderPass(m_device->device(), rp, NULL);
13209 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13210}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013211
13212TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013213 TEST_DESCRIPTION(
13214 "If logicOp is available on the device, set it to an "
13215 "invalid value. If logicOp is not available, attempt to "
13216 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013217 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013218 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13219
13220 auto features = m_device->phy().features();
13221 // Set the expected error depending on whether or not logicOp available
13222 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13224 "If logic operations feature not "
13225 "enabled, logicOpEnable must be "
13226 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013227 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013229 }
13230 // Create a pipeline using logicOp
13231 VkResult err;
13232
13233 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13234 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13235
13236 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013237 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013238 ASSERT_VK_SUCCESS(err);
13239
13240 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13241 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13242 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013243 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013244 vp_state_ci.pViewports = &vp;
13245 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013246 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013247 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013248
13249 VkPipelineShaderStageCreateInfo shaderStages[2];
13250 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13251
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013252 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13253 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013254 shaderStages[0] = vs.GetStageCreateInfo();
13255 shaderStages[1] = fs.GetStageCreateInfo();
13256
13257 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13258 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13259
13260 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13261 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13262 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13263
13264 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13265 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013266 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013267
13268 VkPipelineColorBlendAttachmentState att = {};
13269 att.blendEnable = VK_FALSE;
13270 att.colorWriteMask = 0xf;
13271
13272 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13273 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13274 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13275 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013276 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013277 cb_ci.attachmentCount = 1;
13278 cb_ci.pAttachments = &att;
13279
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013280 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13281 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13282 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13283
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013284 VkGraphicsPipelineCreateInfo gp_ci = {};
13285 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13286 gp_ci.stageCount = 2;
13287 gp_ci.pStages = shaderStages;
13288 gp_ci.pVertexInputState = &vi_ci;
13289 gp_ci.pInputAssemblyState = &ia_ci;
13290 gp_ci.pViewportState = &vp_state_ci;
13291 gp_ci.pRasterizationState = &rs_ci;
13292 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013293 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013294 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13295 gp_ci.layout = pipeline_layout;
13296 gp_ci.renderPass = renderPass();
13297
13298 VkPipelineCacheCreateInfo pc_ci = {};
13299 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13300
13301 VkPipeline pipeline;
13302 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013303 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013304 ASSERT_VK_SUCCESS(err);
13305
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013306 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013307 m_errorMonitor->VerifyFound();
13308 if (VK_SUCCESS == err) {
13309 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13310 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013311 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13312 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13313}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013314
Mike Stroyanaccf7692015-05-12 16:00:45 -060013315#if GTEST_IS_THREADSAFE
13316struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013317 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013318 VkEvent event;
13319 bool bailout;
13320};
13321
Karl Schultz6addd812016-02-02 17:17:23 -070013322extern "C" void *AddToCommandBuffer(void *arg) {
13323 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013324
Mike Stroyana6d14942016-07-13 15:10:05 -060013325 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013326 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013327 if (data->bailout) {
13328 break;
13329 }
13330 }
13331 return NULL;
13332}
13333
Karl Schultz6addd812016-02-02 17:17:23 -070013334TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013335 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013336
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013338
Tony Barbour1fa09702017-03-16 12:09:08 -060013339 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013340 ASSERT_NO_FATAL_FAILURE(InitViewport());
13341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13342
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013343 // Calls AllocateCommandBuffers
13344 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013345
13346 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013347 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013348
13349 VkEventCreateInfo event_info;
13350 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013351 VkResult err;
13352
13353 memset(&event_info, 0, sizeof(event_info));
13354 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13355
Chia-I Wuf7458c52015-10-26 21:10:41 +080013356 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013357 ASSERT_VK_SUCCESS(err);
13358
Mike Stroyanaccf7692015-05-12 16:00:45 -060013359 err = vkResetEvent(device(), event);
13360 ASSERT_VK_SUCCESS(err);
13361
13362 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013363 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013364 data.event = event;
13365 data.bailout = false;
13366 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013367
13368 // First do some correct operations using multiple threads.
13369 // Add many entries to command buffer from another thread.
13370 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13371 // Make non-conflicting calls from this thread at the same time.
13372 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013373 uint32_t count;
13374 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013375 }
13376 test_platform_thread_join(thread, NULL);
13377
13378 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013379 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013380 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013381 // Add many entries to command buffer from this thread at the same time.
13382 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013383
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013384 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013385 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013386
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013387 m_errorMonitor->SetBailout(NULL);
13388
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013389 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013390
Chia-I Wuf7458c52015-10-26 21:10:41 +080013391 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013392}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013393#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013394
Karl Schultz6addd812016-02-02 17:17:23 -070013395TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013396 TEST_DESCRIPTION(
13397 "Test that an error is produced for a spirv module "
13398 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013399
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013401
Tony Barbour1fa09702017-03-16 12:09:08 -060013402 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13404
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013405 VkShaderModule module;
13406 VkShaderModuleCreateInfo moduleCreateInfo;
13407 struct icd_spv_header spv;
13408
13409 spv.magic = ICD_SPV_MAGIC;
13410 spv.version = ICD_SPV_VERSION;
13411 spv.gen_magic = 0;
13412
13413 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13414 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013415 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013416 moduleCreateInfo.codeSize = 4;
13417 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013418 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013419
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013420 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013421}
13422
Karl Schultz6addd812016-02-02 17:17:23 -070013423TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013424 TEST_DESCRIPTION(
13425 "Test that an error is produced for a spirv module "
13426 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013427
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013429
Tony Barbour1fa09702017-03-16 12:09:08 -060013430 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013431 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13432
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013433 VkShaderModule module;
13434 VkShaderModuleCreateInfo moduleCreateInfo;
13435 struct icd_spv_header spv;
13436
13437 spv.magic = ~ICD_SPV_MAGIC;
13438 spv.version = ICD_SPV_VERSION;
13439 spv.gen_magic = 0;
13440
13441 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13442 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013443 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013444 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13445 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013446 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013447
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013448 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013449}
13450
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013451#if 0
13452// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013453TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013455 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013456
Tony Barbour1fa09702017-03-16 12:09:08 -060013457 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013458 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13459
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013460 VkShaderModule module;
13461 VkShaderModuleCreateInfo moduleCreateInfo;
13462 struct icd_spv_header spv;
13463
13464 spv.magic = ICD_SPV_MAGIC;
13465 spv.version = ~ICD_SPV_VERSION;
13466 spv.gen_magic = 0;
13467
13468 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13469 moduleCreateInfo.pNext = NULL;
13470
Karl Schultz6addd812016-02-02 17:17:23 -070013471 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013472 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13473 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013474 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013475
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013476 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013477}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013478#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013479
Karl Schultz6addd812016-02-02 17:17:23 -070013480TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013481 TEST_DESCRIPTION(
13482 "Test that a warning is produced for a vertex output that "
13483 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013485
Tony Barbour1fa09702017-03-16 12:09:08 -060013486 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013488
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013489 char const *vsSource =
13490 "#version 450\n"
13491 "\n"
13492 "layout(location=0) out float x;\n"
13493 "out gl_PerVertex {\n"
13494 " vec4 gl_Position;\n"
13495 "};\n"
13496 "void main(){\n"
13497 " gl_Position = vec4(1);\n"
13498 " x = 0;\n"
13499 "}\n";
13500 char const *fsSource =
13501 "#version 450\n"
13502 "\n"
13503 "layout(location=0) out vec4 color;\n"
13504 "void main(){\n"
13505 " color = vec4(1);\n"
13506 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013507
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013508 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13509 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013510
13511 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013512 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013513 pipe.AddShader(&vs);
13514 pipe.AddShader(&fs);
13515
Chris Forbes9f7ff632015-05-25 11:13:08 +120013516 VkDescriptorSetObj descriptorSet(m_device);
13517 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013518 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013519
Tony Barbour5781e8f2015-08-04 16:23:11 -060013520 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013521
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013522 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013523}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013524
Mark Mueller098c9cb2016-09-08 09:01:57 -060013525TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13526 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13527
Tony Barbour1fa09702017-03-16 12:09:08 -060013528 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13530
13531 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013532 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013533
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013534 char const *vsSource =
13535 "#version 450\n"
13536 "\n"
13537 "out gl_PerVertex {\n"
13538 " vec4 gl_Position;\n"
13539 "};\n"
13540 "void main(){\n"
13541 " gl_Position = vec4(1);\n"
13542 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013543
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013544 char const *fsSource =
13545 "#version 450\n"
13546 "\n"
13547 "layout (constant_id = 0) const float r = 0.0f;\n"
13548 "layout(location = 0) out vec4 uFragColor;\n"
13549 "void main(){\n"
13550 " uFragColor = vec4(r,1,0,1);\n"
13551 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013552
13553 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13554 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13555
13556 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13557 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13558
13559 VkPipelineLayout pipeline_layout;
13560 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13561
13562 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13563 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13564 vp_state_create_info.viewportCount = 1;
13565 VkViewport viewport = {};
13566 vp_state_create_info.pViewports = &viewport;
13567 vp_state_create_info.scissorCount = 1;
13568 VkRect2D scissors = {};
13569 vp_state_create_info.pScissors = &scissors;
13570
13571 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13572
13573 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13574 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13575 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13576 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13577
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013578 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013579
13580 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13581 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13582
13583 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13584 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13585 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13586
13587 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13588 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13589 rasterization_state_create_info.pNext = nullptr;
13590 rasterization_state_create_info.lineWidth = 1.0f;
13591 rasterization_state_create_info.rasterizerDiscardEnable = true;
13592
13593 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13594 color_blend_attachment_state.blendEnable = VK_FALSE;
13595 color_blend_attachment_state.colorWriteMask = 0xf;
13596
13597 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13598 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13599 color_blend_state_create_info.attachmentCount = 1;
13600 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13601
13602 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13603 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13604 graphicspipe_create_info.stageCount = 2;
13605 graphicspipe_create_info.pStages = shader_stage_create_info;
13606 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13607 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13608 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13609 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13610 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13611 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13612 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13613 graphicspipe_create_info.layout = pipeline_layout;
13614 graphicspipe_create_info.renderPass = renderPass();
13615
13616 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13617 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13618
13619 VkPipelineCache pipelineCache;
13620 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13621
13622 // This structure maps constant ids to data locations.
13623 const VkSpecializationMapEntry entry =
13624 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013625 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013626
13627 uint32_t data = 1;
13628
13629 // Set up the info describing spec map and data
13630 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013631 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013632 };
13633 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13634
13635 VkPipeline pipeline;
13636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13637 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13638 m_errorMonitor->VerifyFound();
13639
13640 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13641 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13642}
13643
13644TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13645 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13646
Tony Barbour1fa09702017-03-16 12:09:08 -060013647 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13649
13650 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13651
13652 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13653 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13654 descriptor_pool_type_count[0].descriptorCount = 1;
13655 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13656 descriptor_pool_type_count[1].descriptorCount = 1;
13657
13658 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13659 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13660 descriptor_pool_create_info.maxSets = 1;
13661 descriptor_pool_create_info.poolSizeCount = 2;
13662 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13663 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13664
13665 VkDescriptorPool descriptorset_pool;
13666 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13667
13668 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13669 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13670 descriptorset_layout_binding.descriptorCount = 1;
13671 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013672 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013673
13674 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13675 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13676 descriptorset_layout_create_info.bindingCount = 1;
13677 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13678
13679 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013680 ASSERT_VK_SUCCESS(
13681 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013682
13683 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13684 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13685 descriptorset_allocate_info.descriptorSetCount = 1;
13686 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13687 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13688 VkDescriptorSet descriptorset;
13689 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13690
13691 // Challenge core_validation with a non uniform buffer type.
13692 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13693
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013694 char const *vsSource =
13695 "#version 450\n"
13696 "\n"
13697 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13698 " mat4 mvp;\n"
13699 "} ubuf;\n"
13700 "out gl_PerVertex {\n"
13701 " vec4 gl_Position;\n"
13702 "};\n"
13703 "void main(){\n"
13704 " gl_Position = ubuf.mvp * vec4(1);\n"
13705 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013706
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013707 char const *fsSource =
13708 "#version 450\n"
13709 "\n"
13710 "layout(location = 0) out vec4 uFragColor;\n"
13711 "void main(){\n"
13712 " uFragColor = vec4(0,1,0,1);\n"
13713 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013714
13715 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13716 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13717
13718 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13719 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13720 pipeline_layout_create_info.setLayoutCount = 1;
13721 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13722
13723 VkPipelineLayout pipeline_layout;
13724 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13725
13726 VkPipelineObj pipe(m_device);
13727 pipe.AddColorAttachment();
13728 pipe.AddShader(&vs);
13729 pipe.AddShader(&fs);
13730
13731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13732 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13733 m_errorMonitor->VerifyFound();
13734
13735 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13736 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13737 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13738}
13739
13740TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13741 TEST_DESCRIPTION(
13742 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13743
Tony Barbour1fa09702017-03-16 12:09:08 -060013744 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13746
13747 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13748
13749 VkDescriptorPoolSize descriptor_pool_type_count = {};
13750 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13751 descriptor_pool_type_count.descriptorCount = 1;
13752
13753 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13754 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13755 descriptor_pool_create_info.maxSets = 1;
13756 descriptor_pool_create_info.poolSizeCount = 1;
13757 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13758 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13759
13760 VkDescriptorPool descriptorset_pool;
13761 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13762
13763 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13764 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13765 descriptorset_layout_binding.descriptorCount = 1;
13766 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13767 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013768 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013769
13770 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13771 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13772 descriptorset_layout_create_info.bindingCount = 1;
13773 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13774
13775 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013776 ASSERT_VK_SUCCESS(
13777 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013778
13779 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13780 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13781 descriptorset_allocate_info.descriptorSetCount = 1;
13782 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13783 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13784 VkDescriptorSet descriptorset;
13785 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13786
13787 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13788
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013789 char const *vsSource =
13790 "#version 450\n"
13791 "\n"
13792 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13793 " mat4 mvp;\n"
13794 "} ubuf;\n"
13795 "out gl_PerVertex {\n"
13796 " vec4 gl_Position;\n"
13797 "};\n"
13798 "void main(){\n"
13799 " gl_Position = ubuf.mvp * vec4(1);\n"
13800 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013801
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013802 char const *fsSource =
13803 "#version 450\n"
13804 "\n"
13805 "layout(location = 0) out vec4 uFragColor;\n"
13806 "void main(){\n"
13807 " uFragColor = vec4(0,1,0,1);\n"
13808 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013809
13810 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13811 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13812
13813 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13814 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13815 pipeline_layout_create_info.setLayoutCount = 1;
13816 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13817
13818 VkPipelineLayout pipeline_layout;
13819 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13820
13821 VkPipelineObj pipe(m_device);
13822 pipe.AddColorAttachment();
13823 pipe.AddShader(&vs);
13824 pipe.AddShader(&fs);
13825
13826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13827 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13828 m_errorMonitor->VerifyFound();
13829
13830 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13831 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13832 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13833}
13834
13835TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013836 TEST_DESCRIPTION(
13837 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13838 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013839
Tony Barbour1fa09702017-03-16 12:09:08 -060013840 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013841 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13842
13843 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013844 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013845
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013846 char const *vsSource =
13847 "#version 450\n"
13848 "\n"
13849 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13850 "out gl_PerVertex {\n"
13851 " vec4 gl_Position;\n"
13852 "};\n"
13853 "void main(){\n"
13854 " gl_Position = vec4(consts.x);\n"
13855 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013856
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013857 char const *fsSource =
13858 "#version 450\n"
13859 "\n"
13860 "layout(location = 0) out vec4 uFragColor;\n"
13861 "void main(){\n"
13862 " uFragColor = vec4(0,1,0,1);\n"
13863 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013864
13865 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13866 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13867
13868 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13869 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13870
13871 // Set up a push constant range
13872 VkPushConstantRange push_constant_ranges = {};
13873 // Set to the wrong stage to challenge core_validation
13874 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13875 push_constant_ranges.size = 4;
13876
13877 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13878 pipeline_layout_create_info.pushConstantRangeCount = 1;
13879
13880 VkPipelineLayout pipeline_layout;
13881 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13882
13883 VkPipelineObj pipe(m_device);
13884 pipe.AddColorAttachment();
13885 pipe.AddShader(&vs);
13886 pipe.AddShader(&fs);
13887
13888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13889 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13890 m_errorMonitor->VerifyFound();
13891
13892 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13893}
13894
13895TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13896 TEST_DESCRIPTION(
13897 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13898
Tony Barbour1fa09702017-03-16 12:09:08 -060013899 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013900 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13901
13902 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013903 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013904
13905 // Some awkward steps are required to test with custom device features.
13906 std::vector<const char *> device_extension_names;
13907 auto features = m_device->phy().features();
13908 // Disable support for 64 bit floats
13909 features.shaderFloat64 = false;
13910 // The sacrificial device object
13911 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13912
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013913 char const *vsSource =
13914 "#version 450\n"
13915 "\n"
13916 "out gl_PerVertex {\n"
13917 " vec4 gl_Position;\n"
13918 "};\n"
13919 "void main(){\n"
13920 " gl_Position = vec4(1);\n"
13921 "}\n";
13922 char const *fsSource =
13923 "#version 450\n"
13924 "\n"
13925 "layout(location=0) out vec4 color;\n"
13926 "void main(){\n"
13927 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13928 " color = vec4(green);\n"
13929 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013930
13931 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13932 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13933
13934 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013935
13936 VkPipelineObj pipe(&test_device);
13937 pipe.AddColorAttachment();
13938 pipe.AddShader(&vs);
13939 pipe.AddShader(&fs);
13940
13941 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13942 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13943 VkPipelineLayout pipeline_layout;
13944 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13945
13946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13947 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13948 m_errorMonitor->VerifyFound();
13949
13950 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13951}
13952
Mark Lobodzinski20832822017-03-24 14:49:45 -060013953TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
13954 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
13955 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013956
Tony Barbour1fa09702017-03-16 12:09:08 -060013957 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013958 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13959
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013960 char const *vsSource =
13961 "#version 450\n"
13962 "\n"
13963 "out gl_PerVertex {\n"
13964 " vec4 gl_Position;\n"
13965 "};\n"
13966 "layout(xfb_buffer = 1) out;"
13967 "void main(){\n"
13968 " gl_Position = vec4(1);\n"
13969 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013970
Mark Lobodzinski20832822017-03-24 14:49:45 -060013971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013972
Mark Lobodzinski20832822017-03-24 14:49:45 -060013973 std::vector<unsigned int> spv;
13974 VkShaderModuleCreateInfo module_create_info;
13975 VkShaderModule shader_module;
13976 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13977 module_create_info.pNext = NULL;
13978 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
13979 module_create_info.pCode = spv.data();
13980 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
13981 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013982
Mark Lobodzinski20832822017-03-24 14:49:45 -060013983 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013984
Mark Lobodzinski20832822017-03-24 14:49:45 -060013985 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060013986}
13987
Karl Schultz6addd812016-02-02 17:17:23 -070013988TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013989 TEST_DESCRIPTION(
13990 "Test that an error is produced for a fragment shader input "
13991 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013992
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013994
Tony Barbour1fa09702017-03-16 12:09:08 -060013995 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013996 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013997
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013998 char const *vsSource =
13999 "#version 450\n"
14000 "\n"
14001 "out gl_PerVertex {\n"
14002 " vec4 gl_Position;\n"
14003 "};\n"
14004 "void main(){\n"
14005 " gl_Position = vec4(1);\n"
14006 "}\n";
14007 char const *fsSource =
14008 "#version 450\n"
14009 "\n"
14010 "layout(location=0) in float x;\n"
14011 "layout(location=0) out vec4 color;\n"
14012 "void main(){\n"
14013 " color = vec4(x);\n"
14014 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014015
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014016 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14017 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014018
14019 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014020 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014021 pipe.AddShader(&vs);
14022 pipe.AddShader(&fs);
14023
Chris Forbes59cb88d2015-05-25 11:13:13 +120014024 VkDescriptorSetObj descriptorSet(m_device);
14025 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014026 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014027
Tony Barbour5781e8f2015-08-04 16:23:11 -060014028 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014029
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014030 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014031}
14032
Karl Schultz6addd812016-02-02 17:17:23 -070014033TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014034 TEST_DESCRIPTION(
14035 "Test that an error is produced for a fragment shader input "
14036 "within an interace block, which is not present in the outputs "
14037 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014038 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014039
Tony Barbour1fa09702017-03-16 12:09:08 -060014040 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014041 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14042
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014043 char const *vsSource =
14044 "#version 450\n"
14045 "\n"
14046 "out gl_PerVertex {\n"
14047 " vec4 gl_Position;\n"
14048 "};\n"
14049 "void main(){\n"
14050 " gl_Position = vec4(1);\n"
14051 "}\n";
14052 char const *fsSource =
14053 "#version 450\n"
14054 "\n"
14055 "in block { layout(location=0) float x; } ins;\n"
14056 "layout(location=0) out vec4 color;\n"
14057 "void main(){\n"
14058 " color = vec4(ins.x);\n"
14059 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014060
14061 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14062 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14063
14064 VkPipelineObj pipe(m_device);
14065 pipe.AddColorAttachment();
14066 pipe.AddShader(&vs);
14067 pipe.AddShader(&fs);
14068
14069 VkDescriptorSetObj descriptorSet(m_device);
14070 descriptorSet.AppendDummy();
14071 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14072
14073 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14074
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014075 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014076}
14077
Karl Schultz6addd812016-02-02 17:17:23 -070014078TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014079 TEST_DESCRIPTION(
14080 "Test that an error is produced for mismatched array sizes "
14081 "across the vertex->fragment shader interface");
14082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14083 "Type mismatch on location 0.0: 'ptr to "
14084 "output arr[2] of float32' vs 'ptr to "
14085 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014086
Tony Barbour1fa09702017-03-16 12:09:08 -060014087 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014088 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14089
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014090 char const *vsSource =
14091 "#version 450\n"
14092 "\n"
14093 "layout(location=0) out float x[2];\n"
14094 "out gl_PerVertex {\n"
14095 " vec4 gl_Position;\n"
14096 "};\n"
14097 "void main(){\n"
14098 " x[0] = 0; x[1] = 0;\n"
14099 " gl_Position = vec4(1);\n"
14100 "}\n";
14101 char const *fsSource =
14102 "#version 450\n"
14103 "\n"
14104 "layout(location=0) in float x[1];\n"
14105 "layout(location=0) out vec4 color;\n"
14106 "void main(){\n"
14107 " color = vec4(x[0]);\n"
14108 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014109
14110 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14111 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14112
14113 VkPipelineObj pipe(m_device);
14114 pipe.AddColorAttachment();
14115 pipe.AddShader(&vs);
14116 pipe.AddShader(&fs);
14117
14118 VkDescriptorSetObj descriptorSet(m_device);
14119 descriptorSet.AppendDummy();
14120 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14121
14122 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14123
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014124 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014125}
14126
Karl Schultz6addd812016-02-02 17:17:23 -070014127TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014128 TEST_DESCRIPTION(
14129 "Test that an error is produced for mismatched types across "
14130 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014132
Tony Barbour1fa09702017-03-16 12:09:08 -060014133 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014135
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014136 char const *vsSource =
14137 "#version 450\n"
14138 "\n"
14139 "layout(location=0) out int x;\n"
14140 "out gl_PerVertex {\n"
14141 " vec4 gl_Position;\n"
14142 "};\n"
14143 "void main(){\n"
14144 " x = 0;\n"
14145 " gl_Position = vec4(1);\n"
14146 "}\n";
14147 char const *fsSource =
14148 "#version 450\n"
14149 "\n"
14150 "layout(location=0) in float x;\n" /* VS writes int */
14151 "layout(location=0) out vec4 color;\n"
14152 "void main(){\n"
14153 " color = vec4(x);\n"
14154 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014155
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014156 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14157 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014158
14159 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014160 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014161 pipe.AddShader(&vs);
14162 pipe.AddShader(&fs);
14163
Chris Forbesb56af562015-05-25 11:13:17 +120014164 VkDescriptorSetObj descriptorSet(m_device);
14165 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014166 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014167
Tony Barbour5781e8f2015-08-04 16:23:11 -060014168 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014169
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014170 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014171}
14172
Karl Schultz6addd812016-02-02 17:17:23 -070014173TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014174 TEST_DESCRIPTION(
14175 "Test that an error is produced for mismatched types across "
14176 "the vertex->fragment shader interface, when the variable is contained within "
14177 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014179
Tony Barbour1fa09702017-03-16 12:09:08 -060014180 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014181 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14182
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014183 char const *vsSource =
14184 "#version 450\n"
14185 "\n"
14186 "out block { layout(location=0) int x; } outs;\n"
14187 "out gl_PerVertex {\n"
14188 " vec4 gl_Position;\n"
14189 "};\n"
14190 "void main(){\n"
14191 " outs.x = 0;\n"
14192 " gl_Position = vec4(1);\n"
14193 "}\n";
14194 char const *fsSource =
14195 "#version 450\n"
14196 "\n"
14197 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14198 "layout(location=0) out vec4 color;\n"
14199 "void main(){\n"
14200 " color = vec4(ins.x);\n"
14201 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014202
14203 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14204 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14205
14206 VkPipelineObj pipe(m_device);
14207 pipe.AddColorAttachment();
14208 pipe.AddShader(&vs);
14209 pipe.AddShader(&fs);
14210
14211 VkDescriptorSetObj descriptorSet(m_device);
14212 descriptorSet.AppendDummy();
14213 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14214
14215 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14216
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014217 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014218}
14219
14220TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014221 TEST_DESCRIPTION(
14222 "Test that an error is produced for location mismatches across "
14223 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14224 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0.0 which is not written by vertex shader");
Chris Forbese9928822016-02-17 14:44:52 +130014226
Tony Barbour1fa09702017-03-16 12:09:08 -060014227 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014228 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14229
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014230 char const *vsSource =
14231 "#version 450\n"
14232 "\n"
14233 "out block { layout(location=1) float x; } outs;\n"
14234 "out gl_PerVertex {\n"
14235 " vec4 gl_Position;\n"
14236 "};\n"
14237 "void main(){\n"
14238 " outs.x = 0;\n"
14239 " gl_Position = vec4(1);\n"
14240 "}\n";
14241 char const *fsSource =
14242 "#version 450\n"
14243 "\n"
14244 "in block { layout(location=0) float x; } ins;\n"
14245 "layout(location=0) out vec4 color;\n"
14246 "void main(){\n"
14247 " color = vec4(ins.x);\n"
14248 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014249
14250 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14251 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14252
14253 VkPipelineObj pipe(m_device);
14254 pipe.AddColorAttachment();
14255 pipe.AddShader(&vs);
14256 pipe.AddShader(&fs);
14257
14258 VkDescriptorSetObj descriptorSet(m_device);
14259 descriptorSet.AppendDummy();
14260 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14261
14262 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14263
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014264 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014265}
14266
14267TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014268 TEST_DESCRIPTION(
14269 "Test that an error is produced for component mismatches across the "
14270 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14271 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0.1 which is not written by vertex shader");
Chris Forbese9928822016-02-17 14:44:52 +130014273
Tony Barbour1fa09702017-03-16 12:09:08 -060014274 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014275 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14276
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014277 char const *vsSource =
14278 "#version 450\n"
14279 "\n"
14280 "out block { layout(location=0, component=0) float x; } outs;\n"
14281 "out gl_PerVertex {\n"
14282 " vec4 gl_Position;\n"
14283 "};\n"
14284 "void main(){\n"
14285 " outs.x = 0;\n"
14286 " gl_Position = vec4(1);\n"
14287 "}\n";
14288 char const *fsSource =
14289 "#version 450\n"
14290 "\n"
14291 "in block { layout(location=0, component=1) float x; } ins;\n"
14292 "layout(location=0) out vec4 color;\n"
14293 "void main(){\n"
14294 " color = vec4(ins.x);\n"
14295 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014296
14297 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14298 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14299
14300 VkPipelineObj pipe(m_device);
14301 pipe.AddColorAttachment();
14302 pipe.AddShader(&vs);
14303 pipe.AddShader(&fs);
14304
14305 VkDescriptorSetObj descriptorSet(m_device);
14306 descriptorSet.AppendDummy();
14307 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14308
14309 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14310
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014311 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014312}
14313
Chris Forbes1f3b0152016-11-30 12:48:40 +130014314TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14315 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14316
Tony Barbour1fa09702017-03-16 12:09:08 -060014317 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014318 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14319
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014320 char const *vsSource =
14321 "#version 450\n"
14322 "layout(location=0) out mediump float x;\n"
14323 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14324 char const *fsSource =
14325 "#version 450\n"
14326 "layout(location=0) in highp float x;\n"
14327 "layout(location=0) out vec4 color;\n"
14328 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014329
14330 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14331 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14332
14333 VkPipelineObj pipe(m_device);
14334 pipe.AddColorAttachment();
14335 pipe.AddShader(&vs);
14336 pipe.AddShader(&fs);
14337
14338 VkDescriptorSetObj descriptorSet(m_device);
14339 descriptorSet.AppendDummy();
14340 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14341
14342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14343
14344 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14345
14346 m_errorMonitor->VerifyFound();
14347}
14348
Chris Forbes870a39e2016-11-30 12:55:56 +130014349TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14350 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14351
Tony Barbour1fa09702017-03-16 12:09:08 -060014352 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14354
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014355 char const *vsSource =
14356 "#version 450\n"
14357 "out block { layout(location=0) mediump float x; };\n"
14358 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14359 char const *fsSource =
14360 "#version 450\n"
14361 "in block { layout(location=0) highp float x; };\n"
14362 "layout(location=0) out vec4 color;\n"
14363 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014364
14365 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14366 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14367
14368 VkPipelineObj pipe(m_device);
14369 pipe.AddColorAttachment();
14370 pipe.AddShader(&vs);
14371 pipe.AddShader(&fs);
14372
14373 VkDescriptorSetObj descriptorSet(m_device);
14374 descriptorSet.AppendDummy();
14375 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14376
14377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14378
14379 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14380
14381 m_errorMonitor->VerifyFound();
14382}
14383
Karl Schultz6addd812016-02-02 17:17:23 -070014384TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014385 TEST_DESCRIPTION(
14386 "Test that a warning is produced for a vertex attribute which is "
14387 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014389
Tony Barbour1fa09702017-03-16 12:09:08 -060014390 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014392
14393 VkVertexInputBindingDescription input_binding;
14394 memset(&input_binding, 0, sizeof(input_binding));
14395
14396 VkVertexInputAttributeDescription input_attrib;
14397 memset(&input_attrib, 0, sizeof(input_attrib));
14398 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14399
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014400 char const *vsSource =
14401 "#version 450\n"
14402 "\n"
14403 "out gl_PerVertex {\n"
14404 " vec4 gl_Position;\n"
14405 "};\n"
14406 "void main(){\n"
14407 " gl_Position = vec4(1);\n"
14408 "}\n";
14409 char const *fsSource =
14410 "#version 450\n"
14411 "\n"
14412 "layout(location=0) out vec4 color;\n"
14413 "void main(){\n"
14414 " color = vec4(1);\n"
14415 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014416
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014417 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14418 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014419
14420 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014421 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014422 pipe.AddShader(&vs);
14423 pipe.AddShader(&fs);
14424
14425 pipe.AddVertexInputBindings(&input_binding, 1);
14426 pipe.AddVertexInputAttribs(&input_attrib, 1);
14427
Chris Forbesde136e02015-05-25 11:13:28 +120014428 VkDescriptorSetObj descriptorSet(m_device);
14429 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014430 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014431
Tony Barbour5781e8f2015-08-04 16:23:11 -060014432 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014433
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014434 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014435}
14436
Karl Schultz6addd812016-02-02 17:17:23 -070014437TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014438 TEST_DESCRIPTION(
14439 "Test that a warning is produced for a location mismatch on "
14440 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014442
Tony Barbour1fa09702017-03-16 12:09:08 -060014443 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14445
14446 VkVertexInputBindingDescription input_binding;
14447 memset(&input_binding, 0, sizeof(input_binding));
14448
14449 VkVertexInputAttributeDescription input_attrib;
14450 memset(&input_attrib, 0, sizeof(input_attrib));
14451 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14452
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014453 char const *vsSource =
14454 "#version 450\n"
14455 "\n"
14456 "layout(location=1) in float x;\n"
14457 "out gl_PerVertex {\n"
14458 " vec4 gl_Position;\n"
14459 "};\n"
14460 "void main(){\n"
14461 " gl_Position = vec4(x);\n"
14462 "}\n";
14463 char const *fsSource =
14464 "#version 450\n"
14465 "\n"
14466 "layout(location=0) out vec4 color;\n"
14467 "void main(){\n"
14468 " color = vec4(1);\n"
14469 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014470
14471 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14472 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14473
14474 VkPipelineObj pipe(m_device);
14475 pipe.AddColorAttachment();
14476 pipe.AddShader(&vs);
14477 pipe.AddShader(&fs);
14478
14479 pipe.AddVertexInputBindings(&input_binding, 1);
14480 pipe.AddVertexInputAttribs(&input_attrib, 1);
14481
14482 VkDescriptorSetObj descriptorSet(m_device);
14483 descriptorSet.AppendDummy();
14484 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14485
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014486 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014487 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14488
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014489 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014490}
14491
Karl Schultz6addd812016-02-02 17:17:23 -070014492TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014493 TEST_DESCRIPTION(
14494 "Test that an error is produced for a vertex shader input which is not "
14495 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014496 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14497 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014498
Tony Barbour1fa09702017-03-16 12:09:08 -060014499 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014501
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014502 char const *vsSource =
14503 "#version 450\n"
14504 "\n"
14505 "layout(location=0) in vec4 x;\n" /* not provided */
14506 "out gl_PerVertex {\n"
14507 " vec4 gl_Position;\n"
14508 "};\n"
14509 "void main(){\n"
14510 " gl_Position = x;\n"
14511 "}\n";
14512 char const *fsSource =
14513 "#version 450\n"
14514 "\n"
14515 "layout(location=0) out vec4 color;\n"
14516 "void main(){\n"
14517 " color = vec4(1);\n"
14518 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014519
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014520 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14521 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014522
14523 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014524 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014525 pipe.AddShader(&vs);
14526 pipe.AddShader(&fs);
14527
Chris Forbes62e8e502015-05-25 11:13:29 +120014528 VkDescriptorSetObj descriptorSet(m_device);
14529 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014530 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014531
Tony Barbour5781e8f2015-08-04 16:23:11 -060014532 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014533
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014534 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014535}
14536
Karl Schultz6addd812016-02-02 17:17:23 -070014537TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014538 TEST_DESCRIPTION(
14539 "Test that an error is produced for a mismatch between the "
14540 "fundamental type (float/int/uint) of an attribute and the "
14541 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0 does not match vertex shader input type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014543
Tony Barbour1fa09702017-03-16 12:09:08 -060014544 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014546
14547 VkVertexInputBindingDescription input_binding;
14548 memset(&input_binding, 0, sizeof(input_binding));
14549
14550 VkVertexInputAttributeDescription input_attrib;
14551 memset(&input_attrib, 0, sizeof(input_attrib));
14552 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14553
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014554 char const *vsSource =
14555 "#version 450\n"
14556 "\n"
14557 "layout(location=0) in int x;\n" /* attrib provided float */
14558 "out gl_PerVertex {\n"
14559 " vec4 gl_Position;\n"
14560 "};\n"
14561 "void main(){\n"
14562 " gl_Position = vec4(x);\n"
14563 "}\n";
14564 char const *fsSource =
14565 "#version 450\n"
14566 "\n"
14567 "layout(location=0) out vec4 color;\n"
14568 "void main(){\n"
14569 " color = vec4(1);\n"
14570 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014571
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014572 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14573 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014574
14575 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014576 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014577 pipe.AddShader(&vs);
14578 pipe.AddShader(&fs);
14579
14580 pipe.AddVertexInputBindings(&input_binding, 1);
14581 pipe.AddVertexInputAttribs(&input_attrib, 1);
14582
Chris Forbesc97d98e2015-05-25 11:13:31 +120014583 VkDescriptorSetObj descriptorSet(m_device);
14584 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014585 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014586
Tony Barbour5781e8f2015-08-04 16:23:11 -060014587 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014588
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014589 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014590}
14591
Chris Forbesc68b43c2016-04-06 11:18:47 +120014592TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014593 TEST_DESCRIPTION(
14594 "Test that an error is produced for a pipeline containing multiple "
14595 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14597 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014598
Tony Barbour1fa09702017-03-16 12:09:08 -060014599 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014600 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14601
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014602 char const *vsSource =
14603 "#version 450\n"
14604 "\n"
14605 "out gl_PerVertex {\n"
14606 " vec4 gl_Position;\n"
14607 "};\n"
14608 "void main(){\n"
14609 " gl_Position = vec4(1);\n"
14610 "}\n";
14611 char const *fsSource =
14612 "#version 450\n"
14613 "\n"
14614 "layout(location=0) out vec4 color;\n"
14615 "void main(){\n"
14616 " color = vec4(1);\n"
14617 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014618
14619 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14620 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14621
14622 VkPipelineObj pipe(m_device);
14623 pipe.AddColorAttachment();
14624 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014625 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014626 pipe.AddShader(&fs);
14627
14628 VkDescriptorSetObj descriptorSet(m_device);
14629 descriptorSet.AppendDummy();
14630 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14631
14632 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14633
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014634 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014635}
14636
Chris Forbes82ff92a2016-09-09 10:50:24 +120014637TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014639
Tony Barbour1fa09702017-03-16 12:09:08 -060014640 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014641 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14642
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014643 char const *vsSource =
14644 "#version 450\n"
14645 "out gl_PerVertex {\n"
14646 " vec4 gl_Position;\n"
14647 "};\n"
14648 "void main(){\n"
14649 " gl_Position = vec4(0);\n"
14650 "}\n";
14651 char const *fsSource =
14652 "#version 450\n"
14653 "\n"
14654 "layout(location=0) out vec4 color;\n"
14655 "void main(){\n"
14656 " color = vec4(1);\n"
14657 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014658
14659 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14660 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14661
14662 VkPipelineObj pipe(m_device);
14663 pipe.AddColorAttachment();
14664 pipe.AddShader(&vs);
14665 pipe.AddShader(&fs);
14666
14667 VkDescriptorSetObj descriptorSet(m_device);
14668 descriptorSet.AppendDummy();
14669 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14670
14671 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14672
14673 m_errorMonitor->VerifyFound();
14674}
14675
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014676TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14678 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14679 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014680
Tony Barbour1fa09702017-03-16 12:09:08 -060014681 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14683
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014684 char const *vsSource =
14685 "#version 450\n"
14686 "void main(){ gl_Position = vec4(0); }\n";
14687 char const *fsSource =
14688 "#version 450\n"
14689 "\n"
14690 "layout(location=0) out vec4 color;\n"
14691 "void main(){\n"
14692 " color = vec4(1);\n"
14693 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014694
14695 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14696 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14697
14698 VkPipelineObj pipe(m_device);
14699 pipe.AddColorAttachment();
14700 pipe.AddShader(&vs);
14701 pipe.AddShader(&fs);
14702
14703 VkDescriptorSetObj descriptorSet(m_device);
14704 descriptorSet.AppendDummy();
14705 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14706
14707 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014708 {
14709 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14710 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14711 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014712 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014713 {
14714 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14715 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14716 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014717 },
14718 };
14719 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014720 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014721 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014722 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14723 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014724 VkRenderPass rp;
14725 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14726 ASSERT_VK_SUCCESS(err);
14727
14728 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14729
14730 m_errorMonitor->VerifyFound();
14731
14732 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14733}
14734
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014735TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014736 TEST_DESCRIPTION(
14737 "Test that an error is produced for a variable output from "
14738 "the TCS without the patch decoration, but consumed in the TES "
14739 "with the decoration.");
14740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14741 "is per-vertex in tessellation control shader stage "
14742 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014743
Tony Barbour1fa09702017-03-16 12:09:08 -060014744 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014745 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14746
Chris Forbesc1e852d2016-04-04 19:26:42 +120014747 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014748 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014749 return;
14750 }
14751
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014752 char const *vsSource =
14753 "#version 450\n"
14754 "void main(){}\n";
14755 char const *tcsSource =
14756 "#version 450\n"
14757 "layout(location=0) out int x[];\n"
14758 "layout(vertices=3) out;\n"
14759 "void main(){\n"
14760 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14761 " gl_TessLevelInner[0] = 1;\n"
14762 " x[gl_InvocationID] = gl_InvocationID;\n"
14763 "}\n";
14764 char const *tesSource =
14765 "#version 450\n"
14766 "layout(triangles, equal_spacing, cw) in;\n"
14767 "layout(location=0) patch in int x;\n"
14768 "out gl_PerVertex { vec4 gl_Position; };\n"
14769 "void main(){\n"
14770 " gl_Position.xyz = gl_TessCoord;\n"
14771 " gl_Position.w = x;\n"
14772 "}\n";
14773 char const *fsSource =
14774 "#version 450\n"
14775 "layout(location=0) out vec4 color;\n"
14776 "void main(){\n"
14777 " color = vec4(1);\n"
14778 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014779
14780 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14781 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14782 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14783 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14784
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014785 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14786 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014787
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014788 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014789
14790 VkPipelineObj pipe(m_device);
14791 pipe.SetInputAssembly(&iasci);
14792 pipe.SetTessellation(&tsci);
14793 pipe.AddColorAttachment();
14794 pipe.AddShader(&vs);
14795 pipe.AddShader(&tcs);
14796 pipe.AddShader(&tes);
14797 pipe.AddShader(&fs);
14798
14799 VkDescriptorSetObj descriptorSet(m_device);
14800 descriptorSet.AppendDummy();
14801 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14802
14803 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14804
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014805 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014806}
14807
Karl Schultz6addd812016-02-02 17:17:23 -070014808TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014809 TEST_DESCRIPTION(
14810 "Test that an error is produced for a vertex attribute setup where multiple "
14811 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14813 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014814
Tony Barbour1fa09702017-03-16 12:09:08 -060014815 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014816 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014817
14818 /* Two binding descriptions for binding 0 */
14819 VkVertexInputBindingDescription input_bindings[2];
14820 memset(input_bindings, 0, sizeof(input_bindings));
14821
14822 VkVertexInputAttributeDescription input_attrib;
14823 memset(&input_attrib, 0, sizeof(input_attrib));
14824 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14825
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014826 char const *vsSource =
14827 "#version 450\n"
14828 "\n"
14829 "layout(location=0) in float x;\n" /* attrib provided float */
14830 "out gl_PerVertex {\n"
14831 " vec4 gl_Position;\n"
14832 "};\n"
14833 "void main(){\n"
14834 " gl_Position = vec4(x);\n"
14835 "}\n";
14836 char const *fsSource =
14837 "#version 450\n"
14838 "\n"
14839 "layout(location=0) out vec4 color;\n"
14840 "void main(){\n"
14841 " color = vec4(1);\n"
14842 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014843
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014844 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14845 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014846
14847 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014848 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014849 pipe.AddShader(&vs);
14850 pipe.AddShader(&fs);
14851
14852 pipe.AddVertexInputBindings(input_bindings, 2);
14853 pipe.AddVertexInputAttribs(&input_attrib, 1);
14854
Chris Forbes280ba2c2015-06-12 11:16:41 +120014855 VkDescriptorSetObj descriptorSet(m_device);
14856 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014857 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014858
Tony Barbour5781e8f2015-08-04 16:23:11 -060014859 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014860
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014861 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014862}
Chris Forbes8f68b562015-05-25 11:13:32 +120014863
Karl Schultz6addd812016-02-02 17:17:23 -070014864TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014865 TEST_DESCRIPTION(
14866 "Test that an error is produced for a fragment shader which does not "
14867 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014869
Tony Barbour1fa09702017-03-16 12:09:08 -060014870 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014871
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014872 char const *vsSource =
14873 "#version 450\n"
14874 "\n"
14875 "out gl_PerVertex {\n"
14876 " vec4 gl_Position;\n"
14877 "};\n"
14878 "void main(){\n"
14879 " gl_Position = vec4(1);\n"
14880 "}\n";
14881 char const *fsSource =
14882 "#version 450\n"
14883 "\n"
14884 "void main(){\n"
14885 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014886
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014887 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14888 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014889
14890 VkPipelineObj pipe(m_device);
14891 pipe.AddShader(&vs);
14892 pipe.AddShader(&fs);
14893
Chia-I Wu08accc62015-07-07 11:50:03 +080014894 /* set up CB 0, not written */
14895 pipe.AddColorAttachment();
14896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014897
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014898 VkDescriptorSetObj descriptorSet(m_device);
14899 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014900 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014901
Tony Barbour5781e8f2015-08-04 16:23:11 -060014902 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014903
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014904 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014905}
14906
Karl Schultz6addd812016-02-02 17:17:23 -070014907TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014908 TEST_DESCRIPTION(
14909 "Test that a warning is produced for a fragment shader which provides a spurious "
14910 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014912 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014913
Tony Barbour1fa09702017-03-16 12:09:08 -060014914 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014915
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014916 char const *vsSource =
14917 "#version 450\n"
14918 "\n"
14919 "out gl_PerVertex {\n"
14920 " vec4 gl_Position;\n"
14921 "};\n"
14922 "void main(){\n"
14923 " gl_Position = vec4(1);\n"
14924 "}\n";
14925 char const *fsSource =
14926 "#version 450\n"
14927 "\n"
14928 "layout(location=0) out vec4 x;\n"
14929 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14930 "void main(){\n"
14931 " x = vec4(1);\n"
14932 " y = vec4(1);\n"
14933 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014934
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014937
14938 VkPipelineObj pipe(m_device);
14939 pipe.AddShader(&vs);
14940 pipe.AddShader(&fs);
14941
Chia-I Wu08accc62015-07-07 11:50:03 +080014942 /* set up CB 0, not written */
14943 pipe.AddColorAttachment();
14944 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014945 /* FS writes CB 1, but we don't configure it */
14946
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014947 VkDescriptorSetObj descriptorSet(m_device);
14948 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014949 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014950
Tony Barbour5781e8f2015-08-04 16:23:11 -060014951 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014952
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014953 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014954}
14955
Karl Schultz6addd812016-02-02 17:17:23 -070014956TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014957 TEST_DESCRIPTION(
14958 "Test that an error is produced for a mismatch between the fundamental "
14959 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014961
Tony Barbour1fa09702017-03-16 12:09:08 -060014962 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014963
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014964 char const *vsSource =
14965 "#version 450\n"
14966 "\n"
14967 "out gl_PerVertex {\n"
14968 " vec4 gl_Position;\n"
14969 "};\n"
14970 "void main(){\n"
14971 " gl_Position = vec4(1);\n"
14972 "}\n";
14973 char const *fsSource =
14974 "#version 450\n"
14975 "\n"
14976 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14977 "void main(){\n"
14978 " x = ivec4(1);\n"
14979 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014980
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014981 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14982 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014983
14984 VkPipelineObj pipe(m_device);
14985 pipe.AddShader(&vs);
14986 pipe.AddShader(&fs);
14987
Chia-I Wu08accc62015-07-07 11:50:03 +080014988 /* set up CB 0; type is UNORM by default */
14989 pipe.AddColorAttachment();
14990 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014991
Chris Forbesa36d69e2015-05-25 11:13:44 +120014992 VkDescriptorSetObj descriptorSet(m_device);
14993 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014994 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014995
Tony Barbour5781e8f2015-08-04 16:23:11 -060014996 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014997
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014998 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014999}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015000
Karl Schultz6addd812016-02-02 17:17:23 -070015001TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015002 TEST_DESCRIPTION(
15003 "Test that an error is produced for a shader consuming a uniform "
15004 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015006
Tony Barbour1fa09702017-03-16 12:09:08 -060015007 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015008
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015009 char const *vsSource =
15010 "#version 450\n"
15011 "\n"
15012 "out gl_PerVertex {\n"
15013 " vec4 gl_Position;\n"
15014 "};\n"
15015 "void main(){\n"
15016 " gl_Position = vec4(1);\n"
15017 "}\n";
15018 char const *fsSource =
15019 "#version 450\n"
15020 "\n"
15021 "layout(location=0) out vec4 x;\n"
15022 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15023 "void main(){\n"
15024 " x = vec4(bar.y);\n"
15025 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015026
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015027 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15028 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015029
Chris Forbes556c76c2015-08-14 12:04:59 +120015030 VkPipelineObj pipe(m_device);
15031 pipe.AddShader(&vs);
15032 pipe.AddShader(&fs);
15033
15034 /* set up CB 0; type is UNORM by default */
15035 pipe.AddColorAttachment();
15036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15037
15038 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015039 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015040
15041 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15042
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015043 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015044}
15045
Chris Forbes5c59e902016-02-26 16:56:09 +130015046TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015047 TEST_DESCRIPTION(
15048 "Test that an error is produced for a shader consuming push constants "
15049 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015051
Tony Barbour1fa09702017-03-16 12:09:08 -060015052 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015053
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015054 char const *vsSource =
15055 "#version 450\n"
15056 "\n"
15057 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15058 "out gl_PerVertex {\n"
15059 " vec4 gl_Position;\n"
15060 "};\n"
15061 "void main(){\n"
15062 " gl_Position = vec4(consts.x);\n"
15063 "}\n";
15064 char const *fsSource =
15065 "#version 450\n"
15066 "\n"
15067 "layout(location=0) out vec4 x;\n"
15068 "void main(){\n"
15069 " x = vec4(1);\n"
15070 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015071
15072 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15073 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15074
15075 VkPipelineObj pipe(m_device);
15076 pipe.AddShader(&vs);
15077 pipe.AddShader(&fs);
15078
15079 /* set up CB 0; type is UNORM by default */
15080 pipe.AddColorAttachment();
15081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15082
15083 VkDescriptorSetObj descriptorSet(m_device);
15084 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15085
15086 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15087
15088 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015089 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015090}
15091
Chris Forbes3fb17902016-08-22 14:57:55 +120015092TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015093 TEST_DESCRIPTION(
15094 "Test that an error is produced for a shader consuming an input attachment "
15095 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15097 "consumes input attachment index 0 but not provided in subpass");
15098
Tony Barbour1fa09702017-03-16 12:09:08 -060015099 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015100
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015101 char const *vsSource =
15102 "#version 450\n"
15103 "\n"
15104 "out gl_PerVertex {\n"
15105 " vec4 gl_Position;\n"
15106 "};\n"
15107 "void main(){\n"
15108 " gl_Position = vec4(1);\n"
15109 "}\n";
15110 char const *fsSource =
15111 "#version 450\n"
15112 "\n"
15113 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15114 "layout(location=0) out vec4 color;\n"
15115 "void main() {\n"
15116 " color = subpassLoad(x);\n"
15117 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015118
15119 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15120 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15121
15122 VkPipelineObj pipe(m_device);
15123 pipe.AddShader(&vs);
15124 pipe.AddShader(&fs);
15125 pipe.AddColorAttachment();
15126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15127
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015128 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15129 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015130 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015131 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015132 ASSERT_VK_SUCCESS(err);
15133
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015134 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015135 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015136 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015137 ASSERT_VK_SUCCESS(err);
15138
15139 // error here.
15140 pipe.CreateVKPipeline(pl, renderPass());
15141
15142 m_errorMonitor->VerifyFound();
15143
15144 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15145 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15146}
15147
Chris Forbes5a9a0472016-08-22 16:02:09 +120015148TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015149 TEST_DESCRIPTION(
15150 "Test that an error is produced for a shader consuming an input attachment "
15151 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15153 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15154
Tony Barbour1fa09702017-03-16 12:09:08 -060015155 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015156
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015157 char const *vsSource =
15158 "#version 450\n"
15159 "\n"
15160 "out gl_PerVertex {\n"
15161 " vec4 gl_Position;\n"
15162 "};\n"
15163 "void main(){\n"
15164 " gl_Position = vec4(1);\n"
15165 "}\n";
15166 char const *fsSource =
15167 "#version 450\n"
15168 "\n"
15169 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15170 "layout(location=0) out vec4 color;\n"
15171 "void main() {\n"
15172 " color = subpassLoad(x);\n"
15173 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015174
15175 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15176 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15177
15178 VkPipelineObj pipe(m_device);
15179 pipe.AddShader(&vs);
15180 pipe.AddShader(&fs);
15181 pipe.AddColorAttachment();
15182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15183
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015184 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15185 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015186 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015187 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015188 ASSERT_VK_SUCCESS(err);
15189
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015190 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015191 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015192 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015193 ASSERT_VK_SUCCESS(err);
15194
15195 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015196 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15197 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15198 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15199 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15200 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Chris Forbes5a9a0472016-08-22 16:02:09 +120015201 };
15202 VkAttachmentReference color = {
15203 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15204 };
15205 VkAttachmentReference input = {
15206 1, VK_IMAGE_LAYOUT_GENERAL,
15207 };
15208
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015209 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015210
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015211 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015212 VkRenderPass rp;
15213 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15214 ASSERT_VK_SUCCESS(err);
15215
15216 // error here.
15217 pipe.CreateVKPipeline(pl, rp);
15218
15219 m_errorMonitor->VerifyFound();
15220
15221 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15222 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15223 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15224}
15225
Chris Forbes541f7b02016-08-22 15:30:27 +120015226TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015227 TEST_DESCRIPTION(
15228 "Test that an error is produced for a shader consuming an input attachment "
15229 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015231 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015232
Tony Barbour1fa09702017-03-16 12:09:08 -060015233 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015234
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015235 char const *vsSource =
15236 "#version 450\n"
15237 "\n"
15238 "out gl_PerVertex {\n"
15239 " vec4 gl_Position;\n"
15240 "};\n"
15241 "void main(){\n"
15242 " gl_Position = vec4(1);\n"
15243 "}\n";
15244 char const *fsSource =
15245 "#version 450\n"
15246 "\n"
15247 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15248 "layout(location=0) out vec4 color;\n"
15249 "void main() {\n"
15250 " color = subpassLoad(xs[0]);\n"
15251 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015252
15253 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15254 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15255
15256 VkPipelineObj pipe(m_device);
15257 pipe.AddShader(&vs);
15258 pipe.AddShader(&fs);
15259 pipe.AddColorAttachment();
15260 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15261
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015262 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15263 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015264 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015265 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015266 ASSERT_VK_SUCCESS(err);
15267
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015268 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015269 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015270 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015271 ASSERT_VK_SUCCESS(err);
15272
15273 // error here.
15274 pipe.CreateVKPipeline(pl, renderPass());
15275
15276 m_errorMonitor->VerifyFound();
15277
15278 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15279 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15280}
15281
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015282TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015283 TEST_DESCRIPTION(
15284 "Test that an error is produced for a compute pipeline consuming a "
15285 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015287
Tony Barbour1fa09702017-03-16 12:09:08 -060015288 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015289
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015290 char const *csSource =
15291 "#version 450\n"
15292 "\n"
15293 "layout(local_size_x=1) in;\n"
15294 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15295 "void main(){\n"
15296 " x = vec4(1);\n"
15297 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015298
15299 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15300
15301 VkDescriptorSetObj descriptorSet(m_device);
15302 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15303
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015304 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15305 nullptr,
15306 0,
15307 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15308 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15309 descriptorSet.GetPipelineLayout(),
15310 VK_NULL_HANDLE,
15311 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015312
15313 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015314 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015315
15316 m_errorMonitor->VerifyFound();
15317
15318 if (err == VK_SUCCESS) {
15319 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15320 }
15321}
15322
Chris Forbes22a9b092016-07-19 14:34:05 +120015323TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015324 TEST_DESCRIPTION(
15325 "Test that an error is produced for a pipeline consuming a "
15326 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15328 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015329
Tony Barbour1fa09702017-03-16 12:09:08 -060015330 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015331
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015332 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15333 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015334 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015335 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015336 ASSERT_VK_SUCCESS(err);
15337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015338 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015339 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015340 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015341 ASSERT_VK_SUCCESS(err);
15342
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015343 char const *csSource =
15344 "#version 450\n"
15345 "\n"
15346 "layout(local_size_x=1) in;\n"
15347 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15348 "void main() {\n"
15349 " x.x = 1.0f;\n"
15350 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015351 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15352
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015353 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15354 nullptr,
15355 0,
15356 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15357 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15358 pl,
15359 VK_NULL_HANDLE,
15360 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015361
15362 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015363 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015364
15365 m_errorMonitor->VerifyFound();
15366
15367 if (err == VK_SUCCESS) {
15368 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15369 }
15370
15371 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15372 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15373}
15374
Chris Forbes50020592016-07-27 13:52:41 +120015375TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015376 TEST_DESCRIPTION(
15377 "Test that an error is produced when an image view type "
15378 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015379
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
Chris Forbes50020592016-07-27 13:52:41 +120015381
Tony Barbour1fa09702017-03-16 12:09:08 -060015382 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15384
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015385 char const *vsSource =
15386 "#version 450\n"
15387 "\n"
15388 "out gl_PerVertex { vec4 gl_Position; };\n"
15389 "void main() { gl_Position = vec4(0); }\n";
15390 char const *fsSource =
15391 "#version 450\n"
15392 "\n"
15393 "layout(set=0, binding=0) uniform sampler3D s;\n"
15394 "layout(location=0) out vec4 color;\n"
15395 "void main() {\n"
15396 " color = texture(s, vec3(0));\n"
15397 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015398 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15399 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15400
15401 VkPipelineObj pipe(m_device);
15402 pipe.AddShader(&vs);
15403 pipe.AddShader(&fs);
15404 pipe.AddColorAttachment();
15405
15406 VkTextureObj texture(m_device, nullptr);
15407 VkSamplerObj sampler(m_device);
15408
15409 VkDescriptorSetObj descriptorSet(m_device);
15410 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15411 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15412
15413 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15414 ASSERT_VK_SUCCESS(err);
15415
Tony Barbour552f6c02016-12-21 14:34:07 -070015416 m_commandBuffer->BeginCommandBuffer();
15417 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015418
15419 m_commandBuffer->BindPipeline(pipe);
15420 m_commandBuffer->BindDescriptorSet(descriptorSet);
15421
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015422 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015423 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015424 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015425 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15426
15427 // error produced here.
15428 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15429
15430 m_errorMonitor->VerifyFound();
15431
Tony Barbour552f6c02016-12-21 14:34:07 -070015432 m_commandBuffer->EndRenderPass();
15433 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015434}
15435
Chris Forbes5533bfc2016-07-27 14:12:34 +120015436TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015437 TEST_DESCRIPTION(
15438 "Test that an error is produced when a multisampled images "
15439 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015440
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015442
Tony Barbour1fa09702017-03-16 12:09:08 -060015443 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15445
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015446 char const *vsSource =
15447 "#version 450\n"
15448 "\n"
15449 "out gl_PerVertex { vec4 gl_Position; };\n"
15450 "void main() { gl_Position = vec4(0); }\n";
15451 char const *fsSource =
15452 "#version 450\n"
15453 "\n"
15454 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15455 "layout(location=0) out vec4 color;\n"
15456 "void main() {\n"
15457 " color = texelFetch(s, ivec2(0), 0);\n"
15458 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015459 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15460 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15461
15462 VkPipelineObj pipe(m_device);
15463 pipe.AddShader(&vs);
15464 pipe.AddShader(&fs);
15465 pipe.AddColorAttachment();
15466
15467 VkTextureObj texture(m_device, nullptr);
15468 VkSamplerObj sampler(m_device);
15469
15470 VkDescriptorSetObj descriptorSet(m_device);
15471 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15472 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15473
15474 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15475 ASSERT_VK_SUCCESS(err);
15476
Tony Barbour552f6c02016-12-21 14:34:07 -070015477 m_commandBuffer->BeginCommandBuffer();
15478 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015479
15480 m_commandBuffer->BindPipeline(pipe);
15481 m_commandBuffer->BindDescriptorSet(descriptorSet);
15482
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015483 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015484 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015485 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015486 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15487
15488 // error produced here.
15489 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15490
15491 m_errorMonitor->VerifyFound();
15492
Tony Barbour552f6c02016-12-21 14:34:07 -070015493 m_commandBuffer->EndRenderPass();
15494 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015495}
15496
Mark Youngc48c4c12016-04-11 14:26:49 -060015497TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015498 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015499
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015500 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15501 {
15502 VkFormatProperties properties;
15503 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15504 if (properties.optimalTilingFeatures == 0) {
15505 printf(" Image format not supported; skipped.\n");
15506 return;
15507 }
15508 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015509
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015510 VkImageCreateInfo info = {};
15511 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15512 info.pNext = NULL;
15513 info.imageType = VK_IMAGE_TYPE_2D;
15514 info.format = format;
15515 info.extent.height = 32;
15516 info.extent.depth = 1;
15517 info.mipLevels = 1;
15518 info.arrayLayers = 1;
15519 info.samples = VK_SAMPLE_COUNT_1_BIT;
15520 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15521 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15522 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015523
15524 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015525 {
15526 VkImageFormatProperties properties;
15527 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15528 info.tiling, info.usage, info.flags, &properties);
15529 ASSERT_VK_SUCCESS(result);
15530 info.extent.width = properties.maxExtent.width + 1;
15531 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015532
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015533 VkImage image;
15534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15535 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015536 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015537}
15538
Mark Youngc48c4c12016-04-11 14:26:49 -060015539TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015540 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015541
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015542 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15543 {
15544 VkFormatProperties properties;
15545 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15546 if (properties.optimalTilingFeatures == 0) {
15547 printf(" Image format not supported; skipped.\n");
15548 return;
15549 }
15550 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015551
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015552 VkImageCreateInfo info = {};
15553 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15554 info.pNext = NULL;
15555 info.imageType = VK_IMAGE_TYPE_2D;
15556 info.format = format;
15557 info.extent.height = 32;
15558 info.extent.depth = 1;
15559 info.mipLevels = 1;
15560 info.arrayLayers = 1;
15561 info.samples = VK_SAMPLE_COUNT_1_BIT;
15562 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15563 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15564 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015565
15566 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015567 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015568
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015569 VkImage image;
15570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
15571 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15572 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015573 m_errorMonitor->VerifyFound();
15574}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015575
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015576TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015577 TEST_DESCRIPTION(
15578 "Create a render pass with an attachment description "
15579 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015580
Tony Barbour1fa09702017-03-16 12:09:08 -060015581 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015582 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15583
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015585
15586 VkAttachmentReference color_attach = {};
15587 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15588 color_attach.attachment = 0;
15589 VkSubpassDescription subpass = {};
15590 subpass.colorAttachmentCount = 1;
15591 subpass.pColorAttachments = &color_attach;
15592
15593 VkRenderPassCreateInfo rpci = {};
15594 rpci.subpassCount = 1;
15595 rpci.pSubpasses = &subpass;
15596 rpci.attachmentCount = 1;
15597 VkAttachmentDescription attach_desc = {};
15598 attach_desc.format = VK_FORMAT_UNDEFINED;
15599 rpci.pAttachments = &attach_desc;
15600 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15601 VkRenderPass rp;
15602 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15603
15604 m_errorMonitor->VerifyFound();
15605
15606 if (result == VK_SUCCESS) {
15607 vkDestroyRenderPass(m_device->device(), rp, NULL);
15608 }
15609}
15610
Karl Schultz6addd812016-02-02 17:17:23 -070015611TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015612 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015613
Mike Stroyana3082432015-09-25 13:39:21 -060015614 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015615 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15616 const int32_t tex_width = 32;
15617 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015618
15619 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015620 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15621 image_create_info.pNext = NULL;
15622 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15623 image_create_info.format = tex_format;
15624 image_create_info.extent.width = tex_width;
15625 image_create_info.extent.height = tex_height;
15626 image_create_info.extent.depth = 1;
15627 image_create_info.mipLevels = 1;
15628 image_create_info.arrayLayers = 1;
15629 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15630 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15631 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15632 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015633
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015634 VkImage image;
15635 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015636 ASSERT_VK_SUCCESS(err);
15637
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015638 VkMemoryRequirements requirements;
15639 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15640
15641 VkMemoryAllocateInfo alloc_info{};
15642 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15643 alloc_info.pNext = NULL;
15644 alloc_info.memoryTypeIndex = 0;
15645 alloc_info.allocationSize = requirements.size;
15646 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15647 ASSERT_TRUE(pass);
15648
15649 VkDeviceMemory memory;
15650 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15651 ASSERT_VK_SUCCESS(err);
15652
15653 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15654
Tobin Ehliscde08892015-09-22 10:11:37 -060015655 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015656 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015657 image_view_create_info.image = image;
15658 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15659 image_view_create_info.format = tex_format;
15660 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015661 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015662 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015663 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015664
15665 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015667 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015668 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015669
15670 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015671 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015672}
Mike Stroyana3082432015-09-25 13:39:21 -060015673
Mark Youngd339ba32016-05-30 13:28:35 -060015674TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15675 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015677 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015678
Tony Barbour1fa09702017-03-16 12:09:08 -060015679 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015680
15681 // Create an image and try to create a view with no memory backing the image
15682 VkImage image;
15683
15684 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15685 const int32_t tex_width = 32;
15686 const int32_t tex_height = 32;
15687
15688 VkImageCreateInfo image_create_info = {};
15689 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15690 image_create_info.pNext = NULL;
15691 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15692 image_create_info.format = tex_format;
15693 image_create_info.extent.width = tex_width;
15694 image_create_info.extent.height = tex_height;
15695 image_create_info.extent.depth = 1;
15696 image_create_info.mipLevels = 1;
15697 image_create_info.arrayLayers = 1;
15698 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15699 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15700 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15701 image_create_info.flags = 0;
15702
15703 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15704 ASSERT_VK_SUCCESS(err);
15705
15706 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015707 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015708 image_view_create_info.image = image;
15709 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15710 image_view_create_info.format = tex_format;
15711 image_view_create_info.subresourceRange.layerCount = 1;
15712 image_view_create_info.subresourceRange.baseMipLevel = 0;
15713 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015714 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015715
15716 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015717 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015718
15719 m_errorMonitor->VerifyFound();
15720 vkDestroyImage(m_device->device(), image, NULL);
15721 // If last error is success, it still created the view, so delete it.
15722 if (err == VK_SUCCESS) {
15723 vkDestroyImageView(m_device->device(), view, NULL);
15724 }
Mark Youngd339ba32016-05-30 13:28:35 -060015725}
15726
Karl Schultz6addd812016-02-02 17:17:23 -070015727TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015728 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015730
Tony Barbour1fa09702017-03-16 12:09:08 -060015731 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015732
Karl Schultz6addd812016-02-02 17:17:23 -070015733 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015734 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015735 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015736 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015737
15738 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015739 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015740 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015741 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15742 image_view_create_info.format = tex_format;
15743 image_view_create_info.subresourceRange.baseMipLevel = 0;
15744 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015745 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015746 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015747 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015748
15749 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015750 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015751
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015752 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015753}
15754
Mike Weiblena1e13f42017-02-09 21:25:59 -070015755TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15756 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15757
Tony Barbour1fa09702017-03-16 12:09:08 -060015758 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015759 VkSubresourceLayout subres_layout = {};
15760
15761 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15762 {
15763 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15764 VkImageObj img(m_device);
15765 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15766 ASSERT_TRUE(img.initialized());
15767
15768 VkImageSubresource subres = {};
15769 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15770 subres.mipLevel = 0;
15771 subres.arrayLayer = 0;
15772
15773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15774 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15775 m_errorMonitor->VerifyFound();
15776 }
15777
15778 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15779 {
15780 VkImageObj img(m_device);
15781 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15782 ASSERT_TRUE(img.initialized());
15783
15784 VkImageSubresource subres = {};
15785 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15786 subres.mipLevel = 0;
15787 subres.arrayLayer = 0;
15788
15789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15791 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15792 m_errorMonitor->VerifyFound();
15793 }
15794
15795 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15796 {
15797 VkImageObj img(m_device);
15798 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15799 ASSERT_TRUE(img.initialized());
15800
15801 VkImageSubresource subres = {};
15802 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15803 subres.mipLevel = 1; // ERROR: triggers VU 00739
15804 subres.arrayLayer = 0;
15805
15806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15807 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15808 m_errorMonitor->VerifyFound();
15809 }
15810
15811 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15812 {
15813 VkImageObj img(m_device);
15814 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15815 ASSERT_TRUE(img.initialized());
15816
15817 VkImageSubresource subres = {};
15818 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15819 subres.mipLevel = 0;
15820 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15821
15822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15823 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15824 m_errorMonitor->VerifyFound();
15825 }
15826}
15827
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015828TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015829 VkResult err;
15830 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015831
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015833
Tony Barbour1fa09702017-03-16 12:09:08 -060015834 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015835
15836 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015837 VkImage srcImage;
15838 VkImage dstImage;
15839 VkDeviceMemory srcMem;
15840 VkDeviceMemory destMem;
15841 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015842
15843 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015844 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15845 image_create_info.pNext = NULL;
15846 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15847 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15848 image_create_info.extent.width = 32;
15849 image_create_info.extent.height = 32;
15850 image_create_info.extent.depth = 1;
15851 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015852 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015853 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15854 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15855 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15856 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015857
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015858 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015859 ASSERT_VK_SUCCESS(err);
15860
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015861 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015862 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015863 ASSERT_VK_SUCCESS(err);
15864
15865 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015866 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015867 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15868 memAlloc.pNext = NULL;
15869 memAlloc.allocationSize = 0;
15870 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015871
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015872 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015873 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015874 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015875 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015876 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015877 ASSERT_VK_SUCCESS(err);
15878
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015879 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015880 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015881 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015882 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015883 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015884 ASSERT_VK_SUCCESS(err);
15885
15886 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15887 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015888 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015889 ASSERT_VK_SUCCESS(err);
15890
Tony Barbour552f6c02016-12-21 14:34:07 -070015891 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015892 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015893 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015894 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015895 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015896 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015897 copyRegion.srcOffset.x = 0;
15898 copyRegion.srcOffset.y = 0;
15899 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015900 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015901 copyRegion.dstSubresource.mipLevel = 0;
15902 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015903 // Introduce failure by forcing the dst layerCount to differ from src
15904 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015905 copyRegion.dstOffset.x = 0;
15906 copyRegion.dstOffset.y = 0;
15907 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015908 copyRegion.extent.width = 1;
15909 copyRegion.extent.height = 1;
15910 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015911 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015912 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015913
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015914 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015915
Chia-I Wuf7458c52015-10-26 21:10:41 +080015916 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015917 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015918 vkFreeMemory(m_device->device(), srcMem, NULL);
15919 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015920}
15921
Tony Barbourd6673642016-05-05 14:46:39 -060015922TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015923 TEST_DESCRIPTION("Creating images with unsuported formats ");
15924
Tony Barbour1fa09702017-03-16 12:09:08 -060015925 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015926 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015927
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015928 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015929 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015930 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015931 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15932 image_create_info.format = VK_FORMAT_UNDEFINED;
15933 image_create_info.extent.width = 32;
15934 image_create_info.extent.height = 32;
15935 image_create_info.extent.depth = 1;
15936 image_create_info.mipLevels = 1;
15937 image_create_info.arrayLayers = 1;
15938 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15939 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15940 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015941
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15943 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015944
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015945 VkImage image;
15946 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015947 m_errorMonitor->VerifyFound();
15948
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015949 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015950 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015951 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15952 VkFormat format = static_cast<VkFormat>(f);
15953 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015954 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015955 unsupported = format;
15956 break;
15957 }
15958 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015959
Tony Barbourd6673642016-05-05 14:46:39 -060015960 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015961 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015963
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015964 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015965 m_errorMonitor->VerifyFound();
15966 }
15967}
15968
15969TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015970 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15971
Tony Barbour1fa09702017-03-16 12:09:08 -060015972 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060015973 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070015974 if (!depth_format) {
15975 return;
15976 }
Tony Barbourd6673642016-05-05 14:46:39 -060015977
15978 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015979 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060015980 VK_IMAGE_TILING_OPTIMAL, 0);
15981 ASSERT_TRUE(image.initialized());
15982
15983 VkImageView imgView;
15984 VkImageViewCreateInfo imgViewInfo = {};
15985 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15986 imgViewInfo.image = image.handle();
15987 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15988 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15989 imgViewInfo.subresourceRange.layerCount = 1;
15990 imgViewInfo.subresourceRange.baseMipLevel = 0;
15991 imgViewInfo.subresourceRange.levelCount = 1;
15992 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15993
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015994 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015995 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015997 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15998 m_errorMonitor->VerifyFound();
15999 imgViewInfo.subresourceRange.baseMipLevel = 0;
16000
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016001 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016002 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016004 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16005 m_errorMonitor->VerifyFound();
16006 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16007
Tony Barbourd6673642016-05-05 14:46:39 -060016008 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16009 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016011 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16012 m_errorMonitor->VerifyFound();
16013 imgViewInfo.subresourceRange.levelCount = 1;
16014
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016015 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16016 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016017 m_errorMonitor->SetDesiredFailureMsg(
16018 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16019 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016020 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16021 m_errorMonitor->VerifyFound();
16022 imgViewInfo.subresourceRange.layerCount = 1;
16023
Tony Barbourd6673642016-05-05 14:46:39 -060016024 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016025 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016026 m_errorMonitor->SetDesiredFailureMsg(
16027 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16028 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016029 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16030 m_errorMonitor->VerifyFound();
16031 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16032
Tony Barbourd6673642016-05-05 14:46:39 -060016033 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16034 // VIEW_CREATE_ERROR
16035 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016037 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16038 m_errorMonitor->VerifyFound();
16039 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16040
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016041 // TODO: Update framework to easily passing mutable flag into ImageObj init
16042 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016043 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16044 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16045 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016046 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16047 // VIEW_CREATE_ERROR
16048 VkImageCreateInfo mutImgInfo = image.create_info();
16049 VkImage mutImage;
16050 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016051 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016052 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16053 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016054 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016055 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016056
16057 VkMemoryRequirements requirements;
16058 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16059
16060 VkMemoryAllocateInfo alloc_info{};
16061 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16062 alloc_info.pNext = NULL;
16063 alloc_info.memoryTypeIndex = 0;
16064 alloc_info.allocationSize = requirements.size;
16065 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16066 ASSERT_TRUE(pass);
16067
16068 VkDeviceMemory memory;
16069 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16070 ASSERT_VK_SUCCESS(ret);
16071
16072 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16073 ASSERT_VK_SUCCESS(ret);
16074
Tony Barbourd6673642016-05-05 14:46:39 -060016075 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016077 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16078 m_errorMonitor->VerifyFound();
16079 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016080
16081 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016082 vkDestroyImage(m_device->handle(), mutImage, NULL);
16083}
16084
Dave Houlton75967fc2017-03-06 17:21:16 -070016085TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16086 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16087
Tony Barbour1fa09702017-03-16 12:09:08 -060016088 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016089
Jamie Madill35127872017-03-15 16:17:46 -040016090 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016091 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16092 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16093 if (device_features.textureCompressionBC) {
16094 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16095 } else if (device_features.textureCompressionETC2) {
16096 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16097 } else if (device_features.textureCompressionASTC_LDR) {
16098 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16099 } else {
16100 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16101 return;
16102 }
16103
16104 VkImageCreateInfo ci;
16105 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16106 ci.pNext = NULL;
16107 ci.flags = 0;
16108 ci.imageType = VK_IMAGE_TYPE_2D;
16109 ci.format = compressed_format;
16110 ci.extent = {32, 32, 1};
16111 ci.mipLevels = 6;
16112 ci.arrayLayers = 1;
16113 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16114 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16115 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16116 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16117 ci.queueFamilyIndexCount = 0;
16118 ci.pQueueFamilyIndices = NULL;
16119 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16120
16121 VkImageObj image(m_device);
16122 image.init(&ci);
16123 ASSERT_TRUE(image.initialized());
16124
16125 VkImageObj odd_image(m_device);
16126 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16127 odd_image.init(&ci);
16128 ASSERT_TRUE(odd_image.initialized());
16129
16130 // Allocate buffers
16131 VkMemoryPropertyFlags reqs = 0;
16132 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16133 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16134 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16135 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16136 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16137
16138 VkBufferImageCopy region = {};
16139 region.bufferRowLength = 0;
16140 region.bufferImageHeight = 0;
16141 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16142 region.imageSubresource.layerCount = 1;
16143 region.imageOffset = {0, 0, 0};
16144 region.bufferOffset = 0;
16145
16146 // start recording
16147 m_commandBuffer->BeginCommandBuffer();
16148
16149 // Mip level copies that work - 5 levels
16150 m_errorMonitor->ExpectSuccess();
16151
16152 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16153 region.imageExtent = {32, 32, 1};
16154 region.imageSubresource.mipLevel = 0;
16155 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16156 &region);
16157 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16158 &region);
16159
16160 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16161 region.imageExtent = {8, 8, 1};
16162 region.imageSubresource.mipLevel = 2;
16163 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16164 &region);
16165 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16166 &region);
16167
16168 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16169 region.imageExtent = {4, 4, 1};
16170 region.imageSubresource.mipLevel = 3;
16171 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16172 &region);
16173 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16174 &region);
16175
16176 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16177 region.imageExtent = {2, 2, 1};
16178 region.imageSubresource.mipLevel = 4;
16179 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16180 &region);
16181 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16182 &region);
16183
16184 region.imageExtent = {1, 1, 1};
16185 region.imageSubresource.mipLevel = 5;
16186 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16187 &region);
16188 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16189 &region);
16190 m_errorMonitor->VerifyNotFound();
16191
16192 // Buffer must accomodate a full compressed block, regardless of texel count
16193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16194 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16195 &region);
16196 m_errorMonitor->VerifyFound();
16197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16198 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16199 &region);
16200 m_errorMonitor->VerifyFound();
16201
16202 // Copy width < compressed block size, but not the full mip width
16203 region.imageExtent = {1, 2, 1};
16204 region.imageSubresource.mipLevel = 4;
16205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16206 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16207 &region);
16208 m_errorMonitor->VerifyFound();
16209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16210 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16211 &region);
16212 m_errorMonitor->VerifyFound();
16213
16214 // Copy height < compressed block size but not the full mip height
16215 region.imageExtent = {2, 1, 1};
16216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16217 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16218 &region);
16219 m_errorMonitor->VerifyFound();
16220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16221 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16222 &region);
16223 m_errorMonitor->VerifyFound();
16224
16225 // Offsets must be multiple of compressed block size
16226 region.imageOffset = {1, 1, 0};
16227 region.imageExtent = {1, 1, 1};
16228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16229 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16230 &region);
16231 m_errorMonitor->VerifyFound();
16232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16233 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16234 &region);
16235 m_errorMonitor->VerifyFound();
16236
16237 // Offset + extent width = mip width - should succeed
16238 region.imageOffset = {4, 4, 0};
16239 region.imageExtent = {3, 4, 1};
16240 region.imageSubresource.mipLevel = 2;
16241 m_errorMonitor->ExpectSuccess();
16242 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16243 &region);
16244 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16245 &region);
16246 m_errorMonitor->VerifyNotFound();
16247
16248 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16249 region.imageExtent = {4, 4, 1};
16250 m_errorMonitor->ExpectSuccess();
16251 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16252 &region);
16253 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16254 &region);
16255 m_errorMonitor->VerifyNotFound();
16256
16257 // Offset + extent width < mip width and not a multiple of block width - should fail
16258 region.imageExtent = {3, 3, 1};
16259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16260 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16261 &region);
16262 m_errorMonitor->VerifyFound();
16263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16264 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16265 &region);
16266 m_errorMonitor->VerifyFound();
16267}
16268
Dave Houlton59a20702017-02-02 17:26:23 -070016269TEST_F(VkLayerTest, ImageBufferCopyTests) {
16270 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16271
Tony Barbour1fa09702017-03-16 12:09:08 -060016272 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016273 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16274 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16275 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16276 return;
16277 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016278
16279 // Bail if any dimension of transfer granularity is 0.
16280 auto index = m_device->graphics_queue_node_index_;
16281 auto queue_family_properties = m_device->phy().queue_properties();
16282 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16283 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16284 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16285 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16286 return;
16287 }
16288
Dave Houlton59a20702017-02-02 17:26:23 -070016289 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16290 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16291 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016292 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16293 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16294 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16295 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16296
Dave Houlton59a20702017-02-02 17:26:23 -070016297 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16298 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16299 VK_IMAGE_TILING_OPTIMAL, 0);
16300 image_16k.init(64, 64, VK_FORMAT_R8G8B8A8_UINT,
16301 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16302 VK_IMAGE_TILING_OPTIMAL, 0);
16303 image_16k_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16304 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016305 ASSERT_TRUE(image_64k.initialized());
16306 ASSERT_TRUE(image_16k.initialized());
16307 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016308
Dave Houltonf3229d52017-02-21 15:59:08 -070016309 // Verify all needed Depth/Stencil formats are supported
16310 bool missing_ds_support = false;
16311 VkFormatProperties props = {0, 0, 0};
16312 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16313 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16314 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16315 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16316 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16317 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16318 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16319 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16320
16321 if (!missing_ds_support) {
16322 ds_image_4D_1S.init(
16323 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16324 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16325 VK_IMAGE_TILING_OPTIMAL, 0);
16326 ASSERT_TRUE(ds_image_4D_1S.initialized());
16327
16328 ds_image_3D_1S.init(
16329 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16330 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16331 VK_IMAGE_TILING_OPTIMAL, 0);
16332 ASSERT_TRUE(ds_image_3D_1S.initialized());
16333
16334 ds_image_2D.init(
16335 256, 256, VK_FORMAT_D16_UNORM,
16336 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16337 VK_IMAGE_TILING_OPTIMAL, 0);
16338 ASSERT_TRUE(ds_image_2D.initialized());
16339
16340 ds_image_1S.init(
16341 256, 256, VK_FORMAT_S8_UINT,
16342 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16343 VK_IMAGE_TILING_OPTIMAL, 0);
16344 ASSERT_TRUE(ds_image_1S.initialized());
16345 }
16346
16347 // Allocate buffers
16348 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016349 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016350 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16351 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16352 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16353 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016354
16355 VkBufferImageCopy region = {};
16356 region.bufferRowLength = 0;
16357 region.bufferImageHeight = 0;
16358 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16359 region.imageSubresource.layerCount = 1;
16360 region.imageOffset = {0, 0, 0};
16361 region.imageExtent = {64, 64, 1};
16362 region.bufferOffset = 0;
16363
16364 // attempt copies before putting command buffer in recording state
16365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16366 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16367 &region);
16368 m_errorMonitor->VerifyFound();
16369
16370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16371 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16372 &region);
16373 m_errorMonitor->VerifyFound();
16374
16375 // start recording
16376 m_commandBuffer->BeginCommandBuffer();
16377
16378 // successful copies
16379 m_errorMonitor->ExpectSuccess();
16380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16381 &region);
16382 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16383 &region);
16384 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16385 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16386 &region);
16387 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16388 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16389 &region);
16390 region.imageOffset.x = 0;
16391 region.imageExtent.height = 64;
16392 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16393 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16394 &region);
16395 m_errorMonitor->VerifyNotFound();
16396
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016397 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016398 region.imageExtent = {65, 64, 1};
16399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16400 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16401 &region);
16402 m_errorMonitor->VerifyFound();
16403
16404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16405 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16406 &region);
16407 m_errorMonitor->VerifyFound();
16408
16409 // image/buffer too small (offset) on copy to image
16410 region.imageExtent = {64, 64, 1};
16411 region.imageOffset = {0, 4, 0};
16412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16413 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16414 &region);
16415 m_errorMonitor->VerifyFound();
16416
16417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16418 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16419 &region);
16420 m_errorMonitor->VerifyFound();
16421
16422 // image/buffer too small on copy to buffer
16423 region.imageExtent = {64, 64, 1};
16424 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016425 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16427 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16428 &region);
16429 m_errorMonitor->VerifyFound();
16430
16431 region.imageExtent = {64, 65, 1};
16432 region.bufferOffset = 0;
16433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16434 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16435 &region);
16436 m_errorMonitor->VerifyFound();
16437
16438 // buffer size ok but rowlength causes loose packing
16439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16440 region.imageExtent = {64, 64, 1};
16441 region.bufferRowLength = 68;
16442 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16443 &region);
16444 m_errorMonitor->VerifyFound();
16445
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016446 // An extent with zero area should produce a warning, but no error
16447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16448 region.imageExtent.width = 0;
16449 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16450 &region);
16451 m_errorMonitor->VerifyFound();
16452
Dave Houlton59a20702017-02-02 17:26:23 -070016453 // aspect bits
16454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16455 region.imageExtent = {64, 64, 1};
16456 region.bufferRowLength = 0;
16457 region.bufferImageHeight = 0;
16458 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16459 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16460 buffer_16k.handle(), 1, &region);
16461 m_errorMonitor->VerifyFound();
16462
16463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16464 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16465 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16466 &region);
16467 m_errorMonitor->VerifyFound();
16468
16469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16470 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16471 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16472 buffer_16k.handle(), 1, &region);
16473 m_errorMonitor->VerifyFound();
16474
Dave Houltonf3229d52017-02-21 15:59:08 -070016475 // Test Depth/Stencil copies
16476 if (missing_ds_support) {
16477 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16478 } else {
16479 VkBufferImageCopy ds_region = {};
16480 ds_region.bufferOffset = 0;
16481 ds_region.bufferRowLength = 0;
16482 ds_region.bufferImageHeight = 0;
16483 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16484 ds_region.imageSubresource.mipLevel = 0;
16485 ds_region.imageSubresource.baseArrayLayer = 0;
16486 ds_region.imageSubresource.layerCount = 1;
16487 ds_region.imageOffset = {0, 0, 0};
16488 ds_region.imageExtent = {256, 256, 1};
16489
16490 // Depth copies that should succeed
16491 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16492 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16493 buffer_256k.handle(), 1, &ds_region);
16494 m_errorMonitor->VerifyNotFound();
16495
16496 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16497 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16498 buffer_256k.handle(), 1, &ds_region);
16499 m_errorMonitor->VerifyNotFound();
16500
16501 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16502 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16503 buffer_128k.handle(), 1, &ds_region);
16504 m_errorMonitor->VerifyNotFound();
16505
16506 // Depth copies that should fail
16507 ds_region.bufferOffset = 4;
16508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16509 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16510 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16511 buffer_256k.handle(), 1, &ds_region);
16512 m_errorMonitor->VerifyFound();
16513
16514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16515 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16516 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16517 buffer_256k.handle(), 1, &ds_region);
16518 m_errorMonitor->VerifyFound();
16519
16520 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16521 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16522 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16523 buffer_128k.handle(), 1, &ds_region);
16524 m_errorMonitor->VerifyFound();
16525
16526 // Stencil copies that should succeed
16527 ds_region.bufferOffset = 0;
16528 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16529 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16530 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16531 buffer_64k.handle(), 1, &ds_region);
16532 m_errorMonitor->VerifyNotFound();
16533
16534 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16535 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16536 buffer_64k.handle(), 1, &ds_region);
16537 m_errorMonitor->VerifyNotFound();
16538
16539 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16540 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16541 buffer_64k.handle(), 1, &ds_region);
16542 m_errorMonitor->VerifyNotFound();
16543
16544 // Stencil copies that should fail
16545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16546 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16547 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16548 buffer_16k.handle(), 1, &ds_region);
16549 m_errorMonitor->VerifyFound();
16550
16551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16552 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16553 ds_region.bufferRowLength = 260;
16554 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16555 buffer_64k.handle(), 1, &ds_region);
16556 m_errorMonitor->VerifyFound();
16557
16558 ds_region.bufferRowLength = 0;
16559 ds_region.bufferOffset = 4;
16560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16561 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16562 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16563 buffer_64k.handle(), 1, &ds_region);
16564 m_errorMonitor->VerifyFound();
16565 }
16566
Dave Houlton584d51e2017-02-16 12:52:54 -070016567 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016568 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016569 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016570 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16571 device_features.textureCompressionASTC_LDR)) {
16572 printf(" No compressed formats supported - block compression tests skipped.\n");
16573 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016574 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16575 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016576 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016577 image_16k_4x4comp.init(128, 128, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016578 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16579 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016580 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016581 image_16k_4x4comp.init(128, 128, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton584d51e2017-02-16 12:52:54 -070016582 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016583 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16584 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016585 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016586 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16587 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016588 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16589 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016590 }
16591 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016592
Dave Houlton584d51e2017-02-16 12:52:54 -070016593 // Just fits
16594 m_errorMonitor->ExpectSuccess();
16595 region.imageExtent = {128, 128, 1};
16596 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16597 buffer_16k.handle(), 1, &region);
16598 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016599
Dave Houlton584d51e2017-02-16 12:52:54 -070016600 // with offset, too big for buffer
16601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16602 region.bufferOffset = 16;
16603 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16604 buffer_16k.handle(), 1, &region);
16605 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016606 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016607
Dave Houlton67e9b532017-03-02 17:00:10 -070016608 // extents that are not a multiple of compressed block size
16609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16610 region.imageExtent.width = 66;
16611 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16612 buffer_16k.handle(), 1, &region);
16613 m_errorMonitor->VerifyFound();
16614 region.imageExtent.width = 128;
16615
16616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016617 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016618 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16619 buffer_16k.handle(), 1, &region);
16620 m_errorMonitor->VerifyFound();
16621 region.imageExtent.height = 128;
16622
16623 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16624
16625 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16626 m_errorMonitor->ExpectSuccess();
16627 region.imageExtent.width = 66;
16628 region.imageOffset.x = 64;
16629 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16630 buffer_16k.handle(), 1, &region);
16631 region.imageExtent.width = 16;
16632 region.imageOffset.x = 0;
16633 region.imageExtent.height = 2;
16634 region.imageOffset.y = 128;
16635 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016636 buffer_16k.handle(), 1, &region);
16637 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016638 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016639
Dave Houlton584d51e2017-02-16 12:52:54 -070016640 // buffer offset must be a multiple of texel block size (16)
16641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16643 region.imageExtent = {64, 64, 1};
16644 region.bufferOffset = 24;
16645 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16646 buffer_16k.handle(), 1, &region);
16647 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016648
Dave Houlton584d51e2017-02-16 12:52:54 -070016649 // rowlength not a multiple of block width (4)
16650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16651 region.bufferOffset = 0;
16652 region.bufferRowLength = 130;
16653 region.bufferImageHeight = 0;
16654 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16655 buffer_64k.handle(), 1, &region);
16656 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016657
Dave Houlton584d51e2017-02-16 12:52:54 -070016658 // imageheight not a multiple of block height (4)
16659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16660 region.bufferRowLength = 0;
16661 region.bufferImageHeight = 130;
16662 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16663 buffer_64k.handle(), 1, &region);
16664 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016665 }
Dave Houlton59a20702017-02-02 17:26:23 -070016666}
16667
Tony Barbourd6673642016-05-05 14:46:39 -060016668TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016669 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016670
Tony Barbour1fa09702017-03-16 12:09:08 -060016671 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016672
Rene Lindsay135204f2016-12-22 17:11:09 -070016673 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016674 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016675 image.init(128, 128, VK_FORMAT_R16G16B16A16_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016676 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016677 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016678 vk_testing::Buffer buffer;
16679 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016680 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016681 VkBufferImageCopy region = {};
16682 region.bufferRowLength = 128;
16683 region.bufferImageHeight = 128;
16684 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16685 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016686 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016687 region.imageExtent.height = 4;
16688 region.imageExtent.width = 4;
16689 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016690
16691 VkImageObj image2(m_device);
16692 image2.init(128, 128, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016693 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016694 ASSERT_TRUE(image2.initialized());
16695 vk_testing::Buffer buffer2;
16696 VkMemoryPropertyFlags reqs2 = 0;
16697 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16698 VkBufferImageCopy region2 = {};
16699 region2.bufferRowLength = 128;
16700 region2.bufferImageHeight = 128;
16701 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16702 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16703 region2.imageSubresource.layerCount = 1;
16704 region2.imageExtent.height = 4;
16705 region2.imageExtent.width = 4;
16706 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016707 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016708
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016709 // Image must have offset.z of 0 and extent.depth of 1
16710 // Introduce failure by setting imageExtent.depth to 0
16711 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016713 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016714 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016715 m_errorMonitor->VerifyFound();
16716
16717 region.imageExtent.depth = 1;
16718
16719 // Image must have offset.z of 0 and extent.depth of 1
16720 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016721 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016722 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016725 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016726 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016727 m_errorMonitor->VerifyFound();
16728
16729 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016730 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16731 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016732 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016734 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16735 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016736 m_errorMonitor->VerifyFound();
16737
16738 // BufferOffset must be a multiple of 4
16739 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016740 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016742 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16743 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016744 m_errorMonitor->VerifyFound();
16745
16746 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16747 region.bufferOffset = 0;
16748 region.imageExtent.height = 128;
16749 region.imageExtent.width = 128;
16750 // Introduce failure by setting bufferRowLength > 0 but less than width
16751 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016753 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16754 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016755 m_errorMonitor->VerifyFound();
16756
16757 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16758 region.bufferRowLength = 128;
16759 // Introduce failure by setting bufferRowHeight > 0 but less than height
16760 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016762 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16763 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016764 m_errorMonitor->VerifyFound();
16765
16766 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016767 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016768 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16769 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016770 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016771 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16772 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016773 VkImageBlit blitRegion = {};
16774 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16775 blitRegion.srcSubresource.baseArrayLayer = 0;
16776 blitRegion.srcSubresource.layerCount = 1;
16777 blitRegion.srcSubresource.mipLevel = 0;
16778 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16779 blitRegion.dstSubresource.baseArrayLayer = 0;
16780 blitRegion.dstSubresource.layerCount = 1;
16781 blitRegion.dstSubresource.mipLevel = 0;
16782
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016783 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16785 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16787 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016788 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16789 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016790 m_errorMonitor->VerifyFound();
16791
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016793 VkImageMemoryBarrier img_barrier;
16794 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16795 img_barrier.pNext = NULL;
16796 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16797 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16798 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16799 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16800 img_barrier.image = image.handle();
16801 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16802 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16803 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16804 img_barrier.subresourceRange.baseArrayLayer = 0;
16805 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016806 img_barrier.subresourceRange.layerCount = 0;
16807 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016808 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16809 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016810 m_errorMonitor->VerifyFound();
16811 img_barrier.subresourceRange.layerCount = 1;
16812}
16813
16814TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016815 TEST_DESCRIPTION("Exceed the limits of image format ");
16816
Tony Barbour1fa09702017-03-16 12:09:08 -060016817 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016818
16819 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16820 {
16821 VkFormatProperties properties;
16822 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16823 if (properties.linearTilingFeatures == 0) {
16824 printf(" Image format not supported; skipped.\n");
16825 return;
16826 }
16827 }
16828
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016830 VkImageCreateInfo image_create_info = {};
16831 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16832 image_create_info.pNext = NULL;
16833 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016834 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016835 image_create_info.extent.width = 32;
16836 image_create_info.extent.height = 32;
16837 image_create_info.extent.depth = 1;
16838 image_create_info.mipLevels = 1;
16839 image_create_info.arrayLayers = 1;
16840 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16841 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16842 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16843 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16844 image_create_info.flags = 0;
16845
16846 VkImage nullImg;
16847 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016848 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16849 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016850 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016851 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16852 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16853 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016854 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016855
Tony Barbour0907e362017-03-09 15:05:30 -070016856 uint32_t maxDim =
16857 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16858 // If max mip levels exceeds image extents, skip the max mip levels test
16859 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16861 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16862 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16863 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16864 m_errorMonitor->VerifyFound();
16865 image_create_info.mipLevels = 1;
16866 }
Tony Barbourd6673642016-05-05 14:46:39 -060016867
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016869 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16870 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16871 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16872 m_errorMonitor->VerifyFound();
16873 image_create_info.arrayLayers = 1;
16874
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016876 int samples = imgFmtProps.sampleCounts >> 1;
16877 image_create_info.samples = (VkSampleCountFlagBits)samples;
16878 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16879 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16880 m_errorMonitor->VerifyFound();
16881 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16882
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16884 "pCreateInfo->initialLayout, must be "
16885 "VK_IMAGE_LAYOUT_UNDEFINED or "
16886 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016887 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16888 // Expect INVALID_LAYOUT
16889 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16890 m_errorMonitor->VerifyFound();
16891 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16892}
16893
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016894TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016895 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016897
Tony Barbour1fa09702017-03-16 12:09:08 -060016898 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016899
16900 VkImageObj src_image(m_device);
16901 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16902 VkImageObj dst_image(m_device);
16903 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16904
Tony Barbour552f6c02016-12-21 14:34:07 -070016905 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016906 VkImageCopy copy_region;
16907 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16908 copy_region.srcSubresource.mipLevel = 0;
16909 copy_region.srcSubresource.baseArrayLayer = 0;
16910 copy_region.srcSubresource.layerCount = 0;
16911 copy_region.srcOffset.x = 0;
16912 copy_region.srcOffset.y = 0;
16913 copy_region.srcOffset.z = 0;
16914 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16915 copy_region.dstSubresource.mipLevel = 0;
16916 copy_region.dstSubresource.baseArrayLayer = 0;
16917 copy_region.dstSubresource.layerCount = 0;
16918 copy_region.dstOffset.x = 0;
16919 copy_region.dstOffset.y = 0;
16920 copy_region.dstOffset.z = 0;
16921 copy_region.extent.width = 64;
16922 copy_region.extent.height = 64;
16923 copy_region.extent.depth = 1;
16924 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16925 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016926 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016927
16928 m_errorMonitor->VerifyFound();
16929}
16930
16931TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016932 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016934
Tony Barbour1fa09702017-03-16 12:09:08 -060016935 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016936
16937 VkImageObj src_image(m_device);
16938 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16939 VkImageObj dst_image(m_device);
16940 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16941
Tony Barbour552f6c02016-12-21 14:34:07 -070016942 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016943 VkImageCopy copy_region;
16944 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16945 copy_region.srcSubresource.mipLevel = 0;
16946 copy_region.srcSubresource.baseArrayLayer = 0;
16947 copy_region.srcSubresource.layerCount = 0;
16948 copy_region.srcOffset.x = 0;
16949 copy_region.srcOffset.y = 0;
16950 copy_region.srcOffset.z = 0;
16951 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16952 copy_region.dstSubresource.mipLevel = 0;
16953 copy_region.dstSubresource.baseArrayLayer = 0;
16954 copy_region.dstSubresource.layerCount = 0;
16955 copy_region.dstOffset.x = 0;
16956 copy_region.dstOffset.y = 0;
16957 copy_region.dstOffset.z = 0;
16958 copy_region.extent.width = 64;
16959 copy_region.extent.height = 64;
16960 copy_region.extent.depth = 1;
16961 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16962 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016963 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016964
16965 m_errorMonitor->VerifyFound();
16966}
16967
Karl Schultz6addd812016-02-02 17:17:23 -070016968TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016969 VkResult err;
16970 bool pass;
16971
16972 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016974
Tony Barbour1fa09702017-03-16 12:09:08 -060016975 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016976
16977 // Create two images of different types and try to copy between them
16978 VkImage srcImage;
16979 VkImage dstImage;
16980 VkDeviceMemory srcMem;
16981 VkDeviceMemory destMem;
16982 VkMemoryRequirements memReqs;
16983
16984 VkImageCreateInfo image_create_info = {};
16985 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16986 image_create_info.pNext = NULL;
16987 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16988 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16989 image_create_info.extent.width = 32;
16990 image_create_info.extent.height = 32;
16991 image_create_info.extent.depth = 1;
16992 image_create_info.mipLevels = 1;
16993 image_create_info.arrayLayers = 1;
16994 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16995 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16996 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16997 image_create_info.flags = 0;
16998
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016999 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017000 ASSERT_VK_SUCCESS(err);
17001
17002 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17003 // Introduce failure by creating second image with a different-sized format.
17004 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
17005
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017006 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017007 ASSERT_VK_SUCCESS(err);
17008
17009 // Allocate memory
17010 VkMemoryAllocateInfo memAlloc = {};
17011 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17012 memAlloc.pNext = NULL;
17013 memAlloc.allocationSize = 0;
17014 memAlloc.memoryTypeIndex = 0;
17015
17016 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17017 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017018 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017019 ASSERT_TRUE(pass);
17020 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17021 ASSERT_VK_SUCCESS(err);
17022
17023 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17024 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017025 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017026 ASSERT_TRUE(pass);
17027 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17028 ASSERT_VK_SUCCESS(err);
17029
17030 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17031 ASSERT_VK_SUCCESS(err);
17032 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17033 ASSERT_VK_SUCCESS(err);
17034
Tony Barbour552f6c02016-12-21 14:34:07 -070017035 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017036 VkImageCopy copyRegion;
17037 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17038 copyRegion.srcSubresource.mipLevel = 0;
17039 copyRegion.srcSubresource.baseArrayLayer = 0;
17040 copyRegion.srcSubresource.layerCount = 0;
17041 copyRegion.srcOffset.x = 0;
17042 copyRegion.srcOffset.y = 0;
17043 copyRegion.srcOffset.z = 0;
17044 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17045 copyRegion.dstSubresource.mipLevel = 0;
17046 copyRegion.dstSubresource.baseArrayLayer = 0;
17047 copyRegion.dstSubresource.layerCount = 0;
17048 copyRegion.dstOffset.x = 0;
17049 copyRegion.dstOffset.y = 0;
17050 copyRegion.dstOffset.z = 0;
17051 copyRegion.extent.width = 1;
17052 copyRegion.extent.height = 1;
17053 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017054 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017055 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017056
17057 m_errorMonitor->VerifyFound();
17058
17059 vkDestroyImage(m_device->device(), srcImage, NULL);
17060 vkDestroyImage(m_device->device(), dstImage, NULL);
17061 vkFreeMemory(m_device->device(), srcMem, NULL);
17062 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017063}
17064
Karl Schultz6addd812016-02-02 17:17:23 -070017065TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17066 VkResult err;
17067 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017068
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017069 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17071 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017072
Tony Barbour1fa09702017-03-16 12:09:08 -060017073 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017074 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017075 if (!depth_format) {
17076 return;
17077 }
Mike Stroyana3082432015-09-25 13:39:21 -060017078
17079 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017080 VkImage srcImage;
17081 VkImage dstImage;
17082 VkDeviceMemory srcMem;
17083 VkDeviceMemory destMem;
17084 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017085
17086 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017087 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17088 image_create_info.pNext = NULL;
17089 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017090 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017091 image_create_info.extent.width = 32;
17092 image_create_info.extent.height = 32;
17093 image_create_info.extent.depth = 1;
17094 image_create_info.mipLevels = 1;
17095 image_create_info.arrayLayers = 1;
17096 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17097 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17098 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17099 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017100
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017101 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017102 ASSERT_VK_SUCCESS(err);
17103
Karl Schultzbdb75952016-04-19 11:36:49 -060017104 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17105
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017106 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017107 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017108 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017109 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017110
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017111 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017112 ASSERT_VK_SUCCESS(err);
17113
17114 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017115 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017116 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17117 memAlloc.pNext = NULL;
17118 memAlloc.allocationSize = 0;
17119 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017120
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017121 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017122 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017123 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017124 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017125 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017126 ASSERT_VK_SUCCESS(err);
17127
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017128 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017129 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017130 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017131 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017132 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017133 ASSERT_VK_SUCCESS(err);
17134
17135 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17136 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017137 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017138 ASSERT_VK_SUCCESS(err);
17139
Tony Barbour552f6c02016-12-21 14:34:07 -070017140 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017141 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017142 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017143 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017144 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017145 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017146 copyRegion.srcOffset.x = 0;
17147 copyRegion.srcOffset.y = 0;
17148 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017149 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017150 copyRegion.dstSubresource.mipLevel = 0;
17151 copyRegion.dstSubresource.baseArrayLayer = 0;
17152 copyRegion.dstSubresource.layerCount = 0;
17153 copyRegion.dstOffset.x = 0;
17154 copyRegion.dstOffset.y = 0;
17155 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017156 copyRegion.extent.width = 1;
17157 copyRegion.extent.height = 1;
17158 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017159 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017160 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017161
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017162 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017163
Chia-I Wuf7458c52015-10-26 21:10:41 +080017164 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017165 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017166 vkFreeMemory(m_device->device(), srcMem, NULL);
17167 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017168}
17169
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017170TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17171 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017172
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017173 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017174
17175 VkImageFormatProperties image_format_properties;
17176 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17177 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17178 &image_format_properties);
17179
17180 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17181 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17182 printf(" Image multi-sample support not found; skipped.\n");
17183 return;
17184 }
17185
17186 VkImageCreateInfo ci;
17187 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17188 ci.pNext = NULL;
17189 ci.flags = 0;
17190 ci.imageType = VK_IMAGE_TYPE_2D;
17191 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17192 ci.extent = {128, 128, 1};
17193 ci.mipLevels = 1;
17194 ci.arrayLayers = 1;
17195 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17196 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17197 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17198 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17199 ci.queueFamilyIndexCount = 0;
17200 ci.pQueueFamilyIndices = NULL;
17201 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17202
17203 VkImageObj image1(m_device);
17204 image1.init(&ci);
17205 ASSERT_TRUE(image1.initialized());
17206
17207 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17208 VkImageObj image2(m_device);
17209 image2.init(&ci);
17210 ASSERT_TRUE(image2.initialized());
17211
17212 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17213 VkImageObj image4(m_device);
17214 image4.init(&ci);
17215 ASSERT_TRUE(image4.initialized());
17216
17217 m_commandBuffer->BeginCommandBuffer();
17218
17219 VkImageCopy copyRegion;
17220 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17221 copyRegion.srcSubresource.mipLevel = 0;
17222 copyRegion.srcSubresource.baseArrayLayer = 0;
17223 copyRegion.srcSubresource.layerCount = 1;
17224 copyRegion.srcOffset = {0, 0, 0};
17225 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17226 copyRegion.dstSubresource.mipLevel = 0;
17227 copyRegion.dstSubresource.baseArrayLayer = 0;
17228 copyRegion.dstSubresource.layerCount = 1;
17229 copyRegion.dstOffset = {0, 0, 0};
17230 copyRegion.extent = {128, 128, 1};
17231
17232 // Copy a single sample image to/from a multi-sample image
17233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17234 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17235 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17236 m_errorMonitor->VerifyFound();
17237
17238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17239 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17240 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17241 m_errorMonitor->VerifyFound();
17242
17243 // Copy between multi-sample images with different sample counts
17244 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17245 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17246 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17247 m_errorMonitor->VerifyFound();
17248
17249 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17250 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17251 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17252 m_errorMonitor->VerifyFound();
17253
17254 m_commandBuffer->EndCommandBuffer();
17255}
17256
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017257TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17258 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017259 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017260 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017261 if (!ds_format) {
17262 return;
17263 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017264
17265 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17266 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17267 depth_image.init(128, 128, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
Tony Barbour9357d542017-03-24 15:42:21 -060017268 ds_image.init(128, 128, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL,
17269 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017270 ASSERT_TRUE(color_image.initialized());
17271 ASSERT_TRUE(depth_image.initialized());
17272 ASSERT_TRUE(ds_image.initialized());
17273
17274 VkImageCopy copyRegion;
17275 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17276 copyRegion.srcSubresource.mipLevel = 0;
17277 copyRegion.srcSubresource.baseArrayLayer = 0;
17278 copyRegion.srcSubresource.layerCount = 1;
17279 copyRegion.srcOffset = {0, 0, 0};
17280 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17281 copyRegion.dstSubresource.mipLevel = 0;
17282 copyRegion.dstSubresource.baseArrayLayer = 0;
17283 copyRegion.dstSubresource.layerCount = 1;
17284 copyRegion.dstOffset = {64, 0, 0};
17285 copyRegion.extent = {64, 128, 1};
17286
17287 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17289 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17290 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17291 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017292 m_errorMonitor->VerifyFound();
17293
17294 m_commandBuffer->BeginCommandBuffer();
17295
17296 // Src and dest aspect masks don't match
17297 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017299 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17300 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017301 m_errorMonitor->VerifyFound();
17302 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17303
17304 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017305 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017306 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17308 // These aspect/format mismatches are redundant but unavoidable here
17309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017311 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17312 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017313 m_errorMonitor->VerifyFound();
17314 // Metadata aspect is illegal - VU 01222
17315 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17316 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17318 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017319 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17320 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017321 m_errorMonitor->VerifyFound();
17322
17323 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17324 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17325
17326 // Aspect mask doesn't match source image format - VU 01200
17327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17328 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17330 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17331 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17332 m_errorMonitor->VerifyFound();
17333
17334 // Aspect mask doesn't match dest image format - VU 01201
17335 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17336 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17338 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17340 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17341 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17342 m_errorMonitor->VerifyFound();
17343
17344 m_commandBuffer->EndCommandBuffer();
17345}
17346
Karl Schultz6addd812016-02-02 17:17:23 -070017347TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17348 VkResult err;
17349 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17352 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017353
Tony Barbour1fa09702017-03-16 12:09:08 -060017354 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017355
17356 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017357 VkImage srcImage;
17358 VkImage dstImage;
17359 VkDeviceMemory srcMem;
17360 VkDeviceMemory destMem;
17361 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017362
17363 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017364 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17365 image_create_info.pNext = NULL;
17366 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17367 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17368 image_create_info.extent.width = 32;
17369 image_create_info.extent.height = 1;
17370 image_create_info.extent.depth = 1;
17371 image_create_info.mipLevels = 1;
17372 image_create_info.arrayLayers = 1;
17373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17375 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17376 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017377
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017378 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017379 ASSERT_VK_SUCCESS(err);
17380
Karl Schultz6addd812016-02-02 17:17:23 -070017381 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017382
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017383 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017384 ASSERT_VK_SUCCESS(err);
17385
17386 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017387 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017388 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17389 memAlloc.pNext = NULL;
17390 memAlloc.allocationSize = 0;
17391 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017392
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017393 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017394 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017395 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017396 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017397 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017398 ASSERT_VK_SUCCESS(err);
17399
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017400 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017401 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017402 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017403 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017404 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017405 ASSERT_VK_SUCCESS(err);
17406
17407 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17408 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017409 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017410 ASSERT_VK_SUCCESS(err);
17411
Tony Barbour552f6c02016-12-21 14:34:07 -070017412 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017413 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017414 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17415 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017416 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017417 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017418 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017419 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017420 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017421 resolveRegion.srcOffset.x = 0;
17422 resolveRegion.srcOffset.y = 0;
17423 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017424 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017425 resolveRegion.dstSubresource.mipLevel = 0;
17426 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017427 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017428 resolveRegion.dstOffset.x = 0;
17429 resolveRegion.dstOffset.y = 0;
17430 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017431 resolveRegion.extent.width = 1;
17432 resolveRegion.extent.height = 1;
17433 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017434 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017435 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017436
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017437 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017438
Chia-I Wuf7458c52015-10-26 21:10:41 +080017439 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017440 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017441 vkFreeMemory(m_device->device(), srcMem, NULL);
17442 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017443}
17444
Karl Schultz6addd812016-02-02 17:17:23 -070017445TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17446 VkResult err;
17447 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017448
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17450 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017451
Tony Barbour1fa09702017-03-16 12:09:08 -060017452 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017453
Chris Forbesa7530692016-05-08 12:35:39 +120017454 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017455 VkImage srcImage;
17456 VkImage dstImage;
17457 VkDeviceMemory srcMem;
17458 VkDeviceMemory destMem;
17459 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017460
17461 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017462 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17463 image_create_info.pNext = NULL;
17464 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17465 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17466 image_create_info.extent.width = 32;
17467 image_create_info.extent.height = 1;
17468 image_create_info.extent.depth = 1;
17469 image_create_info.mipLevels = 1;
17470 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017471 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017472 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17473 // Note: Some implementations expect color attachment usage for any
17474 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017475 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017476 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017477
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017478 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017479 ASSERT_VK_SUCCESS(err);
17480
Karl Schultz6addd812016-02-02 17:17:23 -070017481 // Note: Some implementations expect color attachment usage for any
17482 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017483 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017484
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017485 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017486 ASSERT_VK_SUCCESS(err);
17487
17488 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017489 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017490 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17491 memAlloc.pNext = NULL;
17492 memAlloc.allocationSize = 0;
17493 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017494
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017495 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017496 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017497 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017498 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017499 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017500 ASSERT_VK_SUCCESS(err);
17501
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017502 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017503 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017504 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017505 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017506 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017507 ASSERT_VK_SUCCESS(err);
17508
17509 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17510 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017511 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017512 ASSERT_VK_SUCCESS(err);
17513
Tony Barbour552f6c02016-12-21 14:34:07 -070017514 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017515 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017516 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17517 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017518 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017519 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017520 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017521 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017522 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017523 resolveRegion.srcOffset.x = 0;
17524 resolveRegion.srcOffset.y = 0;
17525 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017526 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017527 resolveRegion.dstSubresource.mipLevel = 0;
17528 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017529 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017530 resolveRegion.dstOffset.x = 0;
17531 resolveRegion.dstOffset.y = 0;
17532 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017533 resolveRegion.extent.width = 1;
17534 resolveRegion.extent.height = 1;
17535 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017536 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017537 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017538
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017539 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017540
Chia-I Wuf7458c52015-10-26 21:10:41 +080017541 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017542 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017543 vkFreeMemory(m_device->device(), srcMem, NULL);
17544 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017545}
17546
Karl Schultz6addd812016-02-02 17:17:23 -070017547TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17548 VkResult err;
17549 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017550
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017552 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017553
Tony Barbour1fa09702017-03-16 12:09:08 -060017554 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017555
17556 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017557 VkImage srcImage;
17558 VkImage dstImage;
17559 VkDeviceMemory srcMem;
17560 VkDeviceMemory destMem;
17561 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017562
17563 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017564 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17565 image_create_info.pNext = NULL;
17566 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17567 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17568 image_create_info.extent.width = 32;
17569 image_create_info.extent.height = 1;
17570 image_create_info.extent.depth = 1;
17571 image_create_info.mipLevels = 1;
17572 image_create_info.arrayLayers = 1;
17573 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17574 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17575 // Note: Some implementations expect color attachment usage for any
17576 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017577 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017578 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017579
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017580 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017581 ASSERT_VK_SUCCESS(err);
17582
Karl Schultz6addd812016-02-02 17:17:23 -070017583 // Set format to something other than source image
17584 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17585 // Note: Some implementations expect color attachment usage for any
17586 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017587 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017588 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017589
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017590 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017591 ASSERT_VK_SUCCESS(err);
17592
17593 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017594 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017595 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17596 memAlloc.pNext = NULL;
17597 memAlloc.allocationSize = 0;
17598 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017599
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017600 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017601 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017602 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017603 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017604 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017605 ASSERT_VK_SUCCESS(err);
17606
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017607 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017608 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017609 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017610 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017611 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017612 ASSERT_VK_SUCCESS(err);
17613
17614 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17615 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017616 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017617 ASSERT_VK_SUCCESS(err);
17618
Tony Barbour552f6c02016-12-21 14:34:07 -070017619 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017620 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017621 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17622 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017623 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017624 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017625 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017626 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017627 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017628 resolveRegion.srcOffset.x = 0;
17629 resolveRegion.srcOffset.y = 0;
17630 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017631 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017632 resolveRegion.dstSubresource.mipLevel = 0;
17633 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017634 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017635 resolveRegion.dstOffset.x = 0;
17636 resolveRegion.dstOffset.y = 0;
17637 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017638 resolveRegion.extent.width = 1;
17639 resolveRegion.extent.height = 1;
17640 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017641 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017642 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017643
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017644 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017645
Chia-I Wuf7458c52015-10-26 21:10:41 +080017646 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017647 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017648 vkFreeMemory(m_device->device(), srcMem, NULL);
17649 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017650}
17651
Karl Schultz6addd812016-02-02 17:17:23 -070017652TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17653 VkResult err;
17654 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017655
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017657 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017658
Tony Barbour1fa09702017-03-16 12:09:08 -060017659 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017660
17661 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017662 VkImage srcImage;
17663 VkImage dstImage;
17664 VkDeviceMemory srcMem;
17665 VkDeviceMemory destMem;
17666 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017667
17668 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017669 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17670 image_create_info.pNext = NULL;
17671 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17672 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17673 image_create_info.extent.width = 32;
17674 image_create_info.extent.height = 1;
17675 image_create_info.extent.depth = 1;
17676 image_create_info.mipLevels = 1;
17677 image_create_info.arrayLayers = 1;
17678 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17679 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17680 // Note: Some implementations expect color attachment usage for any
17681 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017682 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017683 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017684
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017685 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017686 ASSERT_VK_SUCCESS(err);
17687
Karl Schultz6addd812016-02-02 17:17:23 -070017688 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17689 // Note: Some implementations expect color attachment usage for any
17690 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017691 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017692 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017693
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017694 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017695 ASSERT_VK_SUCCESS(err);
17696
17697 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017698 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017699 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17700 memAlloc.pNext = NULL;
17701 memAlloc.allocationSize = 0;
17702 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017703
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017704 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017705 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017706 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017707 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017708 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017709 ASSERT_VK_SUCCESS(err);
17710
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017711 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017712 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017713 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017714 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017715 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017716 ASSERT_VK_SUCCESS(err);
17717
17718 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17719 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017720 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017721 ASSERT_VK_SUCCESS(err);
17722
Tony Barbour552f6c02016-12-21 14:34:07 -070017723 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017724 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017725 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17726 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017727 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017728 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017729 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017730 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017731 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017732 resolveRegion.srcOffset.x = 0;
17733 resolveRegion.srcOffset.y = 0;
17734 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017735 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017736 resolveRegion.dstSubresource.mipLevel = 0;
17737 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017738 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017739 resolveRegion.dstOffset.x = 0;
17740 resolveRegion.dstOffset.y = 0;
17741 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017742 resolveRegion.extent.width = 1;
17743 resolveRegion.extent.height = 1;
17744 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017745 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017746 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017747
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017748 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017749
Chia-I Wuf7458c52015-10-26 21:10:41 +080017750 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017751 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017752 vkFreeMemory(m_device->device(), srcMem, NULL);
17753 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017754}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017755
Karl Schultz6addd812016-02-02 17:17:23 -070017756TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017757 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017758 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17759 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017760 // The image format check comes 2nd in validation so we trigger it first,
17761 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017762 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017763
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17765 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017766
Tony Barbour1fa09702017-03-16 12:09:08 -060017767 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017768 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017769 if (!depth_format) {
17770 return;
17771 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017772
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017773 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017774 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17775 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017776
17777 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017778 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17779 ds_pool_ci.pNext = NULL;
17780 ds_pool_ci.maxSets = 1;
17781 ds_pool_ci.poolSizeCount = 1;
17782 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017783
17784 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017785 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017786 ASSERT_VK_SUCCESS(err);
17787
17788 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017789 dsl_binding.binding = 0;
17790 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17791 dsl_binding.descriptorCount = 1;
17792 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17793 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017794
17795 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017796 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17797 ds_layout_ci.pNext = NULL;
17798 ds_layout_ci.bindingCount = 1;
17799 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017800 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017802 ASSERT_VK_SUCCESS(err);
17803
17804 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017805 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017806 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017807 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017808 alloc_info.descriptorPool = ds_pool;
17809 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017810 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017811 ASSERT_VK_SUCCESS(err);
17812
Karl Schultz6addd812016-02-02 17:17:23 -070017813 VkImage image_bad;
17814 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017815 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017816 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017817 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017818 const int32_t tex_width = 32;
17819 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017820
17821 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017822 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17823 image_create_info.pNext = NULL;
17824 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17825 image_create_info.format = tex_format_bad;
17826 image_create_info.extent.width = tex_width;
17827 image_create_info.extent.height = tex_height;
17828 image_create_info.extent.depth = 1;
17829 image_create_info.mipLevels = 1;
17830 image_create_info.arrayLayers = 1;
17831 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17832 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017833 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017834 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017835
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017836 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017837 ASSERT_VK_SUCCESS(err);
17838 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017839 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17840 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017841 ASSERT_VK_SUCCESS(err);
17842
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017843 // ---Bind image memory---
17844 VkMemoryRequirements img_mem_reqs;
17845 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17846 VkMemoryAllocateInfo image_alloc_info = {};
17847 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17848 image_alloc_info.pNext = NULL;
17849 image_alloc_info.memoryTypeIndex = 0;
17850 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017851 bool pass =
17852 m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &image_alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017853 ASSERT_TRUE(pass);
17854 VkDeviceMemory mem;
17855 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17856 ASSERT_VK_SUCCESS(err);
17857 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17858 ASSERT_VK_SUCCESS(err);
17859 // -----------------------
17860
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017861 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017862 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017863 image_view_create_info.image = image_bad;
17864 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17865 image_view_create_info.format = tex_format_bad;
17866 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17867 image_view_create_info.subresourceRange.baseMipLevel = 0;
17868 image_view_create_info.subresourceRange.layerCount = 1;
17869 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017870 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017871
17872 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017874
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017875 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017876
Chia-I Wuf7458c52015-10-26 21:10:41 +080017877 vkDestroyImage(m_device->device(), image_bad, NULL);
17878 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017879 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17880 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017881
17882 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017883}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017884
17885TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017886 TEST_DESCRIPTION(
17887 "Call ClearColorImage w/ a depth|stencil image and "
17888 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017889
Tony Barbour1fa09702017-03-16 12:09:08 -060017890 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017891 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017892 if (!depth_format) {
17893 return;
17894 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017895 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17896
Tony Barbour552f6c02016-12-21 14:34:07 -070017897 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017898
17899 // Color image
17900 VkClearColorValue clear_color;
17901 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17902 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17903 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17904 const int32_t img_width = 32;
17905 const int32_t img_height = 32;
17906 VkImageCreateInfo image_create_info = {};
17907 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17908 image_create_info.pNext = NULL;
17909 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17910 image_create_info.format = color_format;
17911 image_create_info.extent.width = img_width;
17912 image_create_info.extent.height = img_height;
17913 image_create_info.extent.depth = 1;
17914 image_create_info.mipLevels = 1;
17915 image_create_info.arrayLayers = 1;
17916 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17917 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17918 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17919
17920 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017921 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017923 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017924
17925 // Depth/Stencil image
17926 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017927 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017928 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17929 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017930 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017931 ds_image_create_info.extent.width = 64;
17932 ds_image_create_info.extent.height = 64;
17933 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017934 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017935
17936 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017937 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017938
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017939 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017940
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017942
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017943 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017944 &color_range);
17945
17946 m_errorMonitor->VerifyFound();
17947
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17949 "vkCmdClearColorImage called with "
17950 "image created without "
17951 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017952
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017953 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017954 &color_range);
17955
17956 m_errorMonitor->VerifyFound();
17957
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017958 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17960 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017961
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017962 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17963 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017964
17965 m_errorMonitor->VerifyFound();
17966}
Tobin Ehliscde08892015-09-22 10:11:37 -060017967
Mike Schuchardt35fece12017-03-07 14:40:28 -070017968TEST_F(VkLayerTest, CommandQueueFlags) {
17969 TEST_DESCRIPTION(
17970 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
17971 "graphics-only command");
17972
17973 ASSERT_NO_FATAL_FAILURE(Init());
17974
17975 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017976 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070017977 printf(" Non-graphics queue family not found; skipped.\n");
17978 return;
17979 } else {
17980 // Create command pool on a non-graphics queue
17981 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
17982
17983 // Setup command buffer on pool
17984 VkCommandBufferObj command_buffer(m_device, &command_pool);
17985 command_buffer.BeginCommandBuffer();
17986
17987 // Issue a graphics only command
17988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
17989 VkViewport viewport = {0, 0, 16, 16, 0, 1};
17990 command_buffer.SetViewport(0, 1, &viewport);
17991 m_errorMonitor->VerifyFound();
17992 }
17993}
17994
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017995// WSI Enabled Tests
17996//
Chris Forbes09368e42016-10-13 11:59:22 +130017997#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017998TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17999
18000#if defined(VK_USE_PLATFORM_XCB_KHR)
18001 VkSurfaceKHR surface = VK_NULL_HANDLE;
18002
18003 VkResult err;
18004 bool pass;
18005 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18006 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18007 // uint32_t swapchain_image_count = 0;
18008 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18009 // uint32_t image_index = 0;
18010 // VkPresentInfoKHR present_info = {};
18011
Tony Barbour1fa09702017-03-16 12:09:08 -060018012 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018013
18014 // Use the create function from one of the VK_KHR_*_surface extension in
18015 // order to create a surface, testing all known errors in the process,
18016 // before successfully creating a surface:
18017 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18019 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18020 pass = (err != VK_SUCCESS);
18021 ASSERT_TRUE(pass);
18022 m_errorMonitor->VerifyFound();
18023
18024 // Next, try to create a surface with the wrong
18025 // VkXcbSurfaceCreateInfoKHR::sType:
18026 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18027 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18029 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18030 pass = (err != VK_SUCCESS);
18031 ASSERT_TRUE(pass);
18032 m_errorMonitor->VerifyFound();
18033
18034 // Create a native window, and then correctly create a surface:
18035 xcb_connection_t *connection;
18036 xcb_screen_t *screen;
18037 xcb_window_t xcb_window;
18038 xcb_intern_atom_reply_t *atom_wm_delete_window;
18039
18040 const xcb_setup_t *setup;
18041 xcb_screen_iterator_t iter;
18042 int scr;
18043 uint32_t value_mask, value_list[32];
18044 int width = 1;
18045 int height = 1;
18046
18047 connection = xcb_connect(NULL, &scr);
18048 ASSERT_TRUE(connection != NULL);
18049 setup = xcb_get_setup(connection);
18050 iter = xcb_setup_roots_iterator(setup);
18051 while (scr-- > 0)
18052 xcb_screen_next(&iter);
18053 screen = iter.data;
18054
18055 xcb_window = xcb_generate_id(connection);
18056
18057 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18058 value_list[0] = screen->black_pixel;
18059 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18060
18061 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18062 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18063
18064 /* Magic code that will send notification when window is destroyed */
18065 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18066 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18067
18068 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18069 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18070 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18071 free(reply);
18072
18073 xcb_map_window(connection, xcb_window);
18074
18075 // Force the x/y coordinates to 100,100 results are identical in consecutive
18076 // runs
18077 const uint32_t coords[] = { 100, 100 };
18078 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18079
18080 // Finally, try to correctly create a surface:
18081 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18082 xcb_create_info.pNext = NULL;
18083 xcb_create_info.flags = 0;
18084 xcb_create_info.connection = connection;
18085 xcb_create_info.window = xcb_window;
18086 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18087 pass = (err == VK_SUCCESS);
18088 ASSERT_TRUE(pass);
18089
18090 // Check if surface supports presentation:
18091
18092 // 1st, do so without having queried the queue families:
18093 VkBool32 supported = false;
18094 // TODO: Get the following error to come out:
18095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18096 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18097 "function");
18098 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18099 pass = (err != VK_SUCCESS);
18100 // ASSERT_TRUE(pass);
18101 // m_errorMonitor->VerifyFound();
18102
18103 // Next, query a queue family index that's too large:
18104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18105 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18106 pass = (err != VK_SUCCESS);
18107 ASSERT_TRUE(pass);
18108 m_errorMonitor->VerifyFound();
18109
18110 // Finally, do so correctly:
18111 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18112 // SUPPORTED
18113 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18114 pass = (err == VK_SUCCESS);
18115 ASSERT_TRUE(pass);
18116
18117 // Before proceeding, try to create a swapchain without having called
18118 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18119 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18120 swapchain_create_info.pNext = NULL;
18121 swapchain_create_info.flags = 0;
18122 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18123 swapchain_create_info.surface = surface;
18124 swapchain_create_info.imageArrayLayers = 1;
18125 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18126 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18128 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18129 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18130 pass = (err != VK_SUCCESS);
18131 ASSERT_TRUE(pass);
18132 m_errorMonitor->VerifyFound();
18133
18134 // Get the surface capabilities:
18135 VkSurfaceCapabilitiesKHR surface_capabilities;
18136
18137 // Do so correctly (only error logged by this entrypoint is if the
18138 // extension isn't enabled):
18139 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18140 pass = (err == VK_SUCCESS);
18141 ASSERT_TRUE(pass);
18142
18143 // Get the surface formats:
18144 uint32_t surface_format_count;
18145
18146 // First, try without a pointer to surface_format_count:
18147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18148 "specified as NULL");
18149 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18150 pass = (err == VK_SUCCESS);
18151 ASSERT_TRUE(pass);
18152 m_errorMonitor->VerifyFound();
18153
18154 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18155 // correctly done a 1st try (to get the count):
18156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18157 surface_format_count = 0;
18158 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18159 pass = (err == VK_SUCCESS);
18160 ASSERT_TRUE(pass);
18161 m_errorMonitor->VerifyFound();
18162
18163 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18164 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18165 pass = (err == VK_SUCCESS);
18166 ASSERT_TRUE(pass);
18167
18168 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18169 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18170
18171 // Next, do a 2nd try with surface_format_count being set too high:
18172 surface_format_count += 5;
18173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18174 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18175 pass = (err == VK_SUCCESS);
18176 ASSERT_TRUE(pass);
18177 m_errorMonitor->VerifyFound();
18178
18179 // Finally, do a correct 1st and 2nd try:
18180 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18181 pass = (err == VK_SUCCESS);
18182 ASSERT_TRUE(pass);
18183 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18184 pass = (err == VK_SUCCESS);
18185 ASSERT_TRUE(pass);
18186
18187 // Get the surface present modes:
18188 uint32_t surface_present_mode_count;
18189
18190 // First, try without a pointer to surface_format_count:
18191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18192 "specified as NULL");
18193
18194 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18195 pass = (err == VK_SUCCESS);
18196 ASSERT_TRUE(pass);
18197 m_errorMonitor->VerifyFound();
18198
18199 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18200 // correctly done a 1st try (to get the count):
18201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18202 surface_present_mode_count = 0;
18203 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18204 (VkPresentModeKHR *)&surface_present_mode_count);
18205 pass = (err == VK_SUCCESS);
18206 ASSERT_TRUE(pass);
18207 m_errorMonitor->VerifyFound();
18208
18209 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18210 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18211 pass = (err == VK_SUCCESS);
18212 ASSERT_TRUE(pass);
18213
18214 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18215 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18216
18217 // Next, do a 2nd try with surface_format_count being set too high:
18218 surface_present_mode_count += 5;
18219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18220 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18221 pass = (err == VK_SUCCESS);
18222 ASSERT_TRUE(pass);
18223 m_errorMonitor->VerifyFound();
18224
18225 // Finally, do a correct 1st and 2nd try:
18226 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18227 pass = (err == VK_SUCCESS);
18228 ASSERT_TRUE(pass);
18229 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18230 pass = (err == VK_SUCCESS);
18231 ASSERT_TRUE(pass);
18232
18233 // Create a swapchain:
18234
18235 // First, try without a pointer to swapchain_create_info:
18236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18237 "specified as NULL");
18238
18239 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18240 pass = (err != VK_SUCCESS);
18241 ASSERT_TRUE(pass);
18242 m_errorMonitor->VerifyFound();
18243
18244 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18245 // sType:
18246 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18248
18249 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18250 pass = (err != VK_SUCCESS);
18251 ASSERT_TRUE(pass);
18252 m_errorMonitor->VerifyFound();
18253
18254 // Next, call with a NULL swapchain pointer:
18255 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18256 swapchain_create_info.pNext = NULL;
18257 swapchain_create_info.flags = 0;
18258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18259 "specified as NULL");
18260
18261 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18262 pass = (err != VK_SUCCESS);
18263 ASSERT_TRUE(pass);
18264 m_errorMonitor->VerifyFound();
18265
18266 // TODO: Enhance swapchain layer so that
18267 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18268
18269 // Next, call with a queue family index that's too large:
18270 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18271 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18272 swapchain_create_info.queueFamilyIndexCount = 2;
18273 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18275 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18276 pass = (err != VK_SUCCESS);
18277 ASSERT_TRUE(pass);
18278 m_errorMonitor->VerifyFound();
18279
18280 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18281 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18282 swapchain_create_info.queueFamilyIndexCount = 1;
18283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18284 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18285 "pCreateInfo->pQueueFamilyIndices).");
18286 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18287 pass = (err != VK_SUCCESS);
18288 ASSERT_TRUE(pass);
18289 m_errorMonitor->VerifyFound();
18290
18291 // Next, call with an invalid imageSharingMode:
18292 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18293 swapchain_create_info.queueFamilyIndexCount = 1;
18294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18295 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18296 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18297 pass = (err != VK_SUCCESS);
18298 ASSERT_TRUE(pass);
18299 m_errorMonitor->VerifyFound();
18300 // Fix for the future:
18301 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18302 // SUPPORTED
18303 swapchain_create_info.queueFamilyIndexCount = 0;
18304 queueFamilyIndex[0] = 0;
18305 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18306
18307 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18308 // Get the images from a swapchain:
18309 // Acquire an image from a swapchain:
18310 // Present an image to a swapchain:
18311 // Destroy the swapchain:
18312
18313 // TODOs:
18314 //
18315 // - Try destroying the device without first destroying the swapchain
18316 //
18317 // - Try destroying the device without first destroying the surface
18318 //
18319 // - Try destroying the surface without first destroying the swapchain
18320
18321 // Destroy the surface:
18322 vkDestroySurfaceKHR(instance(), surface, NULL);
18323
18324 // Tear down the window:
18325 xcb_destroy_window(connection, xcb_window);
18326 xcb_disconnect(connection);
18327
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018328#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018329 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018330#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018331}
Chris Forbes09368e42016-10-13 11:59:22 +130018332#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018333
18334//
18335// POSITIVE VALIDATION TESTS
18336//
18337// These tests do not expect to encounter ANY validation errors pass only if this is true
18338
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018339TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18340 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018341 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018342 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18343
18344 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18345 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018346 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018347 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18348 command_buffer_allocate_info.commandBufferCount = 1;
18349
18350 VkCommandBuffer secondary_command_buffer;
18351 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18352 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18353 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18354 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18355 command_buffer_inheritance_info.renderPass = m_renderPass;
18356 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18357
18358 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18359 command_buffer_begin_info.flags =
18360 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18361 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18362
18363 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18364 VkClearAttachment color_attachment;
18365 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18366 color_attachment.clearValue.color.float32[0] = 0;
18367 color_attachment.clearValue.color.float32[1] = 0;
18368 color_attachment.clearValue.color.float32[2] = 0;
18369 color_attachment.clearValue.color.float32[3] = 0;
18370 color_attachment.colorAttachment = 0;
18371 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18372 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18373}
18374
Tobin Ehlise0006882016-11-03 10:14:28 -060018375TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018376 TEST_DESCRIPTION(
18377 "Perform an image layout transition in a secondary command buffer followed "
18378 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018379 VkResult err;
18380 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018381 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018382 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018383 if (!depth_format) {
18384 return;
18385 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18387 // Allocate a secondary and primary cmd buffer
18388 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18389 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018390 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018391 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18392 command_buffer_allocate_info.commandBufferCount = 1;
18393
18394 VkCommandBuffer secondary_command_buffer;
18395 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18396 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18397 VkCommandBuffer primary_command_buffer;
18398 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18399 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18400 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18401 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18402 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18403 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18404 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18405
18406 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18407 ASSERT_VK_SUCCESS(err);
18408 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018409 image.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlise0006882016-11-03 10:14:28 -060018410 ASSERT_TRUE(image.initialized());
18411 VkImageMemoryBarrier img_barrier = {};
18412 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18413 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18414 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18415 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18416 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18417 img_barrier.image = image.handle();
18418 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18419 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18420 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18421 img_barrier.subresourceRange.baseArrayLayer = 0;
18422 img_barrier.subresourceRange.baseMipLevel = 0;
18423 img_barrier.subresourceRange.layerCount = 1;
18424 img_barrier.subresourceRange.levelCount = 1;
18425 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18426 0, nullptr, 1, &img_barrier);
18427 err = vkEndCommandBuffer(secondary_command_buffer);
18428 ASSERT_VK_SUCCESS(err);
18429
18430 // Now update primary cmd buffer to execute secondary and transitions image
18431 command_buffer_begin_info.pInheritanceInfo = nullptr;
18432 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18433 ASSERT_VK_SUCCESS(err);
18434 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18435 VkImageMemoryBarrier img_barrier2 = {};
18436 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18437 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18438 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18439 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18440 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18441 img_barrier2.image = image.handle();
18442 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18443 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18444 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18445 img_barrier2.subresourceRange.baseArrayLayer = 0;
18446 img_barrier2.subresourceRange.baseMipLevel = 0;
18447 img_barrier2.subresourceRange.layerCount = 1;
18448 img_barrier2.subresourceRange.levelCount = 1;
18449 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18450 nullptr, 1, &img_barrier2);
18451 err = vkEndCommandBuffer(primary_command_buffer);
18452 ASSERT_VK_SUCCESS(err);
18453 VkSubmitInfo submit_info = {};
18454 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18455 submit_info.commandBufferCount = 1;
18456 submit_info.pCommandBuffers = &primary_command_buffer;
18457 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18458 ASSERT_VK_SUCCESS(err);
18459 m_errorMonitor->VerifyNotFound();
18460 err = vkDeviceWaitIdle(m_device->device());
18461 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018462 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18463 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018464}
18465
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018466// This is a positive test. No failures are expected.
18467TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018468 TEST_DESCRIPTION(
18469 "Ensure that the vkUpdateDescriptorSets validation code "
18470 "is ignoring VkWriteDescriptorSet members that are not "
18471 "related to the descriptor type specified by "
18472 "VkWriteDescriptorSet::descriptorType. Correct "
18473 "validation behavior will result in the test running to "
18474 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018475
18476 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18477
Tony Barbour1fa09702017-03-16 12:09:08 -060018478 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018479
18480 // Image Case
18481 {
18482 m_errorMonitor->ExpectSuccess();
18483
18484 VkImage image;
18485 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18486 const int32_t tex_width = 32;
18487 const int32_t tex_height = 32;
18488 VkImageCreateInfo image_create_info = {};
18489 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18490 image_create_info.pNext = NULL;
18491 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18492 image_create_info.format = tex_format;
18493 image_create_info.extent.width = tex_width;
18494 image_create_info.extent.height = tex_height;
18495 image_create_info.extent.depth = 1;
18496 image_create_info.mipLevels = 1;
18497 image_create_info.arrayLayers = 1;
18498 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18499 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18500 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18501 image_create_info.flags = 0;
18502 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18503 ASSERT_VK_SUCCESS(err);
18504
18505 VkMemoryRequirements memory_reqs;
18506 VkDeviceMemory image_memory;
18507 bool pass;
18508 VkMemoryAllocateInfo memory_info = {};
18509 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18510 memory_info.pNext = NULL;
18511 memory_info.allocationSize = 0;
18512 memory_info.memoryTypeIndex = 0;
18513 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18514 memory_info.allocationSize = memory_reqs.size;
18515 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18516 ASSERT_TRUE(pass);
18517 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18518 ASSERT_VK_SUCCESS(err);
18519 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18520 ASSERT_VK_SUCCESS(err);
18521
18522 VkImageViewCreateInfo image_view_create_info = {};
18523 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18524 image_view_create_info.image = image;
18525 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18526 image_view_create_info.format = tex_format;
18527 image_view_create_info.subresourceRange.layerCount = 1;
18528 image_view_create_info.subresourceRange.baseMipLevel = 0;
18529 image_view_create_info.subresourceRange.levelCount = 1;
18530 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18531
18532 VkImageView view;
18533 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18534 ASSERT_VK_SUCCESS(err);
18535
18536 VkDescriptorPoolSize ds_type_count = {};
18537 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18538 ds_type_count.descriptorCount = 1;
18539
18540 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18541 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18542 ds_pool_ci.pNext = NULL;
18543 ds_pool_ci.maxSets = 1;
18544 ds_pool_ci.poolSizeCount = 1;
18545 ds_pool_ci.pPoolSizes = &ds_type_count;
18546
18547 VkDescriptorPool ds_pool;
18548 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18549 ASSERT_VK_SUCCESS(err);
18550
18551 VkDescriptorSetLayoutBinding dsl_binding = {};
18552 dsl_binding.binding = 0;
18553 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18554 dsl_binding.descriptorCount = 1;
18555 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18556 dsl_binding.pImmutableSamplers = NULL;
18557
18558 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18559 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18560 ds_layout_ci.pNext = NULL;
18561 ds_layout_ci.bindingCount = 1;
18562 ds_layout_ci.pBindings = &dsl_binding;
18563 VkDescriptorSetLayout ds_layout;
18564 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18565 ASSERT_VK_SUCCESS(err);
18566
18567 VkDescriptorSet descriptor_set;
18568 VkDescriptorSetAllocateInfo alloc_info = {};
18569 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18570 alloc_info.descriptorSetCount = 1;
18571 alloc_info.descriptorPool = ds_pool;
18572 alloc_info.pSetLayouts = &ds_layout;
18573 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18574 ASSERT_VK_SUCCESS(err);
18575
18576 VkDescriptorImageInfo image_info = {};
18577 image_info.imageView = view;
18578 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18579
18580 VkWriteDescriptorSet descriptor_write;
18581 memset(&descriptor_write, 0, sizeof(descriptor_write));
18582 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18583 descriptor_write.dstSet = descriptor_set;
18584 descriptor_write.dstBinding = 0;
18585 descriptor_write.descriptorCount = 1;
18586 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18587 descriptor_write.pImageInfo = &image_info;
18588
18589 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18590 // be
18591 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18592 // This will most likely produce a crash if the parameter_validation
18593 // layer
18594 // does not correctly ignore pBufferInfo.
18595 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18596 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18597
18598 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18599
18600 m_errorMonitor->VerifyNotFound();
18601
18602 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18603 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18604 vkDestroyImageView(m_device->device(), view, NULL);
18605 vkDestroyImage(m_device->device(), image, NULL);
18606 vkFreeMemory(m_device->device(), image_memory, NULL);
18607 }
18608
18609 // Buffer Case
18610 {
18611 m_errorMonitor->ExpectSuccess();
18612
18613 VkBuffer buffer;
18614 uint32_t queue_family_index = 0;
18615 VkBufferCreateInfo buffer_create_info = {};
18616 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18617 buffer_create_info.size = 1024;
18618 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18619 buffer_create_info.queueFamilyIndexCount = 1;
18620 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18621
18622 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18623 ASSERT_VK_SUCCESS(err);
18624
18625 VkMemoryRequirements memory_reqs;
18626 VkDeviceMemory buffer_memory;
18627 bool pass;
18628 VkMemoryAllocateInfo memory_info = {};
18629 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18630 memory_info.pNext = NULL;
18631 memory_info.allocationSize = 0;
18632 memory_info.memoryTypeIndex = 0;
18633
18634 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18635 memory_info.allocationSize = memory_reqs.size;
18636 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18637 ASSERT_TRUE(pass);
18638
18639 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18640 ASSERT_VK_SUCCESS(err);
18641 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18642 ASSERT_VK_SUCCESS(err);
18643
18644 VkDescriptorPoolSize ds_type_count = {};
18645 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18646 ds_type_count.descriptorCount = 1;
18647
18648 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18649 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18650 ds_pool_ci.pNext = NULL;
18651 ds_pool_ci.maxSets = 1;
18652 ds_pool_ci.poolSizeCount = 1;
18653 ds_pool_ci.pPoolSizes = &ds_type_count;
18654
18655 VkDescriptorPool ds_pool;
18656 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18657 ASSERT_VK_SUCCESS(err);
18658
18659 VkDescriptorSetLayoutBinding dsl_binding = {};
18660 dsl_binding.binding = 0;
18661 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18662 dsl_binding.descriptorCount = 1;
18663 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18664 dsl_binding.pImmutableSamplers = NULL;
18665
18666 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18667 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18668 ds_layout_ci.pNext = NULL;
18669 ds_layout_ci.bindingCount = 1;
18670 ds_layout_ci.pBindings = &dsl_binding;
18671 VkDescriptorSetLayout ds_layout;
18672 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18673 ASSERT_VK_SUCCESS(err);
18674
18675 VkDescriptorSet descriptor_set;
18676 VkDescriptorSetAllocateInfo alloc_info = {};
18677 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18678 alloc_info.descriptorSetCount = 1;
18679 alloc_info.descriptorPool = ds_pool;
18680 alloc_info.pSetLayouts = &ds_layout;
18681 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18682 ASSERT_VK_SUCCESS(err);
18683
18684 VkDescriptorBufferInfo buffer_info = {};
18685 buffer_info.buffer = buffer;
18686 buffer_info.offset = 0;
18687 buffer_info.range = 1024;
18688
18689 VkWriteDescriptorSet descriptor_write;
18690 memset(&descriptor_write, 0, sizeof(descriptor_write));
18691 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18692 descriptor_write.dstSet = descriptor_set;
18693 descriptor_write.dstBinding = 0;
18694 descriptor_write.descriptorCount = 1;
18695 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18696 descriptor_write.pBufferInfo = &buffer_info;
18697
18698 // Set pImageInfo and pTexelBufferView to invalid values, which should
18699 // be
18700 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18701 // This will most likely produce a crash if the parameter_validation
18702 // layer
18703 // does not correctly ignore pImageInfo.
18704 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18705 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18706
18707 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18708
18709 m_errorMonitor->VerifyNotFound();
18710
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18713 vkDestroyBuffer(m_device->device(), buffer, NULL);
18714 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18715 }
18716
18717 // Texel Buffer Case
18718 {
18719 m_errorMonitor->ExpectSuccess();
18720
18721 VkBuffer buffer;
18722 uint32_t queue_family_index = 0;
18723 VkBufferCreateInfo buffer_create_info = {};
18724 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18725 buffer_create_info.size = 1024;
18726 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18727 buffer_create_info.queueFamilyIndexCount = 1;
18728 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18729
18730 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18731 ASSERT_VK_SUCCESS(err);
18732
18733 VkMemoryRequirements memory_reqs;
18734 VkDeviceMemory buffer_memory;
18735 bool pass;
18736 VkMemoryAllocateInfo memory_info = {};
18737 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18738 memory_info.pNext = NULL;
18739 memory_info.allocationSize = 0;
18740 memory_info.memoryTypeIndex = 0;
18741
18742 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18743 memory_info.allocationSize = memory_reqs.size;
18744 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18745 ASSERT_TRUE(pass);
18746
18747 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18748 ASSERT_VK_SUCCESS(err);
18749 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18750 ASSERT_VK_SUCCESS(err);
18751
18752 VkBufferViewCreateInfo buff_view_ci = {};
18753 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18754 buff_view_ci.buffer = buffer;
18755 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18756 buff_view_ci.range = VK_WHOLE_SIZE;
18757 VkBufferView buffer_view;
18758 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18759
18760 VkDescriptorPoolSize ds_type_count = {};
18761 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18762 ds_type_count.descriptorCount = 1;
18763
18764 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18765 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18766 ds_pool_ci.pNext = NULL;
18767 ds_pool_ci.maxSets = 1;
18768 ds_pool_ci.poolSizeCount = 1;
18769 ds_pool_ci.pPoolSizes = &ds_type_count;
18770
18771 VkDescriptorPool ds_pool;
18772 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18773 ASSERT_VK_SUCCESS(err);
18774
18775 VkDescriptorSetLayoutBinding dsl_binding = {};
18776 dsl_binding.binding = 0;
18777 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18778 dsl_binding.descriptorCount = 1;
18779 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18780 dsl_binding.pImmutableSamplers = NULL;
18781
18782 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18783 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18784 ds_layout_ci.pNext = NULL;
18785 ds_layout_ci.bindingCount = 1;
18786 ds_layout_ci.pBindings = &dsl_binding;
18787 VkDescriptorSetLayout ds_layout;
18788 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18789 ASSERT_VK_SUCCESS(err);
18790
18791 VkDescriptorSet descriptor_set;
18792 VkDescriptorSetAllocateInfo alloc_info = {};
18793 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18794 alloc_info.descriptorSetCount = 1;
18795 alloc_info.descriptorPool = ds_pool;
18796 alloc_info.pSetLayouts = &ds_layout;
18797 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18798 ASSERT_VK_SUCCESS(err);
18799
18800 VkWriteDescriptorSet descriptor_write;
18801 memset(&descriptor_write, 0, sizeof(descriptor_write));
18802 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18803 descriptor_write.dstSet = descriptor_set;
18804 descriptor_write.dstBinding = 0;
18805 descriptor_write.descriptorCount = 1;
18806 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18807 descriptor_write.pTexelBufferView = &buffer_view;
18808
18809 // Set pImageInfo and pBufferInfo to invalid values, which should be
18810 // ignored for descriptorType ==
18811 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18812 // This will most likely produce a crash if the parameter_validation
18813 // layer
18814 // does not correctly ignore pImageInfo and pBufferInfo.
18815 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18816 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18817
18818 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18819
18820 m_errorMonitor->VerifyNotFound();
18821
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018822 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18823 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18824 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18825 vkDestroyBuffer(m_device->device(), buffer, NULL);
18826 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18827 }
18828}
18829
Tobin Ehlisf7428442016-10-25 07:58:24 -060018830TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18831 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18832
Tony Barbour1fa09702017-03-16 12:09:08 -060018833 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018834 // Create layout where two binding #s are "1"
18835 static const uint32_t NUM_BINDINGS = 3;
18836 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18837 dsl_binding[0].binding = 1;
18838 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18839 dsl_binding[0].descriptorCount = 1;
18840 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18841 dsl_binding[0].pImmutableSamplers = NULL;
18842 dsl_binding[1].binding = 0;
18843 dsl_binding[1].descriptorCount = 1;
18844 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18845 dsl_binding[1].descriptorCount = 1;
18846 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18847 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018848 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018849 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18850 dsl_binding[2].descriptorCount = 1;
18851 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18852 dsl_binding[2].pImmutableSamplers = NULL;
18853
18854 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18855 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18856 ds_layout_ci.pNext = NULL;
18857 ds_layout_ci.bindingCount = NUM_BINDINGS;
18858 ds_layout_ci.pBindings = dsl_binding;
18859 VkDescriptorSetLayout ds_layout;
18860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18861 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18862 m_errorMonitor->VerifyFound();
18863}
18864
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018865TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018866 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18867
Tony Barbour1fa09702017-03-16 12:09:08 -060018868 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018869
Tony Barbour552f6c02016-12-21 14:34:07 -070018870 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018871
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018872 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18873
18874 {
18875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18876 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18877 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18878 m_errorMonitor->VerifyFound();
18879 }
18880
18881 {
18882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18883 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18884 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18885 m_errorMonitor->VerifyFound();
18886 }
18887
18888 {
18889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18890 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18891 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18892 m_errorMonitor->VerifyFound();
18893 }
18894
18895 {
18896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18897 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18898 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18899 m_errorMonitor->VerifyFound();
18900 }
18901
18902 {
18903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18904 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18905 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18906 m_errorMonitor->VerifyFound();
18907 }
18908
18909 {
18910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18911 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18912 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18913 m_errorMonitor->VerifyFound();
18914 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018915
18916 {
18917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18918 VkRect2D scissor = {{-1, 0}, {16, 16}};
18919 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18920 m_errorMonitor->VerifyFound();
18921 }
18922
18923 {
18924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18925 VkRect2D scissor = {{0, -2}, {16, 16}};
18926 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18927 m_errorMonitor->VerifyFound();
18928 }
18929
18930 {
18931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18932 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18933 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18934 m_errorMonitor->VerifyFound();
18935 }
18936
18937 {
18938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18939 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18940 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18941 m_errorMonitor->VerifyFound();
18942 }
18943
Tony Barbour552f6c02016-12-21 14:34:07 -070018944 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018945}
18946
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018947// This is a positive test. No failures are expected.
18948TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18949 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18950 VkResult err;
18951
Tony Barbour1fa09702017-03-16 12:09:08 -060018952 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018953 m_errorMonitor->ExpectSuccess();
18954 VkDescriptorPoolSize ds_type_count = {};
18955 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18956 ds_type_count.descriptorCount = 2;
18957
18958 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18959 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18960 ds_pool_ci.pNext = NULL;
18961 ds_pool_ci.maxSets = 1;
18962 ds_pool_ci.poolSizeCount = 1;
18963 ds_pool_ci.pPoolSizes = &ds_type_count;
18964
18965 VkDescriptorPool ds_pool;
18966 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18967 ASSERT_VK_SUCCESS(err);
18968
18969 // Create layout with two uniform buffer descriptors w/ empty binding between them
18970 static const uint32_t NUM_BINDINGS = 3;
18971 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18972 dsl_binding[0].binding = 0;
18973 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18974 dsl_binding[0].descriptorCount = 1;
18975 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18976 dsl_binding[0].pImmutableSamplers = NULL;
18977 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018978 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018979 dsl_binding[2].binding = 2;
18980 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18981 dsl_binding[2].descriptorCount = 1;
18982 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18983 dsl_binding[2].pImmutableSamplers = NULL;
18984
18985 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18986 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18987 ds_layout_ci.pNext = NULL;
18988 ds_layout_ci.bindingCount = NUM_BINDINGS;
18989 ds_layout_ci.pBindings = dsl_binding;
18990 VkDescriptorSetLayout ds_layout;
18991 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18992 ASSERT_VK_SUCCESS(err);
18993
18994 VkDescriptorSet descriptor_set = {};
18995 VkDescriptorSetAllocateInfo alloc_info = {};
18996 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18997 alloc_info.descriptorSetCount = 1;
18998 alloc_info.descriptorPool = ds_pool;
18999 alloc_info.pSetLayouts = &ds_layout;
19000 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19001 ASSERT_VK_SUCCESS(err);
19002
19003 // Create a buffer to be used for update
19004 VkBufferCreateInfo buff_ci = {};
19005 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19006 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19007 buff_ci.size = 256;
19008 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19009 VkBuffer buffer;
19010 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19011 ASSERT_VK_SUCCESS(err);
19012 // Have to bind memory to buffer before descriptor update
19013 VkMemoryAllocateInfo mem_alloc = {};
19014 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19015 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019016 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019017 mem_alloc.memoryTypeIndex = 0;
19018
19019 VkMemoryRequirements mem_reqs;
19020 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19021 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19022 if (!pass) {
19023 vkDestroyBuffer(m_device->device(), buffer, NULL);
19024 return;
19025 }
19026
19027 VkDeviceMemory mem;
19028 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19029 ASSERT_VK_SUCCESS(err);
19030 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19031 ASSERT_VK_SUCCESS(err);
19032
19033 // Only update the descriptor at binding 2
19034 VkDescriptorBufferInfo buff_info = {};
19035 buff_info.buffer = buffer;
19036 buff_info.offset = 0;
19037 buff_info.range = VK_WHOLE_SIZE;
19038 VkWriteDescriptorSet descriptor_write = {};
19039 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19040 descriptor_write.dstBinding = 2;
19041 descriptor_write.descriptorCount = 1;
19042 descriptor_write.pTexelBufferView = nullptr;
19043 descriptor_write.pBufferInfo = &buff_info;
19044 descriptor_write.pImageInfo = nullptr;
19045 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19046 descriptor_write.dstSet = descriptor_set;
19047
19048 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19049
19050 m_errorMonitor->VerifyNotFound();
19051 // Cleanup
19052 vkFreeMemory(m_device->device(), mem, NULL);
19053 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19054 vkDestroyBuffer(m_device->device(), buffer, NULL);
19055 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19056}
19057
19058// This is a positive test. No failures are expected.
19059TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19060 VkResult err;
19061 bool pass;
19062
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019063 TEST_DESCRIPTION(
19064 "Create a buffer, allocate memory, bind memory, destroy "
19065 "the buffer, create an image, and bind the same memory to "
19066 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019067
19068 m_errorMonitor->ExpectSuccess();
19069
Tony Barbour1fa09702017-03-16 12:09:08 -060019070 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019071
19072 VkBuffer buffer;
19073 VkImage image;
19074 VkDeviceMemory mem;
19075 VkMemoryRequirements mem_reqs;
19076
19077 VkBufferCreateInfo buf_info = {};
19078 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19079 buf_info.pNext = NULL;
19080 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19081 buf_info.size = 256;
19082 buf_info.queueFamilyIndexCount = 0;
19083 buf_info.pQueueFamilyIndices = NULL;
19084 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19085 buf_info.flags = 0;
19086 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19087 ASSERT_VK_SUCCESS(err);
19088
19089 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19090
19091 VkMemoryAllocateInfo alloc_info = {};
19092 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19093 alloc_info.pNext = NULL;
19094 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019095
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019096 // Ensure memory is big enough for both bindings
19097 alloc_info.allocationSize = 0x10000;
19098
19099 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19100 if (!pass) {
19101 vkDestroyBuffer(m_device->device(), buffer, NULL);
19102 return;
19103 }
19104
19105 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19106 ASSERT_VK_SUCCESS(err);
19107
19108 uint8_t *pData;
19109 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19110 ASSERT_VK_SUCCESS(err);
19111
19112 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19113
19114 vkUnmapMemory(m_device->device(), mem);
19115
19116 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19117 ASSERT_VK_SUCCESS(err);
19118
19119 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19120 // memory. In fact, it was never used by the GPU.
19121 // Just be be sure, wait for idle.
19122 vkDestroyBuffer(m_device->device(), buffer, NULL);
19123 vkDeviceWaitIdle(m_device->device());
19124
Tobin Ehlis6a005702016-12-28 15:25:56 -070019125 // Use optimal as some platforms report linear support but then fail image creation
19126 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19127 VkImageFormatProperties image_format_properties;
19128 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19129 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19130 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019131 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019132 vkFreeMemory(m_device->device(), mem, NULL);
19133 return;
19134 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019135 VkImageCreateInfo image_create_info = {};
19136 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19137 image_create_info.pNext = NULL;
19138 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19139 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19140 image_create_info.extent.width = 64;
19141 image_create_info.extent.height = 64;
19142 image_create_info.extent.depth = 1;
19143 image_create_info.mipLevels = 1;
19144 image_create_info.arrayLayers = 1;
19145 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019146 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019147 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19148 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19149 image_create_info.queueFamilyIndexCount = 0;
19150 image_create_info.pQueueFamilyIndices = NULL;
19151 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19152 image_create_info.flags = 0;
19153
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019154 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019155 * to be textures or it will be the staging image if they are not.
19156 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019157 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19158 ASSERT_VK_SUCCESS(err);
19159
19160 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19161
Tobin Ehlis6a005702016-12-28 15:25:56 -070019162 VkMemoryAllocateInfo mem_alloc = {};
19163 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19164 mem_alloc.pNext = NULL;
19165 mem_alloc.allocationSize = 0;
19166 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019167 mem_alloc.allocationSize = mem_reqs.size;
19168
19169 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19170 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019171 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019172 vkDestroyImage(m_device->device(), image, NULL);
19173 return;
19174 }
19175
19176 // VALIDATION FAILURE:
19177 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19178 ASSERT_VK_SUCCESS(err);
19179
19180 m_errorMonitor->VerifyNotFound();
19181
19182 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019183 vkDestroyImage(m_device->device(), image, NULL);
19184}
19185
Tony Barbourab713912017-02-02 14:17:35 -070019186// This is a positive test. No failures are expected.
19187TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19188 VkResult err;
19189
19190 TEST_DESCRIPTION(
19191 "Call all applicable destroy and free routines with NULL"
19192 "handles, expecting no validation errors");
19193
19194 m_errorMonitor->ExpectSuccess();
19195
Tony Barbour1fa09702017-03-16 12:09:08 -060019196 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019197 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19198 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19199 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19200 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19201 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19202 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19203 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19204 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19205 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19206 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19207 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19208 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19209 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19210 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19211 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19212 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19213 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19214 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19215 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19216 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19217
19218 VkCommandPool command_pool;
19219 VkCommandPoolCreateInfo pool_create_info{};
19220 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19221 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19222 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19223 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19224 VkCommandBuffer command_buffers[3] = {};
19225 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19226 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19227 command_buffer_allocate_info.commandPool = command_pool;
19228 command_buffer_allocate_info.commandBufferCount = 1;
19229 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19230 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19231 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19232 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19233
19234 VkDescriptorPoolSize ds_type_count = {};
19235 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19236 ds_type_count.descriptorCount = 1;
19237
19238 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19239 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19240 ds_pool_ci.pNext = NULL;
19241 ds_pool_ci.maxSets = 1;
19242 ds_pool_ci.poolSizeCount = 1;
19243 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19244 ds_pool_ci.pPoolSizes = &ds_type_count;
19245
19246 VkDescriptorPool ds_pool;
19247 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19248 ASSERT_VK_SUCCESS(err);
19249
19250 VkDescriptorSetLayoutBinding dsl_binding = {};
19251 dsl_binding.binding = 2;
19252 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19253 dsl_binding.descriptorCount = 1;
19254 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19255 dsl_binding.pImmutableSamplers = NULL;
19256 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19257 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19258 ds_layout_ci.pNext = NULL;
19259 ds_layout_ci.bindingCount = 1;
19260 ds_layout_ci.pBindings = &dsl_binding;
19261 VkDescriptorSetLayout ds_layout;
19262 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19263 ASSERT_VK_SUCCESS(err);
19264
19265 VkDescriptorSet descriptor_sets[3] = {};
19266 VkDescriptorSetAllocateInfo alloc_info = {};
19267 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19268 alloc_info.descriptorSetCount = 1;
19269 alloc_info.descriptorPool = ds_pool;
19270 alloc_info.pSetLayouts = &ds_layout;
19271 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19272 ASSERT_VK_SUCCESS(err);
19273 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19274 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19275 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19276
19277 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19278
19279 m_errorMonitor->VerifyNotFound();
19280}
19281
Tony Barbour626994c2017-02-08 15:29:37 -070019282TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019283 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019284
19285 m_errorMonitor->ExpectSuccess();
19286
Tony Barbour1fa09702017-03-16 12:09:08 -060019287 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019288 VkCommandBuffer cmd_bufs[4];
19289 VkCommandBufferAllocateInfo alloc_info;
19290 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19291 alloc_info.pNext = NULL;
19292 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019293 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019294 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19295 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19296 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019297 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19298 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19299 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019300 ASSERT_TRUE(image.initialized());
19301 VkCommandBufferBeginInfo cb_binfo;
19302 cb_binfo.pNext = NULL;
19303 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19304 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19305 cb_binfo.flags = 0;
19306 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19307 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19308 VkImageMemoryBarrier img_barrier = {};
19309 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19310 img_barrier.pNext = NULL;
19311 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19312 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19313 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19314 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19315 img_barrier.image = image.handle();
19316 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19317 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19318 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19319 img_barrier.subresourceRange.baseArrayLayer = 0;
19320 img_barrier.subresourceRange.baseMipLevel = 0;
19321 img_barrier.subresourceRange.layerCount = 1;
19322 img_barrier.subresourceRange.levelCount = 1;
19323 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19324 &img_barrier);
19325 vkEndCommandBuffer(cmd_bufs[0]);
19326 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19327 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19328 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19329 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19330 &img_barrier);
19331 vkEndCommandBuffer(cmd_bufs[1]);
19332 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19333 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19334 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19335 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19336 &img_barrier);
19337 vkEndCommandBuffer(cmd_bufs[2]);
19338 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19339 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19340 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19341 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19342 &img_barrier);
19343 vkEndCommandBuffer(cmd_bufs[3]);
19344
19345 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19346 VkSemaphore semaphore1, semaphore2;
19347 VkSemaphoreCreateInfo semaphore_create_info{};
19348 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19349 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19350 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19351 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19352 VkSubmitInfo submit_info[3];
19353 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19354 submit_info[0].pNext = nullptr;
19355 submit_info[0].commandBufferCount = 1;
19356 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19357 submit_info[0].signalSemaphoreCount = 1;
19358 submit_info[0].pSignalSemaphores = &semaphore1;
19359 submit_info[0].waitSemaphoreCount = 0;
19360 submit_info[0].pWaitDstStageMask = nullptr;
19361 submit_info[0].pWaitDstStageMask = flags;
19362 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19363 submit_info[1].pNext = nullptr;
19364 submit_info[1].commandBufferCount = 1;
19365 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19366 submit_info[1].waitSemaphoreCount = 1;
19367 submit_info[1].pWaitSemaphores = &semaphore1;
19368 submit_info[1].signalSemaphoreCount = 1;
19369 submit_info[1].pSignalSemaphores = &semaphore2;
19370 submit_info[1].pWaitDstStageMask = flags;
19371 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19372 submit_info[2].pNext = nullptr;
19373 submit_info[2].commandBufferCount = 2;
19374 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19375 submit_info[2].waitSemaphoreCount = 1;
19376 submit_info[2].pWaitSemaphores = &semaphore2;
19377 submit_info[2].signalSemaphoreCount = 0;
19378 submit_info[2].pSignalSemaphores = nullptr;
19379 submit_info[2].pWaitDstStageMask = flags;
19380 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19381 vkQueueWaitIdle(m_device->m_queue);
19382
19383 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19384 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19385 m_errorMonitor->VerifyNotFound();
19386}
19387
Tobin Ehlis953e8392016-11-17 10:54:13 -070019388TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19389 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19390 // We previously had a bug where dynamic offset of inactive bindings was still being used
19391 VkResult err;
19392 m_errorMonitor->ExpectSuccess();
19393
Tony Barbour1fa09702017-03-16 12:09:08 -060019394 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019395 ASSERT_NO_FATAL_FAILURE(InitViewport());
19396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19397
19398 VkDescriptorPoolSize ds_type_count = {};
19399 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19400 ds_type_count.descriptorCount = 3;
19401
19402 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19403 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19404 ds_pool_ci.pNext = NULL;
19405 ds_pool_ci.maxSets = 1;
19406 ds_pool_ci.poolSizeCount = 1;
19407 ds_pool_ci.pPoolSizes = &ds_type_count;
19408
19409 VkDescriptorPool ds_pool;
19410 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19411 ASSERT_VK_SUCCESS(err);
19412
19413 const uint32_t BINDING_COUNT = 3;
19414 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019415 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019416 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19417 dsl_binding[0].descriptorCount = 1;
19418 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19419 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019420 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019421 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19422 dsl_binding[1].descriptorCount = 1;
19423 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19424 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019425 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019426 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19427 dsl_binding[2].descriptorCount = 1;
19428 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19429 dsl_binding[2].pImmutableSamplers = NULL;
19430
19431 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19432 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19433 ds_layout_ci.pNext = NULL;
19434 ds_layout_ci.bindingCount = BINDING_COUNT;
19435 ds_layout_ci.pBindings = dsl_binding;
19436 VkDescriptorSetLayout ds_layout;
19437 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19438 ASSERT_VK_SUCCESS(err);
19439
19440 VkDescriptorSet descriptor_set;
19441 VkDescriptorSetAllocateInfo alloc_info = {};
19442 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19443 alloc_info.descriptorSetCount = 1;
19444 alloc_info.descriptorPool = ds_pool;
19445 alloc_info.pSetLayouts = &ds_layout;
19446 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19447 ASSERT_VK_SUCCESS(err);
19448
19449 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19450 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19451 pipeline_layout_ci.pNext = NULL;
19452 pipeline_layout_ci.setLayoutCount = 1;
19453 pipeline_layout_ci.pSetLayouts = &ds_layout;
19454
19455 VkPipelineLayout pipeline_layout;
19456 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19457 ASSERT_VK_SUCCESS(err);
19458
19459 // Create two buffers to update the descriptors with
19460 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19461 uint32_t qfi = 0;
19462 VkBufferCreateInfo buffCI = {};
19463 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19464 buffCI.size = 2048;
19465 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19466 buffCI.queueFamilyIndexCount = 1;
19467 buffCI.pQueueFamilyIndices = &qfi;
19468
19469 VkBuffer dyub1;
19470 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19471 ASSERT_VK_SUCCESS(err);
19472 // buffer2
19473 buffCI.size = 1024;
19474 VkBuffer dyub2;
19475 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19476 ASSERT_VK_SUCCESS(err);
19477 // Allocate memory and bind to buffers
19478 VkMemoryAllocateInfo mem_alloc[2] = {};
19479 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19480 mem_alloc[0].pNext = NULL;
19481 mem_alloc[0].memoryTypeIndex = 0;
19482 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19483 mem_alloc[1].pNext = NULL;
19484 mem_alloc[1].memoryTypeIndex = 0;
19485
19486 VkMemoryRequirements mem_reqs1;
19487 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19488 VkMemoryRequirements mem_reqs2;
19489 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19490 mem_alloc[0].allocationSize = mem_reqs1.size;
19491 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19492 mem_alloc[1].allocationSize = mem_reqs2.size;
19493 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19494 if (!pass) {
19495 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19496 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19497 return;
19498 }
19499
19500 VkDeviceMemory mem1;
19501 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19502 ASSERT_VK_SUCCESS(err);
19503 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19504 ASSERT_VK_SUCCESS(err);
19505 VkDeviceMemory mem2;
19506 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19507 ASSERT_VK_SUCCESS(err);
19508 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19509 ASSERT_VK_SUCCESS(err);
19510 // Update descriptors
19511 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19512 buff_info[0].buffer = dyub1;
19513 buff_info[0].offset = 0;
19514 buff_info[0].range = 256;
19515 buff_info[1].buffer = dyub1;
19516 buff_info[1].offset = 256;
19517 buff_info[1].range = 512;
19518 buff_info[2].buffer = dyub2;
19519 buff_info[2].offset = 0;
19520 buff_info[2].range = 512;
19521
19522 VkWriteDescriptorSet descriptor_write;
19523 memset(&descriptor_write, 0, sizeof(descriptor_write));
19524 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19525 descriptor_write.dstSet = descriptor_set;
19526 descriptor_write.dstBinding = 0;
19527 descriptor_write.descriptorCount = BINDING_COUNT;
19528 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19529 descriptor_write.pBufferInfo = buff_info;
19530
19531 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19532
Tony Barbour552f6c02016-12-21 14:34:07 -070019533 m_commandBuffer->BeginCommandBuffer();
19534 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019535
19536 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019537 char const *vsSource =
19538 "#version 450\n"
19539 "\n"
19540 "out gl_PerVertex { \n"
19541 " vec4 gl_Position;\n"
19542 "};\n"
19543 "void main(){\n"
19544 " gl_Position = vec4(1);\n"
19545 "}\n";
19546 char const *fsSource =
19547 "#version 450\n"
19548 "\n"
19549 "layout(location=0) out vec4 x;\n"
19550 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19551 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19552 "void main(){\n"
19553 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19554 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019555 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19556 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19557 VkPipelineObj pipe(m_device);
19558 pipe.SetViewport(m_viewports);
19559 pipe.SetScissor(m_scissors);
19560 pipe.AddShader(&vs);
19561 pipe.AddShader(&fs);
19562 pipe.AddColorAttachment();
19563 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19564
19565 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19566 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19567 // we used to have a bug in this case.
19568 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19569 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19570 &descriptor_set, BINDING_COUNT, dyn_off);
19571 Draw(1, 0, 0, 0);
19572 m_errorMonitor->VerifyNotFound();
19573
19574 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19575 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19576 vkFreeMemory(m_device->device(), mem1, NULL);
19577 vkFreeMemory(m_device->device(), mem2, NULL);
19578
19579 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19580 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19581 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19582}
19583
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019584TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019585 TEST_DESCRIPTION(
19586 "Ensure that validations handling of non-coherent memory "
19587 "mapping while using VK_WHOLE_SIZE does not cause access "
19588 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019589 VkResult err;
19590 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019591 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019592
19593 VkDeviceMemory mem;
19594 VkMemoryRequirements mem_reqs;
19595 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019596 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019597 VkMemoryAllocateInfo alloc_info = {};
19598 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19599 alloc_info.pNext = NULL;
19600 alloc_info.memoryTypeIndex = 0;
19601
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019602 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019603 alloc_info.allocationSize = allocation_size;
19604
19605 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19606 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019607 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019608 if (!pass) {
19609 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019610 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19611 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019612 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019613 pass = m_device->phy().set_memory_type(
19614 mem_reqs.memoryTypeBits, &alloc_info,
19615 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19616 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019617 if (!pass) {
19618 return;
19619 }
19620 }
19621 }
19622
19623 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19624 ASSERT_VK_SUCCESS(err);
19625
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019626 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019627 m_errorMonitor->ExpectSuccess();
19628 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19629 ASSERT_VK_SUCCESS(err);
19630 VkMappedMemoryRange mmr = {};
19631 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19632 mmr.memory = mem;
19633 mmr.offset = 0;
19634 mmr.size = VK_WHOLE_SIZE;
19635 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19636 ASSERT_VK_SUCCESS(err);
19637 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19638 ASSERT_VK_SUCCESS(err);
19639 m_errorMonitor->VerifyNotFound();
19640 vkUnmapMemory(m_device->device(), mem);
19641
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019642 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019643 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019644 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019645 ASSERT_VK_SUCCESS(err);
19646 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19647 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019648 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019649 mmr.size = VK_WHOLE_SIZE;
19650 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19651 ASSERT_VK_SUCCESS(err);
19652 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19653 ASSERT_VK_SUCCESS(err);
19654 m_errorMonitor->VerifyNotFound();
19655 vkUnmapMemory(m_device->device(), mem);
19656
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019657 // Map with offset and size
19658 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019659 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019660 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019661 ASSERT_VK_SUCCESS(err);
19662 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19663 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019664 mmr.offset = 4 * atom_size;
19665 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019666 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19667 ASSERT_VK_SUCCESS(err);
19668 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19669 ASSERT_VK_SUCCESS(err);
19670 m_errorMonitor->VerifyNotFound();
19671 vkUnmapMemory(m_device->device(), mem);
19672
19673 // Map without offset and flush WHOLE_SIZE with two separate offsets
19674 m_errorMonitor->ExpectSuccess();
19675 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19676 ASSERT_VK_SUCCESS(err);
19677 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19678 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019679 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019680 mmr.size = VK_WHOLE_SIZE;
19681 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19682 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019683 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019684 mmr.size = VK_WHOLE_SIZE;
19685 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19686 ASSERT_VK_SUCCESS(err);
19687 m_errorMonitor->VerifyNotFound();
19688 vkUnmapMemory(m_device->device(), mem);
19689
19690 vkFreeMemory(m_device->device(), mem, NULL);
19691}
19692
19693// This is a positive test. We used to expect error in this case but spec now allows it
19694TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19695 m_errorMonitor->ExpectSuccess();
19696 vk_testing::Fence testFence;
19697 VkFenceCreateInfo fenceInfo = {};
19698 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19699 fenceInfo.pNext = NULL;
19700
Tony Barbour1fa09702017-03-16 12:09:08 -060019701 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019702 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019703 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019704 VkResult result = vkResetFences(m_device->device(), 1, fences);
19705 ASSERT_VK_SUCCESS(result);
19706
19707 m_errorMonitor->VerifyNotFound();
19708}
19709
19710TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19711 m_errorMonitor->ExpectSuccess();
19712
Tony Barbour1fa09702017-03-16 12:09:08 -060019713 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019714 VkResult err;
19715
19716 // Record (empty!) command buffer that can be submitted multiple times
19717 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019718 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19719 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019720 m_commandBuffer->BeginCommandBuffer(&cbbi);
19721 m_commandBuffer->EndCommandBuffer();
19722
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019723 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019724 VkFence fence;
19725 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19726 ASSERT_VK_SUCCESS(err);
19727
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019728 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019729 VkSemaphore s1, s2;
19730 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19731 ASSERT_VK_SUCCESS(err);
19732 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19733 ASSERT_VK_SUCCESS(err);
19734
19735 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019736 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019737 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19738 ASSERT_VK_SUCCESS(err);
19739
19740 // Submit CB again, signaling s2.
19741 si.pSignalSemaphores = &s2;
19742 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19743 ASSERT_VK_SUCCESS(err);
19744
19745 // Wait for fence.
19746 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19747 ASSERT_VK_SUCCESS(err);
19748
19749 // CB is still in flight from second submission, but semaphore s1 is no
19750 // longer in flight. delete it.
19751 vkDestroySemaphore(m_device->device(), s1, nullptr);
19752
19753 m_errorMonitor->VerifyNotFound();
19754
19755 // Force device idle and clean up remaining objects
19756 vkDeviceWaitIdle(m_device->device());
19757 vkDestroySemaphore(m_device->device(), s2, nullptr);
19758 vkDestroyFence(m_device->device(), fence, nullptr);
19759}
19760
19761TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19762 m_errorMonitor->ExpectSuccess();
19763
Tony Barbour1fa09702017-03-16 12:09:08 -060019764 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019765 VkResult err;
19766
19767 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019768 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019769 VkFence f1;
19770 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19771 ASSERT_VK_SUCCESS(err);
19772
19773 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019774 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019775 VkFence f2;
19776 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19777 ASSERT_VK_SUCCESS(err);
19778
19779 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019780 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019781 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19782
19783 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019784 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019785 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19786
19787 // Should have both retired!
19788 vkDestroyFence(m_device->device(), f1, nullptr);
19789 vkDestroyFence(m_device->device(), f2, nullptr);
19790
19791 m_errorMonitor->VerifyNotFound();
19792}
19793
19794TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019795 TEST_DESCRIPTION(
19796 "Verify that creating an image view from an image with valid usage "
19797 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019798
Tony Barbour1fa09702017-03-16 12:09:08 -060019799 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019800
19801 m_errorMonitor->ExpectSuccess();
19802 // Verify that we can create a view with usage INPUT_ATTACHMENT
19803 VkImageObj image(m_device);
19804 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19805 ASSERT_TRUE(image.initialized());
19806 VkImageView imageView;
19807 VkImageViewCreateInfo ivci = {};
19808 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19809 ivci.image = image.handle();
19810 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19811 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19812 ivci.subresourceRange.layerCount = 1;
19813 ivci.subresourceRange.baseMipLevel = 0;
19814 ivci.subresourceRange.levelCount = 1;
19815 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19816
19817 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19818 m_errorMonitor->VerifyNotFound();
19819 vkDestroyImageView(m_device->device(), imageView, NULL);
19820}
19821
19822// This is a positive test. No failures are expected.
19823TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019824 TEST_DESCRIPTION(
19825 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19826 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019827
Tony Barbour1fa09702017-03-16 12:09:08 -060019828 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019829
19830 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019831 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060019832 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019833
19834 m_errorMonitor->ExpectSuccess();
19835
19836 VkImage image;
19837 VkImageCreateInfo image_create_info = {};
19838 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19839 image_create_info.pNext = NULL;
19840 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19841 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19842 image_create_info.extent.width = 64;
19843 image_create_info.extent.height = 64;
19844 image_create_info.extent.depth = 1;
19845 image_create_info.mipLevels = 1;
19846 image_create_info.arrayLayers = 1;
19847 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19848 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19849 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19850 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19851 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19852 ASSERT_VK_SUCCESS(err);
19853
19854 VkMemoryRequirements memory_reqs;
19855 VkDeviceMemory memory_one, memory_two;
19856 bool pass;
19857 VkMemoryAllocateInfo memory_info = {};
19858 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19859 memory_info.pNext = NULL;
19860 memory_info.allocationSize = 0;
19861 memory_info.memoryTypeIndex = 0;
19862 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19863 // Find an image big enough to allow sparse mapping of 2 memory regions
19864 // Increase the image size until it is at least twice the
19865 // size of the required alignment, to ensure we can bind both
19866 // allocated memory blocks to the image on aligned offsets.
19867 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19868 vkDestroyImage(m_device->device(), image, nullptr);
19869 image_create_info.extent.width *= 2;
19870 image_create_info.extent.height *= 2;
19871 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19872 ASSERT_VK_SUCCESS(err);
19873 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19874 }
19875 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19876 // at the end of the first
19877 memory_info.allocationSize = memory_reqs.alignment;
19878 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19879 ASSERT_TRUE(pass);
19880 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19881 ASSERT_VK_SUCCESS(err);
19882 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19883 ASSERT_VK_SUCCESS(err);
19884 VkSparseMemoryBind binds[2];
19885 binds[0].flags = 0;
19886 binds[0].memory = memory_one;
19887 binds[0].memoryOffset = 0;
19888 binds[0].resourceOffset = 0;
19889 binds[0].size = memory_info.allocationSize;
19890 binds[1].flags = 0;
19891 binds[1].memory = memory_two;
19892 binds[1].memoryOffset = 0;
19893 binds[1].resourceOffset = memory_info.allocationSize;
19894 binds[1].size = memory_info.allocationSize;
19895
19896 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19897 opaqueBindInfo.image = image;
19898 opaqueBindInfo.bindCount = 2;
19899 opaqueBindInfo.pBinds = binds;
19900
19901 VkFence fence = VK_NULL_HANDLE;
19902 VkBindSparseInfo bindSparseInfo = {};
19903 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19904 bindSparseInfo.imageOpaqueBindCount = 1;
19905 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19906
19907 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19908 vkQueueWaitIdle(m_device->m_queue);
19909 vkDestroyImage(m_device->device(), image, NULL);
19910 vkFreeMemory(m_device->device(), memory_one, NULL);
19911 vkFreeMemory(m_device->device(), memory_two, NULL);
19912 m_errorMonitor->VerifyNotFound();
19913}
19914
19915TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019916 TEST_DESCRIPTION(
19917 "Ensure that CmdBeginRenderPass with an attachment's "
19918 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19919 "the command buffer has prior knowledge of that "
19920 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019921
19922 m_errorMonitor->ExpectSuccess();
19923
Tony Barbour1fa09702017-03-16 12:09:08 -060019924 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019925
19926 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019927 VkAttachmentDescription attachment = {0,
19928 VK_FORMAT_R8G8B8A8_UNORM,
19929 VK_SAMPLE_COUNT_1_BIT,
19930 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19931 VK_ATTACHMENT_STORE_OP_STORE,
19932 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19933 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19934 VK_IMAGE_LAYOUT_UNDEFINED,
19935 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019936
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019937 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019938
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019939 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019940
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019941 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019942
19943 VkRenderPass rp;
19944 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19945 ASSERT_VK_SUCCESS(err);
19946
19947 // A compatible framebuffer.
19948 VkImageObj image(m_device);
19949 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19950 ASSERT_TRUE(image.initialized());
19951
19952 VkImageViewCreateInfo ivci = {
19953 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19954 nullptr,
19955 0,
19956 image.handle(),
19957 VK_IMAGE_VIEW_TYPE_2D,
19958 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019959 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19960 VK_COMPONENT_SWIZZLE_IDENTITY},
19961 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019962 };
19963 VkImageView view;
19964 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19965 ASSERT_VK_SUCCESS(err);
19966
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019967 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019968 VkFramebuffer fb;
19969 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19970 ASSERT_VK_SUCCESS(err);
19971
19972 // Record a single command buffer which uses this renderpass twice. The
19973 // bug is triggered at the beginning of the second renderpass, when the
19974 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019975 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tony Barbour552f6c02016-12-21 14:34:07 -070019976 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019977 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19978 vkCmdEndRenderPass(m_commandBuffer->handle());
19979 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19980
19981 m_errorMonitor->VerifyNotFound();
19982
19983 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019984 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019985
19986 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19987 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19988 vkDestroyImageView(m_device->device(), view, nullptr);
19989}
19990
19991TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019992 TEST_DESCRIPTION(
19993 "This test should pass. Create a Framebuffer and "
19994 "command buffer, bind them together, then destroy "
19995 "command pool and framebuffer and verify there are no "
19996 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019997
19998 m_errorMonitor->ExpectSuccess();
19999
Tony Barbour1fa09702017-03-16 12:09:08 -060020000 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020001
20002 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020003 VkAttachmentDescription attachment = {0,
20004 VK_FORMAT_R8G8B8A8_UNORM,
20005 VK_SAMPLE_COUNT_1_BIT,
20006 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20007 VK_ATTACHMENT_STORE_OP_STORE,
20008 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20009 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20010 VK_IMAGE_LAYOUT_UNDEFINED,
20011 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020012
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020013 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020014
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020015 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020016
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020017 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020018
20019 VkRenderPass rp;
20020 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20021 ASSERT_VK_SUCCESS(err);
20022
20023 // A compatible framebuffer.
20024 VkImageObj image(m_device);
20025 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20026 ASSERT_TRUE(image.initialized());
20027
20028 VkImageViewCreateInfo ivci = {
20029 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20030 nullptr,
20031 0,
20032 image.handle(),
20033 VK_IMAGE_VIEW_TYPE_2D,
20034 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020035 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20036 VK_COMPONENT_SWIZZLE_IDENTITY},
20037 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020038 };
20039 VkImageView view;
20040 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20041 ASSERT_VK_SUCCESS(err);
20042
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020043 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020044 VkFramebuffer fb;
20045 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20046 ASSERT_VK_SUCCESS(err);
20047
20048 // Explicitly create a command buffer to bind the FB to so that we can then
20049 // destroy the command pool in order to implicitly free command buffer
20050 VkCommandPool command_pool;
20051 VkCommandPoolCreateInfo pool_create_info{};
20052 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20053 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20054 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20055 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20056
20057 VkCommandBuffer command_buffer;
20058 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20059 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20060 command_buffer_allocate_info.commandPool = command_pool;
20061 command_buffer_allocate_info.commandBufferCount = 1;
20062 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20063 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20064
20065 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020066 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020067 VkCommandBufferBeginInfo begin_info{};
20068 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20069 vkBeginCommandBuffer(command_buffer, &begin_info);
20070
20071 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20072 vkCmdEndRenderPass(command_buffer);
20073 vkEndCommandBuffer(command_buffer);
20074 vkDestroyImageView(m_device->device(), view, nullptr);
20075 // Destroy command pool to implicitly free command buffer
20076 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20077 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20078 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20079 m_errorMonitor->VerifyNotFound();
20080}
20081
20082TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020083 TEST_DESCRIPTION(
20084 "Ensure that CmdBeginRenderPass applies the layout "
20085 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020086
20087 m_errorMonitor->ExpectSuccess();
20088
Tony Barbour1fa09702017-03-16 12:09:08 -060020089 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020090
20091 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020092 VkAttachmentDescription attachment = {0,
20093 VK_FORMAT_R8G8B8A8_UNORM,
20094 VK_SAMPLE_COUNT_1_BIT,
20095 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20096 VK_ATTACHMENT_STORE_OP_STORE,
20097 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20098 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20099 VK_IMAGE_LAYOUT_UNDEFINED,
20100 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020101
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020102 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020103
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020104 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020105
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020106 VkSubpassDependency dep = {0,
20107 0,
20108 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20109 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20110 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20111 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20112 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020113
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020114 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020115
20116 VkResult err;
20117 VkRenderPass rp;
20118 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20119 ASSERT_VK_SUCCESS(err);
20120
20121 // A compatible framebuffer.
20122 VkImageObj image(m_device);
20123 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20124 ASSERT_TRUE(image.initialized());
20125
20126 VkImageViewCreateInfo ivci = {
20127 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20128 nullptr,
20129 0,
20130 image.handle(),
20131 VK_IMAGE_VIEW_TYPE_2D,
20132 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020133 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20134 VK_COMPONENT_SWIZZLE_IDENTITY},
20135 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020136 };
20137 VkImageView view;
20138 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20139 ASSERT_VK_SUCCESS(err);
20140
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020141 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020142 VkFramebuffer fb;
20143 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20144 ASSERT_VK_SUCCESS(err);
20145
20146 // Record a single command buffer which issues a pipeline barrier w/
20147 // image memory barrier for the attachment. This detects the previously
20148 // missing tracking of the subpass layout by throwing a validation error
20149 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020150 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tony Barbour552f6c02016-12-21 14:34:07 -070020151 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020152 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20153
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020154 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20155 nullptr,
20156 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20157 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20158 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20159 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20160 VK_QUEUE_FAMILY_IGNORED,
20161 VK_QUEUE_FAMILY_IGNORED,
20162 image.handle(),
20163 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020164 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020165 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20166 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020167
20168 vkCmdEndRenderPass(m_commandBuffer->handle());
20169 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020170 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020171
20172 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20173 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20174 vkDestroyImageView(m_device->device(), view, nullptr);
20175}
20176
20177TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020178 TEST_DESCRIPTION(
20179 "Validate that when an imageView of a depth/stencil image "
20180 "is used as a depth/stencil framebuffer attachment, the "
20181 "aspectMask is ignored and both depth and stencil image "
20182 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020183
Tony Barbour1fa09702017-03-16 12:09:08 -060020184 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020185 VkFormatProperties format_properties;
20186 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20187 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20188 return;
20189 }
20190
20191 m_errorMonitor->ExpectSuccess();
20192
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020193 VkAttachmentDescription attachment = {0,
20194 VK_FORMAT_D32_SFLOAT_S8_UINT,
20195 VK_SAMPLE_COUNT_1_BIT,
20196 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20197 VK_ATTACHMENT_STORE_OP_STORE,
20198 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20199 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20200 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20201 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020202
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020203 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020204
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020205 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020206
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020207 VkSubpassDependency dep = {0,
20208 0,
20209 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20210 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20211 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20212 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20213 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020214
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020215 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020216
20217 VkResult err;
20218 VkRenderPass rp;
20219 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20220 ASSERT_VK_SUCCESS(err);
20221
20222 VkImageObj image(m_device);
20223 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020224 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020225 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020226 ASSERT_TRUE(image.initialized());
20227 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20228
20229 VkImageViewCreateInfo ivci = {
20230 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20231 nullptr,
20232 0,
20233 image.handle(),
20234 VK_IMAGE_VIEW_TYPE_2D,
20235 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020236 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20237 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020238 };
20239 VkImageView view;
20240 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20241 ASSERT_VK_SUCCESS(err);
20242
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020243 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020244 VkFramebuffer fb;
20245 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20246 ASSERT_VK_SUCCESS(err);
20247
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020248 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tony Barbour552f6c02016-12-21 14:34:07 -070020249 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020250 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20251
20252 VkImageMemoryBarrier imb = {};
20253 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20254 imb.pNext = nullptr;
20255 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20256 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20257 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20258 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20259 imb.srcQueueFamilyIndex = 0;
20260 imb.dstQueueFamilyIndex = 0;
20261 imb.image = image.handle();
20262 imb.subresourceRange.aspectMask = 0x6;
20263 imb.subresourceRange.baseMipLevel = 0;
20264 imb.subresourceRange.levelCount = 0x1;
20265 imb.subresourceRange.baseArrayLayer = 0;
20266 imb.subresourceRange.layerCount = 0x1;
20267
20268 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020269 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20270 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020271
20272 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020273 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020274 QueueCommandBuffer(false);
20275 m_errorMonitor->VerifyNotFound();
20276
20277 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20278 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20279 vkDestroyImageView(m_device->device(), view, nullptr);
20280}
20281
20282TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020283 TEST_DESCRIPTION(
20284 "Ensure that layout transitions work correctly without "
20285 "errors, when an attachment reference is "
20286 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020287
20288 m_errorMonitor->ExpectSuccess();
20289
Tony Barbour1fa09702017-03-16 12:09:08 -060020290 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020291
20292 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020293 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020294
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020295 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020296
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020297 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020298
20299 VkRenderPass rp;
20300 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20301 ASSERT_VK_SUCCESS(err);
20302
20303 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020304 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020305 VkFramebuffer fb;
20306 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20307 ASSERT_VK_SUCCESS(err);
20308
20309 // Record a command buffer which just begins and ends the renderpass. The
20310 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020311 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
Tony Barbour552f6c02016-12-21 14:34:07 -070020312 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020313 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20314 vkCmdEndRenderPass(m_commandBuffer->handle());
20315 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020316 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020317
20318 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20319 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20320}
20321
20322// This is a positive test. No errors are expected.
20323TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020324 TEST_DESCRIPTION(
20325 "Create a stencil-only attachment with a LOAD_OP set to "
20326 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020327 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020328 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020329 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020330 if (!depth_format) {
20331 printf(" No Depth + Stencil format found. Skipped.\n");
20332 return;
20333 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020334 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020335 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020336 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20337 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020338 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20339 return;
20340 }
20341
Tony Barbourf887b162017-03-09 10:06:46 -070020342 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020343 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020344 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020345 VkAttachmentDescription att = {};
20346 VkAttachmentReference ref = {};
20347 att.format = depth_stencil_fmt;
20348 att.samples = VK_SAMPLE_COUNT_1_BIT;
20349 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20350 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20351 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20352 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20353 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20354 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20355
20356 VkClearValue clear;
20357 clear.depthStencil.depth = 1.0;
20358 clear.depthStencil.stencil = 0;
20359 ref.attachment = 0;
20360 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20361
20362 VkSubpassDescription subpass = {};
20363 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20364 subpass.flags = 0;
20365 subpass.inputAttachmentCount = 0;
20366 subpass.pInputAttachments = NULL;
20367 subpass.colorAttachmentCount = 0;
20368 subpass.pColorAttachments = NULL;
20369 subpass.pResolveAttachments = NULL;
20370 subpass.pDepthStencilAttachment = &ref;
20371 subpass.preserveAttachmentCount = 0;
20372 subpass.pPreserveAttachments = NULL;
20373
20374 VkRenderPass rp;
20375 VkRenderPassCreateInfo rp_info = {};
20376 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20377 rp_info.attachmentCount = 1;
20378 rp_info.pAttachments = &att;
20379 rp_info.subpassCount = 1;
20380 rp_info.pSubpasses = &subpass;
20381 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20382 ASSERT_VK_SUCCESS(result);
20383
20384 VkImageView *depthView = m_depthStencil->BindInfo();
20385 VkFramebufferCreateInfo fb_info = {};
20386 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20387 fb_info.pNext = NULL;
20388 fb_info.renderPass = rp;
20389 fb_info.attachmentCount = 1;
20390 fb_info.pAttachments = depthView;
20391 fb_info.width = 100;
20392 fb_info.height = 100;
20393 fb_info.layers = 1;
20394 VkFramebuffer fb;
20395 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20396 ASSERT_VK_SUCCESS(result);
20397
20398 VkRenderPassBeginInfo rpbinfo = {};
20399 rpbinfo.clearValueCount = 1;
20400 rpbinfo.pClearValues = &clear;
20401 rpbinfo.pNext = NULL;
20402 rpbinfo.renderPass = rp;
20403 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20404 rpbinfo.renderArea.extent.width = 100;
20405 rpbinfo.renderArea.extent.height = 100;
20406 rpbinfo.renderArea.offset.x = 0;
20407 rpbinfo.renderArea.offset.y = 0;
20408 rpbinfo.framebuffer = fb;
20409
20410 VkFence fence = {};
20411 VkFenceCreateInfo fence_ci = {};
20412 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20413 fence_ci.pNext = nullptr;
20414 fence_ci.flags = 0;
20415 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20416 ASSERT_VK_SUCCESS(result);
20417
20418 m_commandBuffer->BeginCommandBuffer();
20419 m_commandBuffer->BeginRenderPass(rpbinfo);
20420 m_commandBuffer->EndRenderPass();
20421 m_commandBuffer->EndCommandBuffer();
20422 m_commandBuffer->QueueCommandBuffer(fence);
20423
20424 VkImageObj destImage(m_device);
20425 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020426 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020427 VkImageMemoryBarrier barrier = {};
20428 VkImageSubresourceRange range;
20429 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20430 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20431 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20432 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20433 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20434 barrier.image = m_depthStencil->handle();
20435 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20436 range.baseMipLevel = 0;
20437 range.levelCount = 1;
20438 range.baseArrayLayer = 0;
20439 range.layerCount = 1;
20440 barrier.subresourceRange = range;
20441 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20442 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20443 cmdbuf.BeginCommandBuffer();
20444 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020445 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020446 barrier.srcAccessMask = 0;
20447 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20448 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20449 barrier.image = destImage.handle();
20450 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20451 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020452 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020453 VkImageCopy cregion;
20454 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20455 cregion.srcSubresource.mipLevel = 0;
20456 cregion.srcSubresource.baseArrayLayer = 0;
20457 cregion.srcSubresource.layerCount = 1;
20458 cregion.srcOffset.x = 0;
20459 cregion.srcOffset.y = 0;
20460 cregion.srcOffset.z = 0;
20461 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20462 cregion.dstSubresource.mipLevel = 0;
20463 cregion.dstSubresource.baseArrayLayer = 0;
20464 cregion.dstSubresource.layerCount = 1;
20465 cregion.dstOffset.x = 0;
20466 cregion.dstOffset.y = 0;
20467 cregion.dstOffset.z = 0;
20468 cregion.extent.width = 100;
20469 cregion.extent.height = 100;
20470 cregion.extent.depth = 1;
20471 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020472 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020473 cmdbuf.EndCommandBuffer();
20474
20475 VkSubmitInfo submit_info;
20476 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20477 submit_info.pNext = NULL;
20478 submit_info.waitSemaphoreCount = 0;
20479 submit_info.pWaitSemaphores = NULL;
20480 submit_info.pWaitDstStageMask = NULL;
20481 submit_info.commandBufferCount = 1;
20482 submit_info.pCommandBuffers = &cmdbuf.handle();
20483 submit_info.signalSemaphoreCount = 0;
20484 submit_info.pSignalSemaphores = NULL;
20485
20486 m_errorMonitor->ExpectSuccess();
20487 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20488 m_errorMonitor->VerifyNotFound();
20489
20490 vkQueueWaitIdle(m_device->m_queue);
20491 vkDestroyFence(m_device->device(), fence, nullptr);
20492 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20493 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20494}
20495
20496// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020497TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20498 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20499
20500 m_errorMonitor->ExpectSuccess();
20501
Tony Barbour1fa09702017-03-16 12:09:08 -060020502 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020503 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020504 if (!depth_format) {
20505 printf(" No Depth + Stencil format found. Skipped.\n");
20506 return;
20507 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20509
20510 VkImageMemoryBarrier img_barrier = {};
20511 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20512 img_barrier.pNext = NULL;
20513 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20514 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20515 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20516 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20517 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20518 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20519 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20520 img_barrier.subresourceRange.baseArrayLayer = 0;
20521 img_barrier.subresourceRange.baseMipLevel = 0;
20522 img_barrier.subresourceRange.layerCount = 1;
20523 img_barrier.subresourceRange.levelCount = 1;
20524
20525 {
20526 VkImageObj img_color(m_device);
20527 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20528 ASSERT_TRUE(img_color.initialized());
20529
20530 VkImageObj img_ds1(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020531 img_ds1.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020532 ASSERT_TRUE(img_ds1.initialized());
20533
20534 VkImageObj img_ds2(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020535 img_ds2.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020536 ASSERT_TRUE(img_ds2.initialized());
20537
20538 VkImageObj img_xfer_src(m_device);
20539 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20540 ASSERT_TRUE(img_xfer_src.initialized());
20541
20542 VkImageObj img_xfer_dst(m_device);
20543 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20544 ASSERT_TRUE(img_xfer_dst.initialized());
20545
20546 VkImageObj img_sampled(m_device);
20547 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20548 ASSERT_TRUE(img_sampled.initialized());
20549
20550 VkImageObj img_input(m_device);
20551 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20552 ASSERT_TRUE(img_input.initialized());
20553
20554 const struct {
20555 VkImageObj &image_obj;
20556 VkImageLayout old_layout;
20557 VkImageLayout new_layout;
20558 } buffer_layouts[] = {
20559 // clang-format off
20560 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20561 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20562 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20563 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20564 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20565 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20566 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20567 // clang-format on
20568 };
20569 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20570
20571 m_commandBuffer->BeginCommandBuffer();
20572 for (uint32_t i = 0; i < layout_count; ++i) {
20573 img_barrier.image = buffer_layouts[i].image_obj.handle();
20574 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20575 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20576 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20577 : VK_IMAGE_ASPECT_COLOR_BIT;
20578
20579 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20580 img_barrier.newLayout = buffer_layouts[i].new_layout;
20581 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20582 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20583
20584 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20585 img_barrier.newLayout = buffer_layouts[i].old_layout;
20586 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20587 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20588 }
20589 m_commandBuffer->EndCommandBuffer();
20590
20591 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20592 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20593 }
20594 m_errorMonitor->VerifyNotFound();
20595}
20596
20597// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020598TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20599 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20600
20601 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020602 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020603
20604 VkEvent event;
20605 VkEventCreateInfo event_create_info{};
20606 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20607 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20608
20609 VkCommandPool command_pool;
20610 VkCommandPoolCreateInfo pool_create_info{};
20611 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20612 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20613 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20614 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20615
20616 VkCommandBuffer command_buffer;
20617 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20618 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20619 command_buffer_allocate_info.commandPool = command_pool;
20620 command_buffer_allocate_info.commandBufferCount = 1;
20621 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20622 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20623
20624 VkQueue queue = VK_NULL_HANDLE;
20625 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20626
20627 {
20628 VkCommandBufferBeginInfo begin_info{};
20629 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20630 vkBeginCommandBuffer(command_buffer, &begin_info);
20631
20632 vkCmdWaitEvents(command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, nullptr, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020633 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020634 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20635 vkEndCommandBuffer(command_buffer);
20636 }
20637 {
20638 VkSubmitInfo submit_info{};
20639 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20640 submit_info.commandBufferCount = 1;
20641 submit_info.pCommandBuffers = &command_buffer;
20642 submit_info.signalSemaphoreCount = 0;
20643 submit_info.pSignalSemaphores = nullptr;
20644 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20645 }
20646 { vkSetEvent(m_device->device(), event); }
20647
20648 vkQueueWaitIdle(queue);
20649
20650 vkDestroyEvent(m_device->device(), event, nullptr);
20651 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20652 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20653
20654 m_errorMonitor->VerifyNotFound();
20655}
20656// This is a positive test. No errors should be generated.
20657TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20658 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20659
Tony Barbour1fa09702017-03-16 12:09:08 -060020660 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020661 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020662
20663 m_errorMonitor->ExpectSuccess();
20664
20665 VkQueryPool query_pool;
20666 VkQueryPoolCreateInfo query_pool_create_info{};
20667 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20668 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20669 query_pool_create_info.queryCount = 1;
20670 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20671
20672 VkCommandPool command_pool;
20673 VkCommandPoolCreateInfo pool_create_info{};
20674 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20675 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20676 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20677 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20678
20679 VkCommandBuffer command_buffer;
20680 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20681 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20682 command_buffer_allocate_info.commandPool = command_pool;
20683 command_buffer_allocate_info.commandBufferCount = 1;
20684 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20685 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20686
20687 VkCommandBuffer secondary_command_buffer;
20688 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20689 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20690
20691 VkQueue queue = VK_NULL_HANDLE;
20692 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20693
20694 uint32_t qfi = 0;
20695 VkBufferCreateInfo buff_create_info = {};
20696 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20697 buff_create_info.size = 1024;
20698 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20699 buff_create_info.queueFamilyIndexCount = 1;
20700 buff_create_info.pQueueFamilyIndices = &qfi;
20701
20702 VkResult err;
20703 VkBuffer buffer;
20704 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20705 ASSERT_VK_SUCCESS(err);
20706 VkMemoryAllocateInfo mem_alloc = {};
20707 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20708 mem_alloc.pNext = NULL;
20709 mem_alloc.allocationSize = 1024;
20710 mem_alloc.memoryTypeIndex = 0;
20711
20712 VkMemoryRequirements memReqs;
20713 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20714 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20715 if (!pass) {
20716 vkDestroyBuffer(m_device->device(), buffer, NULL);
20717 return;
20718 }
20719
20720 VkDeviceMemory mem;
20721 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20722 ASSERT_VK_SUCCESS(err);
20723 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20724 ASSERT_VK_SUCCESS(err);
20725
20726 VkCommandBufferInheritanceInfo hinfo = {};
20727 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20728 hinfo.renderPass = VK_NULL_HANDLE;
20729 hinfo.subpass = 0;
20730 hinfo.framebuffer = VK_NULL_HANDLE;
20731 hinfo.occlusionQueryEnable = VK_FALSE;
20732 hinfo.queryFlags = 0;
20733 hinfo.pipelineStatistics = 0;
20734
20735 {
20736 VkCommandBufferBeginInfo begin_info{};
20737 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20738 begin_info.pInheritanceInfo = &hinfo;
20739 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20740
20741 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20742 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20743
20744 vkEndCommandBuffer(secondary_command_buffer);
20745
20746 begin_info.pInheritanceInfo = nullptr;
20747 vkBeginCommandBuffer(command_buffer, &begin_info);
20748
20749 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20750 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20751
20752 vkEndCommandBuffer(command_buffer);
20753 }
20754 {
20755 VkSubmitInfo submit_info{};
20756 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20757 submit_info.commandBufferCount = 1;
20758 submit_info.pCommandBuffers = &command_buffer;
20759 submit_info.signalSemaphoreCount = 0;
20760 submit_info.pSignalSemaphores = nullptr;
20761 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20762 }
20763
20764 vkQueueWaitIdle(queue);
20765
20766 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20767 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20768 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20769 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20770 vkDestroyBuffer(m_device->device(), buffer, NULL);
20771 vkFreeMemory(m_device->device(), mem, NULL);
20772
20773 m_errorMonitor->VerifyNotFound();
20774}
20775
20776// This is a positive test. No errors should be generated.
20777TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20778 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20779
Tony Barbour1fa09702017-03-16 12:09:08 -060020780 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020781 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020782
20783 m_errorMonitor->ExpectSuccess();
20784
20785 VkQueryPool query_pool;
20786 VkQueryPoolCreateInfo query_pool_create_info{};
20787 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20788 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20789 query_pool_create_info.queryCount = 1;
20790 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20791
20792 VkCommandPool command_pool;
20793 VkCommandPoolCreateInfo pool_create_info{};
20794 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20795 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20796 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20797 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20798
20799 VkCommandBuffer command_buffer[2];
20800 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20801 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20802 command_buffer_allocate_info.commandPool = command_pool;
20803 command_buffer_allocate_info.commandBufferCount = 2;
20804 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20805 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20806
20807 VkQueue queue = VK_NULL_HANDLE;
20808 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20809
20810 uint32_t qfi = 0;
20811 VkBufferCreateInfo buff_create_info = {};
20812 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20813 buff_create_info.size = 1024;
20814 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20815 buff_create_info.queueFamilyIndexCount = 1;
20816 buff_create_info.pQueueFamilyIndices = &qfi;
20817
20818 VkResult err;
20819 VkBuffer buffer;
20820 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20821 ASSERT_VK_SUCCESS(err);
20822 VkMemoryAllocateInfo mem_alloc = {};
20823 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20824 mem_alloc.pNext = NULL;
20825 mem_alloc.allocationSize = 1024;
20826 mem_alloc.memoryTypeIndex = 0;
20827
20828 VkMemoryRequirements memReqs;
20829 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20830 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20831 if (!pass) {
20832 vkDestroyBuffer(m_device->device(), buffer, NULL);
20833 return;
20834 }
20835
20836 VkDeviceMemory mem;
20837 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20838 ASSERT_VK_SUCCESS(err);
20839 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20840 ASSERT_VK_SUCCESS(err);
20841
20842 {
20843 VkCommandBufferBeginInfo begin_info{};
20844 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20845 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20846
20847 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20848 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20849
20850 vkEndCommandBuffer(command_buffer[0]);
20851
20852 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20853
20854 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20855
20856 vkEndCommandBuffer(command_buffer[1]);
20857 }
20858 {
20859 VkSubmitInfo submit_info{};
20860 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20861 submit_info.commandBufferCount = 2;
20862 submit_info.pCommandBuffers = command_buffer;
20863 submit_info.signalSemaphoreCount = 0;
20864 submit_info.pSignalSemaphores = nullptr;
20865 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20866 }
20867
20868 vkQueueWaitIdle(queue);
20869
20870 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20871 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20872 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20873 vkDestroyBuffer(m_device->device(), buffer, NULL);
20874 vkFreeMemory(m_device->device(), mem, NULL);
20875
20876 m_errorMonitor->VerifyNotFound();
20877}
20878
Tony Barbourc46924f2016-11-04 11:49:52 -060020879TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020880 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20881
Tony Barbour1fa09702017-03-16 12:09:08 -060020882 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020883 VkEvent event;
20884 VkEventCreateInfo event_create_info{};
20885 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20886 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20887
20888 VkCommandPool command_pool;
20889 VkCommandPoolCreateInfo pool_create_info{};
20890 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20891 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20892 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20893 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20894
20895 VkCommandBuffer command_buffer;
20896 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20897 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20898 command_buffer_allocate_info.commandPool = command_pool;
20899 command_buffer_allocate_info.commandBufferCount = 1;
20900 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20901 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20902
20903 VkQueue queue = VK_NULL_HANDLE;
20904 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20905
20906 {
20907 VkCommandBufferBeginInfo begin_info{};
20908 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20909 vkBeginCommandBuffer(command_buffer, &begin_info);
20910
20911 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020912 vkEndCommandBuffer(command_buffer);
20913 }
20914 {
20915 VkSubmitInfo submit_info{};
20916 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20917 submit_info.commandBufferCount = 1;
20918 submit_info.pCommandBuffers = &command_buffer;
20919 submit_info.signalSemaphoreCount = 0;
20920 submit_info.pSignalSemaphores = nullptr;
20921 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20922 }
20923 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20925 "that is already in use by a "
20926 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020927 vkSetEvent(m_device->device(), event);
20928 m_errorMonitor->VerifyFound();
20929 }
20930
20931 vkQueueWaitIdle(queue);
20932
20933 vkDestroyEvent(m_device->device(), event, nullptr);
20934 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20935 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20936}
20937
20938// This is a positive test. No errors should be generated.
20939TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020940 TEST_DESCRIPTION(
20941 "Two command buffers with two separate fences are each "
20942 "run through a Submit & WaitForFences cycle 3 times. This "
20943 "previously revealed a bug so running this positive test "
20944 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020945 m_errorMonitor->ExpectSuccess();
20946
Tony Barbour1fa09702017-03-16 12:09:08 -060020947 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020948 VkQueue queue = VK_NULL_HANDLE;
20949 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20950
20951 static const uint32_t NUM_OBJECTS = 2;
20952 static const uint32_t NUM_FRAMES = 3;
20953 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20954 VkFence fences[NUM_OBJECTS] = {};
20955
20956 VkCommandPool cmd_pool;
20957 VkCommandPoolCreateInfo cmd_pool_ci = {};
20958 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20959 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20960 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20961 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20962 ASSERT_VK_SUCCESS(err);
20963
20964 VkCommandBufferAllocateInfo cmd_buf_info = {};
20965 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20966 cmd_buf_info.commandPool = cmd_pool;
20967 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20968 cmd_buf_info.commandBufferCount = 1;
20969
20970 VkFenceCreateInfo fence_ci = {};
20971 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20972 fence_ci.pNext = nullptr;
20973 fence_ci.flags = 0;
20974
20975 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20976 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20977 ASSERT_VK_SUCCESS(err);
20978 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20979 ASSERT_VK_SUCCESS(err);
20980 }
20981
20982 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20983 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20984 // Create empty cmd buffer
20985 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20986 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20987
20988 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20989 ASSERT_VK_SUCCESS(err);
20990 err = vkEndCommandBuffer(cmd_buffers[obj]);
20991 ASSERT_VK_SUCCESS(err);
20992
20993 VkSubmitInfo submit_info = {};
20994 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20995 submit_info.commandBufferCount = 1;
20996 submit_info.pCommandBuffers = &cmd_buffers[obj];
20997 // Submit cmd buffer and wait for fence
20998 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20999 ASSERT_VK_SUCCESS(err);
21000 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21001 ASSERT_VK_SUCCESS(err);
21002 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21003 ASSERT_VK_SUCCESS(err);
21004 }
21005 }
21006 m_errorMonitor->VerifyNotFound();
21007 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21008 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21009 vkDestroyFence(m_device->device(), fences[i], nullptr);
21010 }
21011}
21012// This is a positive test. No errors should be generated.
21013TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021014 TEST_DESCRIPTION(
21015 "Two command buffers, each in a separate QueueSubmit call "
21016 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021017
Tony Barbour1fa09702017-03-16 12:09:08 -060021018 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021019 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021020
21021 m_errorMonitor->ExpectSuccess();
21022
21023 VkSemaphore semaphore;
21024 VkSemaphoreCreateInfo semaphore_create_info{};
21025 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21026 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21027
21028 VkCommandPool command_pool;
21029 VkCommandPoolCreateInfo pool_create_info{};
21030 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21031 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21032 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21033 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21034
21035 VkCommandBuffer command_buffer[2];
21036 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21037 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21038 command_buffer_allocate_info.commandPool = command_pool;
21039 command_buffer_allocate_info.commandBufferCount = 2;
21040 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21041 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21042
21043 VkQueue queue = VK_NULL_HANDLE;
21044 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21045
21046 {
21047 VkCommandBufferBeginInfo begin_info{};
21048 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21049 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21050
21051 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021052 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021053
21054 VkViewport viewport{};
21055 viewport.maxDepth = 1.0f;
21056 viewport.minDepth = 0.0f;
21057 viewport.width = 512;
21058 viewport.height = 512;
21059 viewport.x = 0;
21060 viewport.y = 0;
21061 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21062 vkEndCommandBuffer(command_buffer[0]);
21063 }
21064 {
21065 VkCommandBufferBeginInfo begin_info{};
21066 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21067 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21068
21069 VkViewport viewport{};
21070 viewport.maxDepth = 1.0f;
21071 viewport.minDepth = 0.0f;
21072 viewport.width = 512;
21073 viewport.height = 512;
21074 viewport.x = 0;
21075 viewport.y = 0;
21076 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21077 vkEndCommandBuffer(command_buffer[1]);
21078 }
21079 {
21080 VkSubmitInfo submit_info{};
21081 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21082 submit_info.commandBufferCount = 1;
21083 submit_info.pCommandBuffers = &command_buffer[0];
21084 submit_info.signalSemaphoreCount = 1;
21085 submit_info.pSignalSemaphores = &semaphore;
21086 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21087 }
21088 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021089 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021090 VkSubmitInfo submit_info{};
21091 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21092 submit_info.commandBufferCount = 1;
21093 submit_info.pCommandBuffers = &command_buffer[1];
21094 submit_info.waitSemaphoreCount = 1;
21095 submit_info.pWaitSemaphores = &semaphore;
21096 submit_info.pWaitDstStageMask = flags;
21097 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21098 }
21099
21100 vkQueueWaitIdle(m_device->m_queue);
21101
21102 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21103 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21104 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21105
21106 m_errorMonitor->VerifyNotFound();
21107}
21108
21109// This is a positive test. No errors should be generated.
21110TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021111 TEST_DESCRIPTION(
21112 "Two command buffers, each in a separate QueueSubmit call "
21113 "submitted on separate queues, the second having a fence"
21114 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021115
Tony Barbour1fa09702017-03-16 12:09:08 -060021116 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021117 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021118
21119 m_errorMonitor->ExpectSuccess();
21120
21121 VkFence fence;
21122 VkFenceCreateInfo fence_create_info{};
21123 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21124 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21125
21126 VkSemaphore semaphore;
21127 VkSemaphoreCreateInfo semaphore_create_info{};
21128 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21129 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21130
21131 VkCommandPool command_pool;
21132 VkCommandPoolCreateInfo pool_create_info{};
21133 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21134 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21135 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21136 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21137
21138 VkCommandBuffer command_buffer[2];
21139 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21140 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21141 command_buffer_allocate_info.commandPool = command_pool;
21142 command_buffer_allocate_info.commandBufferCount = 2;
21143 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21144 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21145
21146 VkQueue queue = VK_NULL_HANDLE;
21147 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21148
21149 {
21150 VkCommandBufferBeginInfo begin_info{};
21151 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21152 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21153
21154 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021155 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021156
21157 VkViewport viewport{};
21158 viewport.maxDepth = 1.0f;
21159 viewport.minDepth = 0.0f;
21160 viewport.width = 512;
21161 viewport.height = 512;
21162 viewport.x = 0;
21163 viewport.y = 0;
21164 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21165 vkEndCommandBuffer(command_buffer[0]);
21166 }
21167 {
21168 VkCommandBufferBeginInfo begin_info{};
21169 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21170 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21171
21172 VkViewport viewport{};
21173 viewport.maxDepth = 1.0f;
21174 viewport.minDepth = 0.0f;
21175 viewport.width = 512;
21176 viewport.height = 512;
21177 viewport.x = 0;
21178 viewport.y = 0;
21179 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21180 vkEndCommandBuffer(command_buffer[1]);
21181 }
21182 {
21183 VkSubmitInfo submit_info{};
21184 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21185 submit_info.commandBufferCount = 1;
21186 submit_info.pCommandBuffers = &command_buffer[0];
21187 submit_info.signalSemaphoreCount = 1;
21188 submit_info.pSignalSemaphores = &semaphore;
21189 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21190 }
21191 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021192 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021193 VkSubmitInfo submit_info{};
21194 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21195 submit_info.commandBufferCount = 1;
21196 submit_info.pCommandBuffers = &command_buffer[1];
21197 submit_info.waitSemaphoreCount = 1;
21198 submit_info.pWaitSemaphores = &semaphore;
21199 submit_info.pWaitDstStageMask = flags;
21200 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21201 }
21202
21203 vkQueueWaitIdle(m_device->m_queue);
21204
21205 vkDestroyFence(m_device->device(), fence, nullptr);
21206 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21207 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21208 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21209
21210 m_errorMonitor->VerifyNotFound();
21211}
21212
21213// This is a positive test. No errors should be generated.
21214TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021215 TEST_DESCRIPTION(
21216 "Two command buffers, each in a separate QueueSubmit call "
21217 "submitted on separate queues, the second having a fence"
21218 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021219
Tony Barbour1fa09702017-03-16 12:09:08 -060021220 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021221 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021222
21223 m_errorMonitor->ExpectSuccess();
21224
21225 VkFence fence;
21226 VkFenceCreateInfo fence_create_info{};
21227 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21228 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21229
21230 VkSemaphore semaphore;
21231 VkSemaphoreCreateInfo semaphore_create_info{};
21232 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21233 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21234
21235 VkCommandPool command_pool;
21236 VkCommandPoolCreateInfo pool_create_info{};
21237 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21238 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21239 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21240 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21241
21242 VkCommandBuffer command_buffer[2];
21243 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21244 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21245 command_buffer_allocate_info.commandPool = command_pool;
21246 command_buffer_allocate_info.commandBufferCount = 2;
21247 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21248 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21249
21250 VkQueue queue = VK_NULL_HANDLE;
21251 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21252
21253 {
21254 VkCommandBufferBeginInfo begin_info{};
21255 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21256 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21257
21258 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021259 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021260
21261 VkViewport viewport{};
21262 viewport.maxDepth = 1.0f;
21263 viewport.minDepth = 0.0f;
21264 viewport.width = 512;
21265 viewport.height = 512;
21266 viewport.x = 0;
21267 viewport.y = 0;
21268 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21269 vkEndCommandBuffer(command_buffer[0]);
21270 }
21271 {
21272 VkCommandBufferBeginInfo begin_info{};
21273 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21274 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21275
21276 VkViewport viewport{};
21277 viewport.maxDepth = 1.0f;
21278 viewport.minDepth = 0.0f;
21279 viewport.width = 512;
21280 viewport.height = 512;
21281 viewport.x = 0;
21282 viewport.y = 0;
21283 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21284 vkEndCommandBuffer(command_buffer[1]);
21285 }
21286 {
21287 VkSubmitInfo submit_info{};
21288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21289 submit_info.commandBufferCount = 1;
21290 submit_info.pCommandBuffers = &command_buffer[0];
21291 submit_info.signalSemaphoreCount = 1;
21292 submit_info.pSignalSemaphores = &semaphore;
21293 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21294 }
21295 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021296 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021297 VkSubmitInfo submit_info{};
21298 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21299 submit_info.commandBufferCount = 1;
21300 submit_info.pCommandBuffers = &command_buffer[1];
21301 submit_info.waitSemaphoreCount = 1;
21302 submit_info.pWaitSemaphores = &semaphore;
21303 submit_info.pWaitDstStageMask = flags;
21304 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21305 }
21306
21307 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21308 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21309
21310 vkDestroyFence(m_device->device(), fence, nullptr);
21311 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21312 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21313 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21314
21315 m_errorMonitor->VerifyNotFound();
21316}
21317
21318TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021319 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021320 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021321 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021322 return;
21323 }
21324
21325 VkResult err;
21326
21327 m_errorMonitor->ExpectSuccess();
21328
21329 VkQueue q0 = m_device->m_queue;
21330 VkQueue q1 = nullptr;
21331 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21332 ASSERT_NE(q1, nullptr);
21333
21334 // An (empty) command buffer. We must have work in the first submission --
21335 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021336 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021337 VkCommandPool pool;
21338 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21339 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021340 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21341 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021342 VkCommandBuffer cb;
21343 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21344 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021345 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021346 err = vkBeginCommandBuffer(cb, &cbbi);
21347 ASSERT_VK_SUCCESS(err);
21348 err = vkEndCommandBuffer(cb);
21349 ASSERT_VK_SUCCESS(err);
21350
21351 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021352 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021353 VkSemaphore s;
21354 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21355 ASSERT_VK_SUCCESS(err);
21356
21357 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021358 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021359
21360 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21361 ASSERT_VK_SUCCESS(err);
21362
21363 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021364 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021365 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021366
21367 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21368 ASSERT_VK_SUCCESS(err);
21369
21370 // Wait for q0 idle
21371 err = vkQueueWaitIdle(q0);
21372 ASSERT_VK_SUCCESS(err);
21373
21374 // Command buffer should have been completed (it was on q0); reset the pool.
21375 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21376
21377 m_errorMonitor->VerifyNotFound();
21378
21379 // Force device completely idle and clean up resources
21380 vkDeviceWaitIdle(m_device->device());
21381 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21382 vkDestroySemaphore(m_device->device(), s, nullptr);
21383}
21384
21385// This is a positive test. No errors should be generated.
21386TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021387 TEST_DESCRIPTION(
21388 "Two command buffers, each in a separate QueueSubmit call "
21389 "submitted on separate queues, the second having a fence, "
21390 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021391
Tony Barbour1fa09702017-03-16 12:09:08 -060021392 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021393 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021394
21395 m_errorMonitor->ExpectSuccess();
21396
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021397 VkFence fence;
21398 VkFenceCreateInfo fence_create_info{};
21399 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21400 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21401
21402 VkSemaphore semaphore;
21403 VkSemaphoreCreateInfo semaphore_create_info{};
21404 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21405 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21406
21407 VkCommandPool command_pool;
21408 VkCommandPoolCreateInfo pool_create_info{};
21409 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21410 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21411 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21412 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21413
21414 VkCommandBuffer command_buffer[2];
21415 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21416 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21417 command_buffer_allocate_info.commandPool = command_pool;
21418 command_buffer_allocate_info.commandBufferCount = 2;
21419 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21420 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21421
21422 VkQueue queue = VK_NULL_HANDLE;
21423 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21424
21425 {
21426 VkCommandBufferBeginInfo begin_info{};
21427 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21428 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21429
21430 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021431 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021432
21433 VkViewport viewport{};
21434 viewport.maxDepth = 1.0f;
21435 viewport.minDepth = 0.0f;
21436 viewport.width = 512;
21437 viewport.height = 512;
21438 viewport.x = 0;
21439 viewport.y = 0;
21440 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21441 vkEndCommandBuffer(command_buffer[0]);
21442 }
21443 {
21444 VkCommandBufferBeginInfo begin_info{};
21445 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21446 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21447
21448 VkViewport viewport{};
21449 viewport.maxDepth = 1.0f;
21450 viewport.minDepth = 0.0f;
21451 viewport.width = 512;
21452 viewport.height = 512;
21453 viewport.x = 0;
21454 viewport.y = 0;
21455 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21456 vkEndCommandBuffer(command_buffer[1]);
21457 }
21458 {
21459 VkSubmitInfo submit_info{};
21460 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21461 submit_info.commandBufferCount = 1;
21462 submit_info.pCommandBuffers = &command_buffer[0];
21463 submit_info.signalSemaphoreCount = 1;
21464 submit_info.pSignalSemaphores = &semaphore;
21465 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21466 }
21467 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021468 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021469 VkSubmitInfo submit_info{};
21470 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21471 submit_info.commandBufferCount = 1;
21472 submit_info.pCommandBuffers = &command_buffer[1];
21473 submit_info.waitSemaphoreCount = 1;
21474 submit_info.pWaitSemaphores = &semaphore;
21475 submit_info.pWaitDstStageMask = flags;
21476 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21477 }
21478
21479 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21480
21481 vkDestroyFence(m_device->device(), fence, nullptr);
21482 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21483 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21484 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21485
21486 m_errorMonitor->VerifyNotFound();
21487}
21488
21489// This is a positive test. No errors should be generated.
21490TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021491 TEST_DESCRIPTION(
21492 "Two command buffers, each in a separate QueueSubmit call "
21493 "on the same queue, sharing a signal/wait semaphore, the "
21494 "second having a fence, "
21495 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021496
21497 m_errorMonitor->ExpectSuccess();
21498
Tony Barbour1fa09702017-03-16 12:09:08 -060021499 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021500 VkFence fence;
21501 VkFenceCreateInfo fence_create_info{};
21502 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21503 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21504
21505 VkSemaphore semaphore;
21506 VkSemaphoreCreateInfo semaphore_create_info{};
21507 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21508 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21509
21510 VkCommandPool command_pool;
21511 VkCommandPoolCreateInfo pool_create_info{};
21512 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21513 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21514 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21515 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21516
21517 VkCommandBuffer command_buffer[2];
21518 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21519 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21520 command_buffer_allocate_info.commandPool = command_pool;
21521 command_buffer_allocate_info.commandBufferCount = 2;
21522 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21523 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21524
21525 {
21526 VkCommandBufferBeginInfo begin_info{};
21527 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21528 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21529
21530 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021531 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021532
21533 VkViewport viewport{};
21534 viewport.maxDepth = 1.0f;
21535 viewport.minDepth = 0.0f;
21536 viewport.width = 512;
21537 viewport.height = 512;
21538 viewport.x = 0;
21539 viewport.y = 0;
21540 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21541 vkEndCommandBuffer(command_buffer[0]);
21542 }
21543 {
21544 VkCommandBufferBeginInfo begin_info{};
21545 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21546 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21547
21548 VkViewport viewport{};
21549 viewport.maxDepth = 1.0f;
21550 viewport.minDepth = 0.0f;
21551 viewport.width = 512;
21552 viewport.height = 512;
21553 viewport.x = 0;
21554 viewport.y = 0;
21555 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21556 vkEndCommandBuffer(command_buffer[1]);
21557 }
21558 {
21559 VkSubmitInfo submit_info{};
21560 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21561 submit_info.commandBufferCount = 1;
21562 submit_info.pCommandBuffers = &command_buffer[0];
21563 submit_info.signalSemaphoreCount = 1;
21564 submit_info.pSignalSemaphores = &semaphore;
21565 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21566 }
21567 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021568 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021569 VkSubmitInfo submit_info{};
21570 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21571 submit_info.commandBufferCount = 1;
21572 submit_info.pCommandBuffers = &command_buffer[1];
21573 submit_info.waitSemaphoreCount = 1;
21574 submit_info.pWaitSemaphores = &semaphore;
21575 submit_info.pWaitDstStageMask = flags;
21576 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21577 }
21578
21579 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21580
21581 vkDestroyFence(m_device->device(), fence, nullptr);
21582 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21583 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21584 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21585
21586 m_errorMonitor->VerifyNotFound();
21587}
21588
21589// This is a positive test. No errors should be generated.
21590TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021591 TEST_DESCRIPTION(
21592 "Two command buffers, each in a separate QueueSubmit call "
21593 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21594 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021595
21596 m_errorMonitor->ExpectSuccess();
21597
Tony Barbour1fa09702017-03-16 12:09:08 -060021598 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021599 VkFence fence;
21600 VkFenceCreateInfo fence_create_info{};
21601 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21602 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21603
21604 VkCommandPool command_pool;
21605 VkCommandPoolCreateInfo pool_create_info{};
21606 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21607 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21608 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21609 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21610
21611 VkCommandBuffer command_buffer[2];
21612 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21613 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21614 command_buffer_allocate_info.commandPool = command_pool;
21615 command_buffer_allocate_info.commandBufferCount = 2;
21616 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21617 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21618
21619 {
21620 VkCommandBufferBeginInfo begin_info{};
21621 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21622 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21623
21624 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021625 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021626
21627 VkViewport viewport{};
21628 viewport.maxDepth = 1.0f;
21629 viewport.minDepth = 0.0f;
21630 viewport.width = 512;
21631 viewport.height = 512;
21632 viewport.x = 0;
21633 viewport.y = 0;
21634 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21635 vkEndCommandBuffer(command_buffer[0]);
21636 }
21637 {
21638 VkCommandBufferBeginInfo begin_info{};
21639 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21640 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21641
21642 VkViewport viewport{};
21643 viewport.maxDepth = 1.0f;
21644 viewport.minDepth = 0.0f;
21645 viewport.width = 512;
21646 viewport.height = 512;
21647 viewport.x = 0;
21648 viewport.y = 0;
21649 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21650 vkEndCommandBuffer(command_buffer[1]);
21651 }
21652 {
21653 VkSubmitInfo submit_info{};
21654 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21655 submit_info.commandBufferCount = 1;
21656 submit_info.pCommandBuffers = &command_buffer[0];
21657 submit_info.signalSemaphoreCount = 0;
21658 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21659 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21660 }
21661 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021662 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021663 VkSubmitInfo submit_info{};
21664 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21665 submit_info.commandBufferCount = 1;
21666 submit_info.pCommandBuffers = &command_buffer[1];
21667 submit_info.waitSemaphoreCount = 0;
21668 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21669 submit_info.pWaitDstStageMask = flags;
21670 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21671 }
21672
21673 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21674
21675 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21676 ASSERT_VK_SUCCESS(err);
21677
21678 vkDestroyFence(m_device->device(), fence, nullptr);
21679 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21680 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21681
21682 m_errorMonitor->VerifyNotFound();
21683}
21684
21685// This is a positive test. No errors should be generated.
21686TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021687 TEST_DESCRIPTION(
21688 "Two command buffers, each in a separate QueueSubmit call "
21689 "on the same queue, the second having a fence, followed "
21690 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021691
21692 m_errorMonitor->ExpectSuccess();
21693
Tony Barbour1fa09702017-03-16 12:09:08 -060021694 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021695 VkFence fence;
21696 VkFenceCreateInfo fence_create_info{};
21697 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21698 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21699
21700 VkCommandPool command_pool;
21701 VkCommandPoolCreateInfo pool_create_info{};
21702 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21703 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21704 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21705 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21706
21707 VkCommandBuffer command_buffer[2];
21708 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21709 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21710 command_buffer_allocate_info.commandPool = command_pool;
21711 command_buffer_allocate_info.commandBufferCount = 2;
21712 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21713 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21714
21715 {
21716 VkCommandBufferBeginInfo begin_info{};
21717 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21718 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21719
21720 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021721 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021722
21723 VkViewport viewport{};
21724 viewport.maxDepth = 1.0f;
21725 viewport.minDepth = 0.0f;
21726 viewport.width = 512;
21727 viewport.height = 512;
21728 viewport.x = 0;
21729 viewport.y = 0;
21730 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21731 vkEndCommandBuffer(command_buffer[0]);
21732 }
21733 {
21734 VkCommandBufferBeginInfo begin_info{};
21735 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21736 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21737
21738 VkViewport viewport{};
21739 viewport.maxDepth = 1.0f;
21740 viewport.minDepth = 0.0f;
21741 viewport.width = 512;
21742 viewport.height = 512;
21743 viewport.x = 0;
21744 viewport.y = 0;
21745 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21746 vkEndCommandBuffer(command_buffer[1]);
21747 }
21748 {
21749 VkSubmitInfo submit_info{};
21750 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21751 submit_info.commandBufferCount = 1;
21752 submit_info.pCommandBuffers = &command_buffer[0];
21753 submit_info.signalSemaphoreCount = 0;
21754 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21755 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21756 }
21757 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021758 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021759 VkSubmitInfo submit_info{};
21760 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21761 submit_info.commandBufferCount = 1;
21762 submit_info.pCommandBuffers = &command_buffer[1];
21763 submit_info.waitSemaphoreCount = 0;
21764 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21765 submit_info.pWaitDstStageMask = flags;
21766 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21767 }
21768
21769 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21770
21771 vkDestroyFence(m_device->device(), fence, nullptr);
21772 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21773 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21774
21775 m_errorMonitor->VerifyNotFound();
21776}
21777
21778// This is a positive test. No errors should be generated.
21779TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021780 TEST_DESCRIPTION(
21781 "Two command buffers each in a separate SubmitInfo sent in a single "
21782 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021783 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021784
21785 m_errorMonitor->ExpectSuccess();
21786
21787 VkFence fence;
21788 VkFenceCreateInfo fence_create_info{};
21789 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21790 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21791
21792 VkSemaphore semaphore;
21793 VkSemaphoreCreateInfo semaphore_create_info{};
21794 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21795 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21796
21797 VkCommandPool command_pool;
21798 VkCommandPoolCreateInfo pool_create_info{};
21799 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21800 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21801 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21802 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21803
21804 VkCommandBuffer command_buffer[2];
21805 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21806 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21807 command_buffer_allocate_info.commandPool = command_pool;
21808 command_buffer_allocate_info.commandBufferCount = 2;
21809 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21810 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21811
21812 {
21813 VkCommandBufferBeginInfo begin_info{};
21814 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21815 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21816
21817 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021818 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021819
21820 VkViewport viewport{};
21821 viewport.maxDepth = 1.0f;
21822 viewport.minDepth = 0.0f;
21823 viewport.width = 512;
21824 viewport.height = 512;
21825 viewport.x = 0;
21826 viewport.y = 0;
21827 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21828 vkEndCommandBuffer(command_buffer[0]);
21829 }
21830 {
21831 VkCommandBufferBeginInfo begin_info{};
21832 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21833 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21834
21835 VkViewport viewport{};
21836 viewport.maxDepth = 1.0f;
21837 viewport.minDepth = 0.0f;
21838 viewport.width = 512;
21839 viewport.height = 512;
21840 viewport.x = 0;
21841 viewport.y = 0;
21842 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21843 vkEndCommandBuffer(command_buffer[1]);
21844 }
21845 {
21846 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021847 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021848
21849 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21850 submit_info[0].pNext = NULL;
21851 submit_info[0].commandBufferCount = 1;
21852 submit_info[0].pCommandBuffers = &command_buffer[0];
21853 submit_info[0].signalSemaphoreCount = 1;
21854 submit_info[0].pSignalSemaphores = &semaphore;
21855 submit_info[0].waitSemaphoreCount = 0;
21856 submit_info[0].pWaitSemaphores = NULL;
21857 submit_info[0].pWaitDstStageMask = 0;
21858
21859 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21860 submit_info[1].pNext = NULL;
21861 submit_info[1].commandBufferCount = 1;
21862 submit_info[1].pCommandBuffers = &command_buffer[1];
21863 submit_info[1].waitSemaphoreCount = 1;
21864 submit_info[1].pWaitSemaphores = &semaphore;
21865 submit_info[1].pWaitDstStageMask = flags;
21866 submit_info[1].signalSemaphoreCount = 0;
21867 submit_info[1].pSignalSemaphores = NULL;
21868 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21869 }
21870
21871 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21872
21873 vkDestroyFence(m_device->device(), fence, nullptr);
21874 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21875 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21876 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21877
21878 m_errorMonitor->VerifyNotFound();
21879}
21880
21881TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21882 m_errorMonitor->ExpectSuccess();
21883
Tony Barbour1fa09702017-03-16 12:09:08 -060021884 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21886
Tony Barbour552f6c02016-12-21 14:34:07 -070021887 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021888
21889 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21890 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21891 m_errorMonitor->VerifyNotFound();
21892 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21893 m_errorMonitor->VerifyNotFound();
21894 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21895 m_errorMonitor->VerifyNotFound();
21896
21897 m_commandBuffer->EndCommandBuffer();
21898 m_errorMonitor->VerifyNotFound();
21899}
21900
21901TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021902 TEST_DESCRIPTION(
21903 "Positive test where we create a renderpass with an "
21904 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21905 "has a valid layout, and a second subpass then uses a "
21906 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021907 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021908 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021909 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021910 if (!depth_format) {
21911 printf(" No Depth + Stencil format found. Skipped.\n");
21912 return;
21913 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021914
21915 VkAttachmentReference attach[2] = {};
21916 attach[0].attachment = 0;
21917 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21918 attach[1].attachment = 0;
21919 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21920 VkSubpassDescription subpasses[2] = {};
21921 // First subpass clears DS attach on load
21922 subpasses[0].pDepthStencilAttachment = &attach[0];
21923 // 2nd subpass reads in DS as input attachment
21924 subpasses[1].inputAttachmentCount = 1;
21925 subpasses[1].pInputAttachments = &attach[1];
21926 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021927 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021928 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21929 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21930 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21931 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21932 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21933 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21934 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21935 VkRenderPassCreateInfo rpci = {};
21936 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21937 rpci.attachmentCount = 1;
21938 rpci.pAttachments = &attach_desc;
21939 rpci.subpassCount = 2;
21940 rpci.pSubpasses = subpasses;
21941
21942 // Now create RenderPass and verify no errors
21943 VkRenderPass rp;
21944 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21945 m_errorMonitor->VerifyNotFound();
21946
21947 vkDestroyRenderPass(m_device->device(), rp, NULL);
21948}
21949
Tobin Ehlis01103de2017-02-16 13:22:47 -070021950TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21951 TEST_DESCRIPTION(
21952 "Create a render pass with depth-stencil attachment where layout transition "
21953 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21954 "transition has correctly occurred at queue submit time with no validation errors.");
21955
Tony Barbour1fa09702017-03-16 12:09:08 -060021956 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021957 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021958 if (!depth_format) {
21959 printf(" No Depth + Stencil format found. Skipped.\n");
21960 return;
21961 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021962 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021963 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021964 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21965 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021966 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021967 return;
21968 }
21969
21970 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21972
21973 // A renderpass with one depth/stencil attachment.
21974 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021975 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021976 VK_SAMPLE_COUNT_1_BIT,
21977 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21978 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21979 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21980 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21981 VK_IMAGE_LAYOUT_UNDEFINED,
21982 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21983
21984 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21985
21986 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21987
21988 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21989
21990 VkRenderPass rp;
21991 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21992 ASSERT_VK_SUCCESS(err);
21993 // A compatible ds image.
21994 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021995 image.init(32, 32, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis01103de2017-02-16 13:22:47 -070021996 ASSERT_TRUE(image.initialized());
21997
21998 VkImageViewCreateInfo ivci = {
21999 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22000 nullptr,
22001 0,
22002 image.handle(),
22003 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022004 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022005 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22006 VK_COMPONENT_SWIZZLE_IDENTITY},
22007 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22008 };
22009 VkImageView view;
22010 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22011 ASSERT_VK_SUCCESS(err);
22012
22013 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22014 VkFramebuffer fb;
22015 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22016 ASSERT_VK_SUCCESS(err);
22017
22018 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22019 m_commandBuffer->BeginCommandBuffer();
22020 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22021 vkCmdEndRenderPass(m_commandBuffer->handle());
22022 m_commandBuffer->EndCommandBuffer();
22023 QueueCommandBuffer(false);
22024 m_errorMonitor->VerifyNotFound();
22025
22026 // Cleanup
22027 vkDestroyImageView(m_device->device(), view, NULL);
22028 vkDestroyRenderPass(m_device->device(), rp, NULL);
22029 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22030}
22031
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022032TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022033 TEST_DESCRIPTION(
22034 "Test that pipeline validation accepts matrices passed "
22035 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022036 m_errorMonitor->ExpectSuccess();
22037
Tony Barbour1fa09702017-03-16 12:09:08 -060022038 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022039 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22040
22041 VkVertexInputBindingDescription input_binding;
22042 memset(&input_binding, 0, sizeof(input_binding));
22043
22044 VkVertexInputAttributeDescription input_attribs[2];
22045 memset(input_attribs, 0, sizeof(input_attribs));
22046
22047 for (int i = 0; i < 2; i++) {
22048 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22049 input_attribs[i].location = i;
22050 }
22051
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022052 char const *vsSource =
22053 "#version 450\n"
22054 "\n"
22055 "layout(location=0) in mat2x4 x;\n"
22056 "out gl_PerVertex {\n"
22057 " vec4 gl_Position;\n"
22058 "};\n"
22059 "void main(){\n"
22060 " gl_Position = x[0] + x[1];\n"
22061 "}\n";
22062 char const *fsSource =
22063 "#version 450\n"
22064 "\n"
22065 "layout(location=0) out vec4 color;\n"
22066 "void main(){\n"
22067 " color = vec4(1);\n"
22068 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022069
22070 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22071 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22072
22073 VkPipelineObj pipe(m_device);
22074 pipe.AddColorAttachment();
22075 pipe.AddShader(&vs);
22076 pipe.AddShader(&fs);
22077
22078 pipe.AddVertexInputBindings(&input_binding, 1);
22079 pipe.AddVertexInputAttribs(input_attribs, 2);
22080
22081 VkDescriptorSetObj descriptorSet(m_device);
22082 descriptorSet.AppendDummy();
22083 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22084
22085 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22086
22087 /* expect success */
22088 m_errorMonitor->VerifyNotFound();
22089}
22090
22091TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22092 m_errorMonitor->ExpectSuccess();
22093
Tony Barbour1fa09702017-03-16 12:09:08 -060022094 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22096
22097 VkVertexInputBindingDescription input_binding;
22098 memset(&input_binding, 0, sizeof(input_binding));
22099
22100 VkVertexInputAttributeDescription input_attribs[2];
22101 memset(input_attribs, 0, sizeof(input_attribs));
22102
22103 for (int i = 0; i < 2; i++) {
22104 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22105 input_attribs[i].location = i;
22106 }
22107
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022108 char const *vsSource =
22109 "#version 450\n"
22110 "\n"
22111 "layout(location=0) in vec4 x[2];\n"
22112 "out gl_PerVertex {\n"
22113 " vec4 gl_Position;\n"
22114 "};\n"
22115 "void main(){\n"
22116 " gl_Position = x[0] + x[1];\n"
22117 "}\n";
22118 char const *fsSource =
22119 "#version 450\n"
22120 "\n"
22121 "layout(location=0) out vec4 color;\n"
22122 "void main(){\n"
22123 " color = vec4(1);\n"
22124 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022125
22126 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22127 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22128
22129 VkPipelineObj pipe(m_device);
22130 pipe.AddColorAttachment();
22131 pipe.AddShader(&vs);
22132 pipe.AddShader(&fs);
22133
22134 pipe.AddVertexInputBindings(&input_binding, 1);
22135 pipe.AddVertexInputAttribs(input_attribs, 2);
22136
22137 VkDescriptorSetObj descriptorSet(m_device);
22138 descriptorSet.AppendDummy();
22139 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22140
22141 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22142
22143 m_errorMonitor->VerifyNotFound();
22144}
22145
22146TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022147 TEST_DESCRIPTION(
22148 "Test that pipeline validation accepts consuming a vertex attribute "
22149 "through multiple vertex shader inputs, each consuming a different "
22150 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022151 m_errorMonitor->ExpectSuccess();
22152
Tony Barbour1fa09702017-03-16 12:09:08 -060022153 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022154 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22155
22156 VkVertexInputBindingDescription input_binding;
22157 memset(&input_binding, 0, sizeof(input_binding));
22158
22159 VkVertexInputAttributeDescription input_attribs[3];
22160 memset(input_attribs, 0, sizeof(input_attribs));
22161
22162 for (int i = 0; i < 3; i++) {
22163 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22164 input_attribs[i].location = i;
22165 }
22166
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022167 char const *vsSource =
22168 "#version 450\n"
22169 "\n"
22170 "layout(location=0) in vec4 x;\n"
22171 "layout(location=1) in vec3 y1;\n"
22172 "layout(location=1, component=3) in float y2;\n"
22173 "layout(location=2) in vec4 z;\n"
22174 "out gl_PerVertex {\n"
22175 " vec4 gl_Position;\n"
22176 "};\n"
22177 "void main(){\n"
22178 " gl_Position = x + vec4(y1, y2) + z;\n"
22179 "}\n";
22180 char const *fsSource =
22181 "#version 450\n"
22182 "\n"
22183 "layout(location=0) out vec4 color;\n"
22184 "void main(){\n"
22185 " color = vec4(1);\n"
22186 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022187
22188 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22189 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22190
22191 VkPipelineObj pipe(m_device);
22192 pipe.AddColorAttachment();
22193 pipe.AddShader(&vs);
22194 pipe.AddShader(&fs);
22195
22196 pipe.AddVertexInputBindings(&input_binding, 1);
22197 pipe.AddVertexInputAttribs(input_attribs, 3);
22198
22199 VkDescriptorSetObj descriptorSet(m_device);
22200 descriptorSet.AppendDummy();
22201 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22202
22203 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22204
22205 m_errorMonitor->VerifyNotFound();
22206}
22207
22208TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22209 m_errorMonitor->ExpectSuccess();
22210
Tony Barbour1fa09702017-03-16 12:09:08 -060022211 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22213
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022214 char const *vsSource =
22215 "#version 450\n"
22216 "out gl_PerVertex {\n"
22217 " vec4 gl_Position;\n"
22218 "};\n"
22219 "void main(){\n"
22220 " gl_Position = vec4(0);\n"
22221 "}\n";
22222 char const *fsSource =
22223 "#version 450\n"
22224 "\n"
22225 "layout(location=0) out vec4 color;\n"
22226 "void main(){\n"
22227 " color = vec4(1);\n"
22228 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022229
22230 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22231 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22232
22233 VkPipelineObj pipe(m_device);
22234 pipe.AddColorAttachment();
22235 pipe.AddShader(&vs);
22236 pipe.AddShader(&fs);
22237
22238 VkDescriptorSetObj descriptorSet(m_device);
22239 descriptorSet.AppendDummy();
22240 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22241
22242 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22243
22244 m_errorMonitor->VerifyNotFound();
22245}
22246
22247TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022248 TEST_DESCRIPTION(
22249 "Test that pipeline validation accepts the relaxed type matching rules "
22250 "set out in 14.1.3: fundamental type must match, and producer side must "
22251 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022252 m_errorMonitor->ExpectSuccess();
22253
22254 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22255
Tony Barbour1fa09702017-03-16 12:09:08 -060022256 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022257 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22258
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022259 char const *vsSource =
22260 "#version 450\n"
22261 "out gl_PerVertex {\n"
22262 " vec4 gl_Position;\n"
22263 "};\n"
22264 "layout(location=0) out vec3 x;\n"
22265 "layout(location=1) out ivec3 y;\n"
22266 "layout(location=2) out vec3 z;\n"
22267 "void main(){\n"
22268 " gl_Position = vec4(0);\n"
22269 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22270 "}\n";
22271 char const *fsSource =
22272 "#version 450\n"
22273 "\n"
22274 "layout(location=0) out vec4 color;\n"
22275 "layout(location=0) in float x;\n"
22276 "layout(location=1) flat in int y;\n"
22277 "layout(location=2) in vec2 z;\n"
22278 "void main(){\n"
22279 " color = vec4(1 + x + y + z.x);\n"
22280 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022281
22282 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22283 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22284
22285 VkPipelineObj pipe(m_device);
22286 pipe.AddColorAttachment();
22287 pipe.AddShader(&vs);
22288 pipe.AddShader(&fs);
22289
22290 VkDescriptorSetObj descriptorSet(m_device);
22291 descriptorSet.AppendDummy();
22292 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22293
22294 VkResult err = VK_SUCCESS;
22295 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22296 ASSERT_VK_SUCCESS(err);
22297
22298 m_errorMonitor->VerifyNotFound();
22299}
22300
22301TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022302 TEST_DESCRIPTION(
22303 "Test that pipeline validation accepts per-vertex variables "
22304 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022305 m_errorMonitor->ExpectSuccess();
22306
Tony Barbour1fa09702017-03-16 12:09:08 -060022307 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022308 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22309
22310 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022311 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022312 return;
22313 }
22314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022315 char const *vsSource =
22316 "#version 450\n"
22317 "void main(){}\n";
22318 char const *tcsSource =
22319 "#version 450\n"
22320 "layout(location=0) out int x[];\n"
22321 "layout(vertices=3) out;\n"
22322 "void main(){\n"
22323 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22324 " gl_TessLevelInner[0] = 1;\n"
22325 " x[gl_InvocationID] = gl_InvocationID;\n"
22326 "}\n";
22327 char const *tesSource =
22328 "#version 450\n"
22329 "layout(triangles, equal_spacing, cw) in;\n"
22330 "layout(location=0) in int x[];\n"
22331 "out gl_PerVertex { vec4 gl_Position; };\n"
22332 "void main(){\n"
22333 " gl_Position.xyz = gl_TessCoord;\n"
22334 " gl_Position.w = x[0] + x[1] + x[2];\n"
22335 "}\n";
22336 char const *fsSource =
22337 "#version 450\n"
22338 "layout(location=0) out vec4 color;\n"
22339 "void main(){\n"
22340 " color = vec4(1);\n"
22341 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022342
22343 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22344 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22345 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22346 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22347
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022348 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22349 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022350
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022351 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022352
22353 VkPipelineObj pipe(m_device);
22354 pipe.SetInputAssembly(&iasci);
22355 pipe.SetTessellation(&tsci);
22356 pipe.AddColorAttachment();
22357 pipe.AddShader(&vs);
22358 pipe.AddShader(&tcs);
22359 pipe.AddShader(&tes);
22360 pipe.AddShader(&fs);
22361
22362 VkDescriptorSetObj descriptorSet(m_device);
22363 descriptorSet.AppendDummy();
22364 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22365
22366 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22367
22368 m_errorMonitor->VerifyNotFound();
22369}
22370
22371TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022372 TEST_DESCRIPTION(
22373 "Test that pipeline validation accepts a user-defined "
22374 "interface block passed into the geometry shader. This "
22375 "is interesting because the 'extra' array level is not "
22376 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022377 m_errorMonitor->ExpectSuccess();
22378
Tony Barbour1fa09702017-03-16 12:09:08 -060022379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022380 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22381
22382 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022383 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022384 return;
22385 }
22386
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022387 char const *vsSource =
22388 "#version 450\n"
22389 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22390 "void main(){\n"
22391 " vs_out.x = vec4(1);\n"
22392 "}\n";
22393 char const *gsSource =
22394 "#version 450\n"
22395 "layout(triangles) in;\n"
22396 "layout(triangle_strip, max_vertices=3) out;\n"
22397 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22398 "out gl_PerVertex { vec4 gl_Position; };\n"
22399 "void main() {\n"
22400 " gl_Position = gs_in[0].x;\n"
22401 " EmitVertex();\n"
22402 "}\n";
22403 char const *fsSource =
22404 "#version 450\n"
22405 "layout(location=0) out vec4 color;\n"
22406 "void main(){\n"
22407 " color = vec4(1);\n"
22408 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022409
22410 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22411 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22412 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22413
22414 VkPipelineObj pipe(m_device);
22415 pipe.AddColorAttachment();
22416 pipe.AddShader(&vs);
22417 pipe.AddShader(&gs);
22418 pipe.AddShader(&fs);
22419
22420 VkDescriptorSetObj descriptorSet(m_device);
22421 descriptorSet.AppendDummy();
22422 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22423
22424 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22425
22426 m_errorMonitor->VerifyNotFound();
22427}
22428
22429TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022430 TEST_DESCRIPTION(
22431 "Test that pipeline validation accepts basic use of 64bit vertex "
22432 "attributes. This is interesting because they consume multiple "
22433 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022434 m_errorMonitor->ExpectSuccess();
22435
Tony Barbour1fa09702017-03-16 12:09:08 -060022436 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22438
22439 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022440 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022441 return;
22442 }
22443
22444 VkVertexInputBindingDescription input_bindings[1];
22445 memset(input_bindings, 0, sizeof(input_bindings));
22446
22447 VkVertexInputAttributeDescription input_attribs[4];
22448 memset(input_attribs, 0, sizeof(input_attribs));
22449 input_attribs[0].location = 0;
22450 input_attribs[0].offset = 0;
22451 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22452 input_attribs[1].location = 2;
22453 input_attribs[1].offset = 32;
22454 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22455 input_attribs[2].location = 4;
22456 input_attribs[2].offset = 64;
22457 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22458 input_attribs[3].location = 6;
22459 input_attribs[3].offset = 96;
22460 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22461
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022462 char const *vsSource =
22463 "#version 450\n"
22464 "\n"
22465 "layout(location=0) in dmat4 x;\n"
22466 "out gl_PerVertex {\n"
22467 " vec4 gl_Position;\n"
22468 "};\n"
22469 "void main(){\n"
22470 " gl_Position = vec4(x[0][0]);\n"
22471 "}\n";
22472 char const *fsSource =
22473 "#version 450\n"
22474 "\n"
22475 "layout(location=0) out vec4 color;\n"
22476 "void main(){\n"
22477 " color = vec4(1);\n"
22478 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022479
22480 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22481 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22482
22483 VkPipelineObj pipe(m_device);
22484 pipe.AddColorAttachment();
22485 pipe.AddShader(&vs);
22486 pipe.AddShader(&fs);
22487
22488 pipe.AddVertexInputBindings(input_bindings, 1);
22489 pipe.AddVertexInputAttribs(input_attribs, 4);
22490
22491 VkDescriptorSetObj descriptorSet(m_device);
22492 descriptorSet.AppendDummy();
22493 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22494
22495 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22496
22497 m_errorMonitor->VerifyNotFound();
22498}
22499
22500TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22501 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22502 m_errorMonitor->ExpectSuccess();
22503
Tony Barbour1fa09702017-03-16 12:09:08 -060022504 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022506 char const *vsSource =
22507 "#version 450\n"
22508 "\n"
22509 "out gl_PerVertex {\n"
22510 " vec4 gl_Position;\n"
22511 "};\n"
22512 "void main(){\n"
22513 " gl_Position = vec4(1);\n"
22514 "}\n";
22515 char const *fsSource =
22516 "#version 450\n"
22517 "\n"
22518 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22519 "layout(location=0) out vec4 color;\n"
22520 "void main() {\n"
22521 " color = subpassLoad(x);\n"
22522 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022523
22524 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22525 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22526
22527 VkPipelineObj pipe(m_device);
22528 pipe.AddShader(&vs);
22529 pipe.AddShader(&fs);
22530 pipe.AddColorAttachment();
22531 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22532
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022533 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22534 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022535 VkDescriptorSetLayout dsl;
22536 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22537 ASSERT_VK_SUCCESS(err);
22538
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022539 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022540 VkPipelineLayout pl;
22541 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22542 ASSERT_VK_SUCCESS(err);
22543
22544 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022545 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22546 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22547 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22548 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22549 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022550 };
22551 VkAttachmentReference color = {
22552 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22553 };
22554 VkAttachmentReference input = {
22555 1, VK_IMAGE_LAYOUT_GENERAL,
22556 };
22557
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022558 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022559
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022560 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022561 VkRenderPass rp;
22562 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22563 ASSERT_VK_SUCCESS(err);
22564
22565 // should be OK. would go wrong here if it's going to...
22566 pipe.CreateVKPipeline(pl, rp);
22567
22568 m_errorMonitor->VerifyNotFound();
22569
22570 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22571 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22572 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22573}
22574
22575TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022576 TEST_DESCRIPTION(
22577 "Test that pipeline validation accepts a compute pipeline which declares a "
22578 "descriptor-backed resource which is not provided, but the shader does not "
22579 "statically use it. This is interesting because it requires compute pipelines "
22580 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022581 m_errorMonitor->ExpectSuccess();
22582
Tony Barbour1fa09702017-03-16 12:09:08 -060022583 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022584
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022585 char const *csSource =
22586 "#version 450\n"
22587 "\n"
22588 "layout(local_size_x=1) in;\n"
22589 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22590 "void main(){\n"
22591 " // x is not used.\n"
22592 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022593
22594 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22595
22596 VkDescriptorSetObj descriptorSet(m_device);
22597 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22598
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022599 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22600 nullptr,
22601 0,
22602 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22603 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22604 descriptorSet.GetPipelineLayout(),
22605 VK_NULL_HANDLE,
22606 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022607
22608 VkPipeline pipe;
22609 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22610
22611 m_errorMonitor->VerifyNotFound();
22612
22613 if (err == VK_SUCCESS) {
22614 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22615 }
22616}
22617
22618TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022619 TEST_DESCRIPTION(
22620 "Test that pipeline validation accepts a shader consuming only the "
22621 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022622 m_errorMonitor->ExpectSuccess();
22623
Tony Barbour1fa09702017-03-16 12:09:08 -060022624 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022625
22626 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022627 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22628 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22629 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022630 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022631 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022632 VkDescriptorSetLayout dsl;
22633 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22634 ASSERT_VK_SUCCESS(err);
22635
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022636 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022637 VkPipelineLayout pl;
22638 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22639 ASSERT_VK_SUCCESS(err);
22640
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022641 char const *csSource =
22642 "#version 450\n"
22643 "\n"
22644 "layout(local_size_x=1) in;\n"
22645 "layout(set=0, binding=0) uniform sampler s;\n"
22646 "layout(set=0, binding=1) uniform texture2D t;\n"
22647 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22648 "void main() {\n"
22649 " x = texture(sampler2D(t, s), vec2(0));\n"
22650 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022651 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22652
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022653 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22654 nullptr,
22655 0,
22656 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22657 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22658 pl,
22659 VK_NULL_HANDLE,
22660 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022661
22662 VkPipeline pipe;
22663 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22664
22665 m_errorMonitor->VerifyNotFound();
22666
22667 if (err == VK_SUCCESS) {
22668 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22669 }
22670
22671 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22672 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22673}
22674
22675TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022676 TEST_DESCRIPTION(
22677 "Test that pipeline validation accepts a shader consuming only the "
22678 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022679 m_errorMonitor->ExpectSuccess();
22680
Tony Barbour1fa09702017-03-16 12:09:08 -060022681 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022682
22683 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022684 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22685 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22686 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022687 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022688 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022689 VkDescriptorSetLayout dsl;
22690 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22691 ASSERT_VK_SUCCESS(err);
22692
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022693 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022694 VkPipelineLayout pl;
22695 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22696 ASSERT_VK_SUCCESS(err);
22697
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022698 char const *csSource =
22699 "#version 450\n"
22700 "\n"
22701 "layout(local_size_x=1) in;\n"
22702 "layout(set=0, binding=0) uniform texture2D t;\n"
22703 "layout(set=0, binding=1) uniform sampler s;\n"
22704 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22705 "void main() {\n"
22706 " x = texture(sampler2D(t, s), vec2(0));\n"
22707 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022708 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22709
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022710 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22711 nullptr,
22712 0,
22713 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22714 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22715 pl,
22716 VK_NULL_HANDLE,
22717 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022718
22719 VkPipeline pipe;
22720 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22721
22722 m_errorMonitor->VerifyNotFound();
22723
22724 if (err == VK_SUCCESS) {
22725 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22726 }
22727
22728 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22729 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22730}
22731
22732TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022733 TEST_DESCRIPTION(
22734 "Test that pipeline validation accepts a shader consuming "
22735 "both the sampler and the image of a combined image+sampler "
22736 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022737 m_errorMonitor->ExpectSuccess();
22738
Tony Barbour1fa09702017-03-16 12:09:08 -060022739 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022740
22741 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022742 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22743 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022744 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022745 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022746 VkDescriptorSetLayout dsl;
22747 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22748 ASSERT_VK_SUCCESS(err);
22749
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022750 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022751 VkPipelineLayout pl;
22752 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22753 ASSERT_VK_SUCCESS(err);
22754
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022755 char const *csSource =
22756 "#version 450\n"
22757 "\n"
22758 "layout(local_size_x=1) in;\n"
22759 "layout(set=0, binding=0) uniform texture2D t;\n"
22760 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22761 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22762 "void main() {\n"
22763 " x = texture(sampler2D(t, s), vec2(0));\n"
22764 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022765 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22766
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022767 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22768 nullptr,
22769 0,
22770 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22771 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22772 pl,
22773 VK_NULL_HANDLE,
22774 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022775
22776 VkPipeline pipe;
22777 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22778
22779 m_errorMonitor->VerifyNotFound();
22780
22781 if (err == VK_SUCCESS) {
22782 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22783 }
22784
22785 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22786 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22787}
22788
Tony Barbour3ed87a02017-03-15 16:19:02 -060022789TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022790 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22791
Tony Barbour3ed87a02017-03-15 16:19:02 -060022792 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022793 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022794
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022795 // Ensure that extension is available and enabled.
22796 uint32_t extension_count = 0;
22797 bool supports_maintenance1_extension = false;
22798 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22799 ASSERT_VK_SUCCESS(err);
22800 if (extension_count > 0) {
22801 std::vector<VkExtensionProperties> available_extensions(extension_count);
22802
22803 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22804 ASSERT_VK_SUCCESS(err);
22805 for (const auto &extension_props : available_extensions) {
22806 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22807 supports_maintenance1_extension = true;
22808 }
22809 }
22810 }
22811
Dave Houlton0ba0fdf2017-03-29 12:05:26 -060022812 // Destroy the first instance
22813 ShutdownFramework();
22814
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022815 // Proceed if extension is supported by hardware
22816 if (!supports_maintenance1_extension) {
22817 printf(" Maintenance1 Extension not supported, skipping tests\n");
22818 return;
22819 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022820
22821 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060022822 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022823 VkCommandBuffer cmd_buf;
22824 VkCommandBufferAllocateInfo alloc_info;
22825 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22826 alloc_info.pNext = NULL;
22827 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022828 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022829 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22830 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22831
22832 VkCommandBufferBeginInfo cb_binfo;
22833 cb_binfo.pNext = NULL;
22834 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22835 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22836 cb_binfo.flags = 0;
22837 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22838 // Set Negative height, should give error if Maintenance 1 is not enabled
22839 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22840 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22841 vkEndCommandBuffer(cmd_buf);
22842
22843 m_errorMonitor->VerifyNotFound();
22844}
22845
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060022846TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
22847 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
22848
22849 ASSERT_NO_FATAL_FAILURE(Init());
22850
22851 uint32_t extension_count = 0;
22852 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22853 ASSERT_VK_SUCCESS(err);
22854
22855 if (extension_count > 0) {
22856 std::vector<VkExtensionProperties> available_extensions(extension_count);
22857 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22858 ASSERT_VK_SUCCESS(err);
22859
22860 for (const auto &extension_props : available_extensions) {
22861 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22862 // Create two pNext structures which by themselves would be valid
22863 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22864 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
22865 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22866 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
22867 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22868
22869 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22870 dedicated_buffer_create_info_2.pNext = nullptr;
22871 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
22872
22873 uint32_t queue_family_index = 0;
22874 VkBufferCreateInfo buffer_create_info = {};
22875 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22876 buffer_create_info.pNext = &dedicated_buffer_create_info;
22877 buffer_create_info.size = 1024;
22878 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22879 buffer_create_info.queueFamilyIndexCount = 1;
22880 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22881
22882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
22883 VkBuffer buffer;
22884 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
22885 m_errorMonitor->VerifyFound();
22886 }
22887 }
22888 }
22889}
22890
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022891TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22892 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22893
Tony Barbour1fa09702017-03-16 12:09:08 -060022894 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022895
22896 // Positive test to check parameter_validation and unique_objects support
22897 // for NV_dedicated_allocation
22898 uint32_t extension_count = 0;
22899 bool supports_nv_dedicated_allocation = false;
22900 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22901 ASSERT_VK_SUCCESS(err);
22902
22903 if (extension_count > 0) {
22904 std::vector<VkExtensionProperties> available_extensions(extension_count);
22905
22906 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22907 ASSERT_VK_SUCCESS(err);
22908
22909 for (const auto &extension_props : available_extensions) {
22910 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22911 supports_nv_dedicated_allocation = true;
22912 }
22913 }
22914 }
22915
22916 if (supports_nv_dedicated_allocation) {
22917 m_errorMonitor->ExpectSuccess();
22918
22919 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22920 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22921 dedicated_buffer_create_info.pNext = nullptr;
22922 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22923
22924 uint32_t queue_family_index = 0;
22925 VkBufferCreateInfo buffer_create_info = {};
22926 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22927 buffer_create_info.pNext = &dedicated_buffer_create_info;
22928 buffer_create_info.size = 1024;
22929 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22930 buffer_create_info.queueFamilyIndexCount = 1;
22931 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22932
22933 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022934 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022935 ASSERT_VK_SUCCESS(err);
22936
22937 VkMemoryRequirements memory_reqs;
22938 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22939
22940 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22941 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22942 dedicated_memory_info.pNext = nullptr;
22943 dedicated_memory_info.buffer = buffer;
22944 dedicated_memory_info.image = VK_NULL_HANDLE;
22945
22946 VkMemoryAllocateInfo memory_info = {};
22947 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22948 memory_info.pNext = &dedicated_memory_info;
22949 memory_info.allocationSize = memory_reqs.size;
22950
22951 bool pass;
22952 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22953 ASSERT_TRUE(pass);
22954
22955 VkDeviceMemory buffer_memory;
22956 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22957 ASSERT_VK_SUCCESS(err);
22958
22959 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22960 ASSERT_VK_SUCCESS(err);
22961
22962 vkDestroyBuffer(m_device->device(), buffer, NULL);
22963 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22964
22965 m_errorMonitor->VerifyNotFound();
22966 }
22967}
22968
22969TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22970 VkResult err;
22971
22972 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22973
Tony Barbour1fa09702017-03-16 12:09:08 -060022974 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022975 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22976
22977 std::vector<const char *> device_extension_names;
22978 auto features = m_device->phy().features();
22979 // Artificially disable support for non-solid fill modes
22980 features.fillModeNonSolid = false;
22981 // The sacrificial device object
22982 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22983
22984 VkRenderpassObj render_pass(&test_device);
22985
22986 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22987 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22988 pipeline_layout_ci.setLayoutCount = 0;
22989 pipeline_layout_ci.pSetLayouts = NULL;
22990
22991 VkPipelineLayout pipeline_layout;
22992 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22993 ASSERT_VK_SUCCESS(err);
22994
22995 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22996 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22997 rs_ci.pNext = nullptr;
22998 rs_ci.lineWidth = 1.0f;
22999 rs_ci.rasterizerDiscardEnable = true;
23000
23001 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23002 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23003
23004 // Set polygonMode=FILL. No error is expected
23005 m_errorMonitor->ExpectSuccess();
23006 {
23007 VkPipelineObj pipe(&test_device);
23008 pipe.AddShader(&vs);
23009 pipe.AddShader(&fs);
23010 pipe.AddColorAttachment();
23011 // Set polygonMode to a good value
23012 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23013 pipe.SetRasterization(&rs_ci);
23014 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23015 }
23016 m_errorMonitor->VerifyNotFound();
23017
23018 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23019}
23020
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023021#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023022TEST_F(VkPositiveLayerTest, LongFenceChain)
23023{
23024 m_errorMonitor->ExpectSuccess();
23025
Tony Barbour1fa09702017-03-16 12:09:08 -060023026 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023027 VkResult err;
23028
23029 std::vector<VkFence> fences;
23030
23031 const int chainLength = 32768;
23032
23033 for (int i = 0; i < chainLength; i++) {
23034 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23035 VkFence fence;
23036 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23037 ASSERT_VK_SUCCESS(err);
23038
23039 fences.push_back(fence);
23040
23041 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23042 0, nullptr, 0, nullptr };
23043 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23044 ASSERT_VK_SUCCESS(err);
23045
23046 }
23047
23048 // BOOM, stack overflow.
23049 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23050
23051 for (auto fence : fences)
23052 vkDestroyFence(m_device->device(), fence, nullptr);
23053
23054 m_errorMonitor->VerifyNotFound();
23055}
23056#endif
23057
Cody Northrop1242dfd2016-07-13 17:24:59 -060023058#if defined(ANDROID) && defined(VALIDATION_APK)
23059static bool initialized = false;
23060static bool active = false;
23061
23062// Convert Intents to argv
23063// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023064std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023065 std::vector<std::string> args;
23066 JavaVM &vm = *app.activity->vm;
23067 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023068 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023069
23070 JNIEnv &env = *p_env;
23071 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023072 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023073 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023074 jmethodID get_string_extra_method =
23075 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023076 jvalue get_string_extra_args;
23077 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023078 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023079
23080 std::string args_str;
23081 if (extra_str) {
23082 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23083 args_str = extra_utf;
23084 env.ReleaseStringUTFChars(extra_str, extra_utf);
23085 env.DeleteLocalRef(extra_str);
23086 }
23087
23088 env.DeleteLocalRef(get_string_extra_args.l);
23089 env.DeleteLocalRef(intent);
23090 vm.DetachCurrentThread();
23091
23092 // split args_str
23093 std::stringstream ss(args_str);
23094 std::string arg;
23095 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023096 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023097 }
23098
23099 return args;
23100}
23101
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023102static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023103
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023104static void processCommand(struct android_app *app, int32_t cmd) {
23105 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023106 case APP_CMD_INIT_WINDOW: {
23107 if (app->window) {
23108 initialized = true;
23109 }
23110 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023111 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023112 case APP_CMD_GAINED_FOCUS: {
23113 active = true;
23114 break;
23115 }
23116 case APP_CMD_LOST_FOCUS: {
23117 active = false;
23118 break;
23119 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023120 }
23121}
23122
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023123void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023124 app_dummy();
23125
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023126 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023127
23128 int vulkanSupport = InitVulkan();
23129 if (vulkanSupport == 0) {
23130 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23131 return;
23132 }
23133
23134 app->onAppCmd = processCommand;
23135 app->onInputEvent = processInput;
23136
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023137 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023138 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023139 struct android_poll_source *source;
23140 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023141 if (source) {
23142 source->process(app, source);
23143 }
23144
23145 if (app->destroyRequested != 0) {
23146 VkTestFramework::Finish();
23147 return;
23148 }
23149 }
23150
23151 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023152 // Use the following key to send arguments to gtest, i.e.
23153 // --es args "--gtest_filter=-VkLayerTest.foo"
23154 const char key[] = "args";
23155 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023156
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023157 std::string filter = "";
23158 if (args.size() > 0) {
23159 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23160 filter += args[0];
23161 } else {
23162 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23163 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023164
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023165 int argc = 2;
23166 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23167 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023168
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023169 // Route output to files until we can override the gtest output
23170 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23171 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023172
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023173 ::testing::InitGoogleTest(&argc, argv);
23174 VkTestFramework::InitArgs(&argc, argv);
23175 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023176
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023177 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023178
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023179 if (result != 0) {
23180 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23181 } else {
23182 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23183 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023184
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023185 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023186
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023187 fclose(stdout);
23188 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023189
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023190 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023191 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023192 }
23193 }
23194}
23195#endif
23196
Tony Barbour300a6082015-04-07 13:44:53 -060023197int main(int argc, char **argv) {
23198 int result;
23199
Cody Northrop8e54a402016-03-08 22:25:52 -070023200#ifdef ANDROID
23201 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023202 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023203#endif
23204
Tony Barbour300a6082015-04-07 13:44:53 -060023205 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023206 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023207
23208 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23209
23210 result = RUN_ALL_TESTS();
23211
Tony Barbour6918cd52015-04-09 12:58:51 -060023212 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023213 return result;
23214}