blob: f6ed159964540066c64b896995eaa343cfc85558 [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()) {
Dave Houltonc85c4a82017-04-25 15:56:45 -0600341#ifdef _DEBUG
342 char embedded_code_string[2048];
343 snprintf(embedded_code_string, 2048, "%s [%05d]", pMsg, msgCode);
344 return errMonitor->CheckForDesiredMsg(msgCode, embedded_code_string);
345#else
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600346 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Dave Houltonc85c4a82017-04-25 15:56:45 -0600347#endif
Tony Barbour0b4d9562015-04-09 10:48:04 -0600348 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600349 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600350}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500351
Karl Schultz6addd812016-02-02 17:17:23 -0700352class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700353 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600354 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
355 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700356 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600357 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
358 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700359 }
Tony Barbour300a6082015-04-07 13:44:53 -0600360
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600361 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
362 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700363 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600364 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700365 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600366 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700367 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600368 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
369 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
370 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700371 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
372 }
373 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
374 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
375 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600376 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
377 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
378 InitState(features, flags);
379 }
380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700381 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700382 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600384 std::vector<const char *> instance_layer_names;
385 std::vector<const char *> instance_extension_names;
386 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600387
388 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700389 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600390 /*
391 * Since CreateDbgMsgCallback is an instance level extension call
392 * any extension / layer that utilizes that feature also needs
393 * to be enabled at create instance time.
394 */
Karl Schultz6addd812016-02-02 17:17:23 -0700395 // Use Threading layer first to protect others from
396 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700397 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600398 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800399 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700400 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600401 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700402 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600403
Ian Elliott2c1daf52016-05-12 09:41:46 -0600404 if (m_enableWSI) {
405 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
406 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
407#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
408#if defined(VK_USE_PLATFORM_ANDROID_KHR)
409 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_MIR_KHR)
412 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600414#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
415 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700416#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600417#if defined(VK_USE_PLATFORM_WIN32_KHR)
418 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_WIN32_KHR
420#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600421#if defined(VK_USE_PLATFORM_XCB_KHR)
422 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
423#elif defined(VK_USE_PLATFORM_XLIB_KHR)
424 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700425#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600426 }
427
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600428 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600429 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800430 this->app_info.pApplicationName = "layer_tests";
431 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600432 this->app_info.pEngineName = "unittest";
433 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600434 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600435
Tony Barbour15524c32015-04-29 17:34:29 -0600436 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
438
439 virtual void TearDown() {
440 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600441 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600442 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600443 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600444
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600445 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600446};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500447
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600448void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500449 // Create identity matrix
450 int i;
451 struct vktriangle_vs_uniform data;
452
453 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700454 glm::mat4 View = glm::mat4(1.0f);
455 glm::mat4 Model = glm::mat4(1.0f);
456 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700458 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500459
460 memcpy(&data.mvp, &MVP[0][0], matrixSize);
461
Karl Schultz6addd812016-02-02 17:17:23 -0700462 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600463 {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 -0500464 };
465
Karl Schultz6addd812016-02-02 17:17:23 -0700466 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500467 data.position[i][0] = tri_data[i].posX;
468 data.position[i][1] = tri_data[i].posY;
469 data.position[i][2] = tri_data[i].posZ;
470 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700471 data.color[i][0] = tri_data[i].r;
472 data.color[i][1] = tri_data[i].g;
473 data.color[i][2] = tri_data[i].b;
474 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475 }
476
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500477 ASSERT_NO_FATAL_FAILURE(InitViewport());
478
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200479 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
480 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481
Karl Schultz6addd812016-02-02 17:17:23 -0700482 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600483 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500484
485 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800486 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500487 pipelineobj.AddShader(&vs);
488 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 if (failMask & BsoFailLineWidth) {
490 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600491 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600492 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
494 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600495 }
496 if (failMask & BsoFailDepthBias) {
497 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600498 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600499 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600500 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600501 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600502 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600503 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700504 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700505 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600506 if (failMask & BsoFailViewport) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
508 }
509 if (failMask & BsoFailScissor) {
510 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
511 }
512 if (failMask & BsoFailBlend) {
513 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600514 VkPipelineColorBlendAttachmentState att_state = {};
515 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
516 att_state.blendEnable = VK_TRUE;
517 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600518 }
519 if (failMask & BsoFailDepthBounds) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
521 }
522 if (failMask & BsoFailStencilReadMask) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
524 }
525 if (failMask & BsoFailStencilWriteMask) {
526 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
527 }
528 if (failMask & BsoFailStencilReference) {
529 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
530 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500531
532 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600533 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700536 m_commandBuffer->BeginCommandBuffer();
537 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538
Tony Barbourfe3351b2015-07-28 10:17:20 -0600539 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500540
541 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600542 if (failMask & BsoFailIndexBuffer) {
543 // Use DrawIndexed w/o an index buffer bound
544 DrawIndexed(3, 1, 0, 0, 0);
545 } else {
546 Draw(3, 1, 0, 0);
547 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500548
Mark Muellerd4914412016-06-13 17:52:06 -0600549 if (failMask & BsoFailCmdClearAttachments) {
550 VkClearAttachment color_attachment = {};
551 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700552 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600553 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
554
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600555 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600556 }
557
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500558 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700559 m_commandBuffer->EndRenderPass();
560 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600561 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562}
563
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600564void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
565 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500566 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600567 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500568 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600569 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500570 }
571
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800572 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700573 // Make sure depthWriteEnable is set so that Depth fail test will work
574 // correctly
575 // Make sure stencilTestEnable is set so that Stencil fail test will work
576 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600577 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800578 stencil.failOp = VK_STENCIL_OP_KEEP;
579 stencil.passOp = VK_STENCIL_OP_KEEP;
580 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
581 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600582
583 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
584 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600585 ds_ci.pNext = NULL;
586 ds_ci.depthTestEnable = VK_FALSE;
587 ds_ci.depthWriteEnable = VK_TRUE;
588 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
589 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600590 if (failMask & BsoFailDepthBounds) {
591 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600592 ds_ci.maxDepthBounds = 0.0f;
593 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600594 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600595 ds_ci.stencilTestEnable = VK_TRUE;
596 ds_ci.front = stencil;
597 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600598
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600599 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600600 pipelineobj.SetViewport(m_viewports);
601 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800602 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600603 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600604 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800605 commandBuffer->BindPipeline(pipelineobj);
606 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500607}
608
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600609class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700610 public:
611 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600612};
613
Ian Elliott2c1daf52016-05-12 09:41:46 -0600614class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
616 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600617 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600618};
619
Mark Muellerdfe37552016-07-07 14:47:42 -0600620class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700621 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600622 enum eTestEnFlags {
623 eDoubleDelete,
624 eInvalidDeviceOffset,
625 eInvalidMemoryOffset,
626 eBindNullBuffer,
627 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600628 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 };
630
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600631 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600632
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
634 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600635 return true;
636 }
637 VkDeviceSize offset_limit = 0;
638 if (eInvalidMemoryOffset == aTestFlag) {
639 VkBuffer vulkanBuffer;
640 VkBufferCreateInfo buffer_create_info = {};
641 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
642 buffer_create_info.size = 32;
643 buffer_create_info.usage = aBufferUsage;
644
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600646 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600647
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
650 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600651 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
652 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600653 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600654 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600655 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600656 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600657 }
658 if (eOffsetAlignment < offset_limit) {
659 return true;
660 }
661 return false;
662 }
663
664 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
666 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (eBindNullBuffer == aTestFlag) {
668 VulkanMemory = 0;
669 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
670 } else {
671 VkBufferCreateInfo buffer_create_info = {};
672 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
673 buffer_create_info.size = 32;
674 buffer_create_info.usage = aBufferUsage;
675
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600676 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677
678 CreateCurrent = true;
679
680 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600681 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682
683 VkMemoryAllocateInfo memory_allocate_info = {};
684 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800685 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600686 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
687 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 if (!pass) {
689 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
690 return;
691 }
692
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600693 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600694 AllocateCurrent = true;
695 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600696 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
697 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 BoundCurrent = true;
699
700 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
701 }
702 }
703
704 ~VkBufferTest() {
705 if (CreateCurrent) {
706 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
707 }
708 if (AllocateCurrent) {
709 if (InvalidDeleteEn) {
710 union {
711 VkDeviceMemory device_memory;
712 unsigned long long index_access;
713 } bad_index;
714
715 bad_index.device_memory = VulkanMemory;
716 bad_index.index_access++;
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600719 }
720 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
721 }
722 }
723
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600724 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600725
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600727
728 void TestDoubleDestroy() {
729 // Destroy the buffer but leave the flag set, which will cause
730 // the buffer to be destroyed again in the destructor.
731 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
732 }
733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700734 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600735 bool AllocateCurrent;
736 bool BoundCurrent;
737 bool CreateCurrent;
738 bool InvalidDeleteEn;
739
740 VkBuffer VulkanBuffer;
741 VkDevice VulkanDevice;
742 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600743};
744
745class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700746 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600748 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700749 : BoundCurrent(false),
750 AttributeCount(aAttributeCount),
751 BindingCount(aBindingCount),
752 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600753 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600754 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
755 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700756 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600757
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600758 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
759 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600761 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
762 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
763 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
764 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
765 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600766
767 unsigned i = 0;
768 do {
769 VertexInputAttributeDescription[i].binding = BindId;
770 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
772 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 i++;
774 } while (AttributeCount < i);
775
776 i = 0;
777 do {
778 VertexInputBindingDescription[i].binding = BindId;
779 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600780 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600781 i++;
782 } while (BindingCount < i);
783 }
784
785 ~VkVerticesObj() {
786 if (VertexInputAttributeDescription) {
787 delete[] VertexInputAttributeDescription;
788 }
789 if (VertexInputBindingDescription) {
790 delete[] VertexInputBindingDescription;
791 }
792 }
793
794 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
796 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 return true;
798 }
799
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600800 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600801 VkDeviceSize *offsetList;
802 unsigned offsetCount;
803
804 if (aOffsetCount) {
805 offsetList = aOffsetList;
806 offsetCount = aOffsetCount;
807 } else {
808 offsetList = new VkDeviceSize[1]();
809 offsetCount = 1;
810 }
811
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600812 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600813 BoundCurrent = true;
814
815 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600816 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600817 }
818 }
819
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700820 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600821 static uint32_t BindIdGenerator;
822
823 bool BoundCurrent;
824 unsigned AttributeCount;
825 unsigned BindingCount;
826 uint32_t BindId;
827
828 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
829 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
830 VkVertexInputBindingDescription *VertexInputBindingDescription;
831 VkConstantBufferObj VulkanMemoryBuffer;
832};
833
834uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500835// ********************************************************************************************************************
836// ********************************************************************************************************************
837// ********************************************************************************************************************
838// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700840 TEST_DESCRIPTION(
841 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
842 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600843
Tony Barbour1fa09702017-03-16 12:09:08 -0600844 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a pointer to a handle
848 // Expected to trigger an error with
849 // parameter_validation::validate_required_pointer
850 vkGetPhysicalDeviceFeatures(gpu(), NULL);
851 m_errorMonitor->VerifyFound();
852
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
854 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify NULL for pointer to array count
856 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600857 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 m_errorMonitor->VerifyFound();
859
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify 0 for a required array count
862 // Expected to trigger an error with parameter_validation::validate_array
863 VkViewport view_port = {};
864 m_commandBuffer->SetViewport(0, 0, &view_port);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify NULL for a required array
869 // Expected to trigger an error with parameter_validation::validate_array
870 m_commandBuffer->SetViewport(0, 1, NULL);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify VK_NULL_HANDLE for a required handle
875 // Expected to trigger an error with
876 // parameter_validation::validate_required_handle
877 vkUnmapMemory(device(), VK_NULL_HANDLE);
878 m_errorMonitor->VerifyFound();
879
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
881 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600882 // Specify VK_NULL_HANDLE for a required handle array entry
883 // Expected to trigger an error with
884 // parameter_validation::validate_required_handle_array
885 VkFence fence = VK_NULL_HANDLE;
886 vkResetFences(device(), 1, &fence);
887 m_errorMonitor->VerifyFound();
888
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600890 // Specify NULL for a required struct pointer
891 // Expected to trigger an error with
892 // parameter_validation::validate_struct_type
893 VkDeviceMemory memory = VK_NULL_HANDLE;
894 vkAllocateMemory(device(), NULL, NULL, &memory);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags parameter
899 // Expected to trigger an error with parameter_validation::validate_flags
900 m_commandBuffer->SetStencilReference(0, 0);
901 m_errorMonitor->VerifyFound();
902
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600903 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 -0600904 // Specify 0 for a required VkFlags array entry
905 // Expected to trigger an error with
906 // parameter_validation::validate_flags_array
907 VkSemaphore semaphore = VK_NULL_HANDLE;
908 VkPipelineStageFlags stageFlags = 0;
909 VkSubmitInfo submitInfo = {};
910 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
911 submitInfo.waitSemaphoreCount = 1;
912 submitInfo.pWaitSemaphores = &semaphore;
913 submitInfo.pWaitDstStageMask = &stageFlags;
914 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
915 m_errorMonitor->VerifyFound();
916}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600917
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918TEST_F(VkLayerTest, ReservedParameter) {
919 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
920
Tony Barbour1fa09702017-03-16 12:09:08 -0600921 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600922
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600924 // Specify 0 for a reserved VkFlags parameter
925 // Expected to trigger an error with
926 // parameter_validation::validate_reserved_flags
927 VkEvent event_handle = VK_NULL_HANDLE;
928 VkEventCreateInfo event_info = {};
929 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
930 event_info.flags = 1;
931 vkCreateEvent(device(), &event_info, NULL, &event_handle);
932 m_errorMonitor->VerifyFound();
933}
934
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700936 TEST_DESCRIPTION(
937 "Specify an invalid VkStructureType for a Vulkan "
938 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600939
Tony Barbour1fa09702017-03-16 12:09:08 -0600940 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600941
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943 // Zero struct memory, effectively setting sType to
944 // VK_STRUCTURE_TYPE_APPLICATION_INFO
945 // Expected to trigger an error with
946 // parameter_validation::validate_struct_type
947 VkMemoryAllocateInfo alloc_info = {};
948 VkDeviceMemory memory = VK_NULL_HANDLE;
949 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
950 m_errorMonitor->VerifyFound();
951
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600953 // Zero struct memory, effectively setting sType to
954 // VK_STRUCTURE_TYPE_APPLICATION_INFO
955 // Expected to trigger an error with
956 // parameter_validation::validate_struct_type_array
957 VkSubmitInfo submit_info = {};
958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
959 m_errorMonitor->VerifyFound();
960}
961
962TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600963 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600964
Tony Barbour1fa09702017-03-16 12:09:08 -0600965 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600966
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600968 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600969 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600970 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600971 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600972 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600973 // Zero-initialization will provide the correct sType
974 VkApplicationInfo app_info = {};
975 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
976 event_alloc_info.pNext = &app_info;
977 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
978 m_errorMonitor->VerifyFound();
979
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
981 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600982 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
983 // a function that has allowed pNext structure types and specify
984 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600985 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600987 VkMemoryAllocateInfo memory_alloc_info = {};
988 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
989 memory_alloc_info.pNext = &app_info;
990 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600991 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600992}
Dustin Graves5d33d532016-05-09 16:21:12 -0600993
994TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600995 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600996
Tony Barbour1fa09702017-03-16 12:09:08 -0600997 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600998
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1000 "does not fall within the begin..end "
1001 "range of the core VkFormat "
1002 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 // Specify an invalid VkFormat value
1004 // Expected to trigger an error with
1005 // parameter_validation::validate_ranged_enum
1006 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001007 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001008 m_errorMonitor->VerifyFound();
1009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001010 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 -06001011 // Specify an invalid VkFlags bitmask value
1012 // Expected to trigger an error with parameter_validation::validate_flags
1013 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001014 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1015 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001016 m_errorMonitor->VerifyFound();
1017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001018 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 -06001019 // Specify an invalid VkFlags array entry
1020 // Expected to trigger an error with
1021 // parameter_validation::validate_flags_array
1022 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001023 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001024 VkSubmitInfo submit_info = {};
1025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1026 submit_info.waitSemaphoreCount = 1;
1027 submit_info.pWaitSemaphores = &semaphore;
1028 submit_info.pWaitDstStageMask = &stage_flags;
1029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1030 m_errorMonitor->VerifyFound();
1031
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001032 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001033 // Specify an invalid VkBool32 value
1034 // Expected to trigger a warning with
1035 // parameter_validation::validate_bool32
1036 VkSampler sampler = VK_NULL_HANDLE;
1037 VkSamplerCreateInfo sampler_info = {};
1038 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1039 sampler_info.pNext = NULL;
1040 sampler_info.magFilter = VK_FILTER_NEAREST;
1041 sampler_info.minFilter = VK_FILTER_NEAREST;
1042 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1043 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1044 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1045 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1046 sampler_info.mipLodBias = 1.0;
1047 sampler_info.maxAnisotropy = 1;
1048 sampler_info.compareEnable = VK_FALSE;
1049 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1050 sampler_info.minLod = 1.0;
1051 sampler_info.maxLod = 1.0;
1052 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1053 sampler_info.unnormalizedCoordinates = VK_FALSE;
1054 // Not VK_TRUE or VK_FALSE
1055 sampler_info.anisotropyEnable = 3;
1056 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1057 m_errorMonitor->VerifyFound();
1058}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001059
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001060TEST_F(VkLayerTest, UpdateBufferAlignment) {
1061 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001062 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001063
Tony Barbour1fa09702017-03-16 12:09:08 -06001064 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001065
1066 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1067 vk_testing::Buffer buffer;
1068 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1069
Tony Barbour552f6c02016-12-21 14:34:07 -07001070 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001071 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1074 m_errorMonitor->VerifyFound();
1075
1076 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001078 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1079 m_errorMonitor->VerifyFound();
1080
1081 // Introduce failure by using dataSize that is < 0
1082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001083 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001084 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1085 m_errorMonitor->VerifyFound();
1086
1087 // Introduce failure by using dataSize that is > 65536
1088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001089 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1091 m_errorMonitor->VerifyFound();
1092
Tony Barbour552f6c02016-12-21 14:34:07 -07001093 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094}
1095
1096TEST_F(VkLayerTest, FillBufferAlignment) {
1097 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1098
Tony Barbour1fa09702017-03-16 12:09:08 -06001099 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100
1101 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1102 vk_testing::Buffer buffer;
1103 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1104
Tony Barbour552f6c02016-12-21 14:34:07 -07001105 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001106
1107 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001114 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1115 m_errorMonitor->VerifyFound();
1116
1117 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
Tony Barbour552f6c02016-12-21 14:34:07 -07001122 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001123}
Dustin Graves40f35822016-06-23 11:12:53 -06001124
Cortd889ff92016-07-27 09:51:27 -07001125TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1126 VkResult err;
1127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001128 TEST_DESCRIPTION(
1129 "Attempt to use a non-solid polygon fill mode in a "
1130 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001131
Tony Barbour1fa09702017-03-16 12:09:08 -06001132 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1134
1135 std::vector<const char *> device_extension_names;
1136 auto features = m_device->phy().features();
1137 // Artificially disable support for non-solid fill modes
Chris Forbes05054022017-05-17 16:29:06 -07001138 features.fillModeNonSolid = VK_FALSE;
Cortd889ff92016-07-27 09:51:27 -07001139 // The sacrificial device object
1140 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1141
1142 VkRenderpassObj render_pass(&test_device);
1143
1144 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1145 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1146 pipeline_layout_ci.setLayoutCount = 0;
1147 pipeline_layout_ci.pSetLayouts = NULL;
1148
1149 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001150 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001151 ASSERT_VK_SUCCESS(err);
1152
1153 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1154 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1155 rs_ci.pNext = nullptr;
1156 rs_ci.lineWidth = 1.0f;
Chris Forbes05054022017-05-17 16:29:06 -07001157 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Cortd889ff92016-07-27 09:51:27 -07001158
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001159 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1160 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001161
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001162 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1164 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001165 {
1166 VkPipelineObj pipe(&test_device);
1167 pipe.AddShader(&vs);
1168 pipe.AddShader(&fs);
1169 pipe.AddColorAttachment();
1170 // Introduce failure by setting unsupported polygon mode
1171 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1172 pipe.SetRasterization(&rs_ci);
1173 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1174 }
1175 m_errorMonitor->VerifyFound();
1176
1177 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1179 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001180 {
1181 VkPipelineObj pipe(&test_device);
1182 pipe.AddShader(&vs);
1183 pipe.AddShader(&fs);
1184 pipe.AddColorAttachment();
1185 // Introduce failure by setting unsupported polygon mode
1186 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1187 pipe.SetRasterization(&rs_ci);
1188 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1189 }
1190 m_errorMonitor->VerifyFound();
1191
Cortd889ff92016-07-27 09:51:27 -07001192 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1193}
1194
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001195#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001196TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001197{
1198 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001199 VkFenceCreateInfo fenceInfo = {};
1200 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1201 fenceInfo.pNext = NULL;
1202 fenceInfo.flags = 0;
1203
Mike Weiblencce7ec72016-10-17 19:33:05 -06001204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001205
Tony Barbour1fa09702017-03-16 12:09:08 -06001206 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001207
1208 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1209 vk_testing::Buffer buffer;
1210 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001211
Tony Barbourfe3351b2015-07-28 10:17:20 -06001212 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001213 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001214 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001215
1216 testFence.init(*m_device, fenceInfo);
1217
1218 // Bypass framework since it does the waits automatically
1219 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001220 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001221 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1222 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001223 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001224 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001225 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001226 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001228 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001229 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001230
1231 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001232 ASSERT_VK_SUCCESS( err );
1233
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001234 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001235 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001236
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001237 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001238}
1239
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001240TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001241{
1242 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001243 VkFenceCreateInfo fenceInfo = {};
1244 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1245 fenceInfo.pNext = NULL;
1246 fenceInfo.flags = 0;
1247
Mike Weiblencce7ec72016-10-17 19:33:05 -06001248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001249
Tony Barbour1fa09702017-03-16 12:09:08 -06001250 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251 ASSERT_NO_FATAL_FAILURE(InitViewport());
1252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1253
Tony Barbourfe3351b2015-07-28 10:17:20 -06001254 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001255 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001256 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257
1258 testFence.init(*m_device, fenceInfo);
1259
1260 // Bypass framework since it does the waits automatically
1261 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001262 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001263 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1264 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001265 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001266 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001267 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001268 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001269 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001270 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001271 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001272
1273 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 ASSERT_VK_SUCCESS( err );
1275
Jon Ashburnf19916e2016-01-11 13:12:43 -07001276 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001277 VkCommandBufferBeginInfo info = {};
1278 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1279 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001280 info.renderPass = VK_NULL_HANDLE;
1281 info.subpass = 0;
1282 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001283 info.occlusionQueryEnable = VK_FALSE;
1284 info.queryFlags = 0;
1285 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001286
1287 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001288 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001289
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001290 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001291}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001292#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001293
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001294TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1295 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1296
Tony Barbour1fa09702017-03-16 12:09:08 -06001297 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001298
1299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1300 VkBuffer buffer;
1301 VkBufferCreateInfo buf_info = {};
1302 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1303 buf_info.pNext = NULL;
1304 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1305 buf_info.size = 2048;
1306 buf_info.queueFamilyIndexCount = 0;
1307 buf_info.pQueueFamilyIndices = NULL;
1308 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1309 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1310 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1311 m_errorMonitor->VerifyFound();
1312
1313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1314 VkImage image;
1315 VkImageCreateInfo image_create_info = {};
1316 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1317 image_create_info.pNext = NULL;
1318 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1319 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1320 image_create_info.extent.width = 512;
1321 image_create_info.extent.height = 64;
1322 image_create_info.extent.depth = 1;
1323 image_create_info.mipLevels = 1;
1324 image_create_info.arrayLayers = 1;
1325 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1326 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1327 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1328 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1329 image_create_info.queueFamilyIndexCount = 0;
1330 image_create_info.pQueueFamilyIndices = NULL;
1331 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1332 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1333 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1334 m_errorMonitor->VerifyFound();
1335}
1336
Dave Houlton829c0d82017-01-24 15:09:17 -07001337TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1338 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1339
1340 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001341 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001342 ASSERT_NO_FATAL_FAILURE(
1343 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001344 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001345
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001346 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001347 device_features.sparseResidencyImage2D = VK_FALSE;
1348 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001349 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 VkImage image = VK_NULL_HANDLE;
1352 VkResult result = VK_RESULT_MAX_ENUM;
1353 VkImageCreateInfo image_create_info = {};
1354 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1355 image_create_info.pNext = NULL;
1356 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1357 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1358 image_create_info.extent.width = 512;
1359 image_create_info.extent.height = 1;
1360 image_create_info.extent.depth = 1;
1361 image_create_info.mipLevels = 1;
1362 image_create_info.arrayLayers = 1;
1363 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1364 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1365 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1366 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1367 image_create_info.queueFamilyIndexCount = 0;
1368 image_create_info.pQueueFamilyIndices = NULL;
1369 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1370 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1371
1372 // 1D image w/ sparse residency is an error
1373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1374 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1375 m_errorMonitor->VerifyFound();
1376 if (VK_SUCCESS == result) {
1377 vkDestroyImage(m_device->device(), image, NULL);
1378 image = VK_NULL_HANDLE;
1379 }
1380
1381 // 2D image w/ sparse residency when feature isn't available
1382 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1383 image_create_info.extent.height = 64;
1384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1385 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1386 m_errorMonitor->VerifyFound();
1387 if (VK_SUCCESS == result) {
1388 vkDestroyImage(m_device->device(), image, NULL);
1389 image = VK_NULL_HANDLE;
1390 }
1391
1392 // 3D image w/ sparse residency when feature isn't available
1393 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1394 image_create_info.extent.depth = 8;
1395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1396 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1397 m_errorMonitor->VerifyFound();
1398 if (VK_SUCCESS == result) {
1399 vkDestroyImage(m_device->device(), image, NULL);
1400 image = VK_NULL_HANDLE;
1401 }
1402}
1403
1404TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1405 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1406
1407 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001408 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001409 ASSERT_NO_FATAL_FAILURE(
1410 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001411 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001412
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001413 // These tests require that the device support sparse residency for 2D images
1414 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1415 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001416 return;
1417 }
1418
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001419 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001420 device_features.sparseResidency2Samples = VK_FALSE;
1421 device_features.sparseResidency4Samples = VK_FALSE;
1422 device_features.sparseResidency8Samples = VK_FALSE;
1423 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001424 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001425
1426 VkImage image = VK_NULL_HANDLE;
1427 VkResult result = VK_RESULT_MAX_ENUM;
1428 VkImageCreateInfo image_create_info = {};
1429 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1430 image_create_info.pNext = NULL;
1431 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1432 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1433 image_create_info.extent.width = 64;
1434 image_create_info.extent.height = 64;
1435 image_create_info.extent.depth = 1;
1436 image_create_info.mipLevels = 1;
1437 image_create_info.arrayLayers = 1;
1438 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1439 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1440 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1441 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1442 image_create_info.queueFamilyIndexCount = 0;
1443 image_create_info.pQueueFamilyIndices = NULL;
1444 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1445 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1446
1447 // 2D image w/ sparse residency and linear tiling is an error
1448 m_errorMonitor->SetDesiredFailureMsg(
1449 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1450 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1451 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1452 m_errorMonitor->VerifyFound();
1453 if (VK_SUCCESS == result) {
1454 vkDestroyImage(m_device->device(), image, NULL);
1455 image = VK_NULL_HANDLE;
1456 }
1457 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1458
1459 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1460 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1462 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1463 m_errorMonitor->VerifyFound();
1464 if (VK_SUCCESS == result) {
1465 vkDestroyImage(m_device->device(), image, NULL);
1466 image = VK_NULL_HANDLE;
1467 }
1468
1469 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
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
1487 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495}
1496
Tobin Ehlisf11be982016-05-11 13:52:53 -06001497TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001498 TEST_DESCRIPTION(
1499 "Create a buffer and image, allocate memory, and bind the "
1500 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001501 VkResult err;
1502 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001503 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001504
Tobin Ehlis077ded32016-05-12 17:39:13 -06001505 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001507 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001508 VkDeviceMemory mem; // buffer will be bound first
1509 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001510 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001511 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001512
1513 VkBufferCreateInfo buf_info = {};
1514 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1515 buf_info.pNext = NULL;
1516 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1517 buf_info.size = 256;
1518 buf_info.queueFamilyIndexCount = 0;
1519 buf_info.pQueueFamilyIndices = NULL;
1520 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1521 buf_info.flags = 0;
1522 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1523 ASSERT_VK_SUCCESS(err);
1524
Tobin Ehlis077ded32016-05-12 17:39:13 -06001525 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001526
1527 VkImageCreateInfo image_create_info = {};
1528 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1529 image_create_info.pNext = NULL;
1530 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1531 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1532 image_create_info.extent.width = 64;
1533 image_create_info.extent.height = 64;
1534 image_create_info.extent.depth = 1;
1535 image_create_info.mipLevels = 1;
1536 image_create_info.arrayLayers = 1;
1537 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001538 // Image tiling must be optimal to trigger error when aliasing linear buffer
1539 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001540 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1541 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1542 image_create_info.queueFamilyIndexCount = 0;
1543 image_create_info.pQueueFamilyIndices = NULL;
1544 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1545 image_create_info.flags = 0;
1546
Tobin Ehlisf11be982016-05-11 13:52:53 -06001547 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1548 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001549 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1550 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551
Tobin Ehlis077ded32016-05-12 17:39:13 -06001552 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1553
1554 VkMemoryAllocateInfo alloc_info = {};
1555 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1556 alloc_info.pNext = NULL;
1557 alloc_info.memoryTypeIndex = 0;
1558 // Ensure memory is big enough for both bindings
1559 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001560 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1561 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001562 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001563 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001564 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001565 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001566 return;
1567 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001568 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1569 ASSERT_VK_SUCCESS(err);
1570 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1571 ASSERT_VK_SUCCESS(err);
1572
Rene Lindsayd14f5572016-12-16 14:57:18 -07001573 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1574
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001576 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001577 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1578 m_errorMonitor->VerifyFound();
1579
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001581 // aliasing buffer2
1582 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1583 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001584 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1585 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001586 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001587 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001589 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 m_errorMonitor->VerifyFound();
1592
1593 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 vkFreeMemory(m_device->device(), mem, NULL);
1598 vkFreeMemory(m_device->device(), mem_img, NULL);
1599}
1600
Tobin Ehlis35372522016-05-12 08:32:31 -06001601TEST_F(VkLayerTest, InvalidMemoryMapping) {
1602 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1603 VkResult err;
1604 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001605 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001606
1607 VkBuffer buffer;
1608 VkDeviceMemory mem;
1609 VkMemoryRequirements mem_reqs;
1610
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001611 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1612
Tobin Ehlis35372522016-05-12 08:32:31 -06001613 VkBufferCreateInfo buf_info = {};
1614 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1615 buf_info.pNext = NULL;
1616 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1617 buf_info.size = 256;
1618 buf_info.queueFamilyIndexCount = 0;
1619 buf_info.pQueueFamilyIndices = NULL;
1620 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1621 buf_info.flags = 0;
1622 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1623 ASSERT_VK_SUCCESS(err);
1624
1625 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1626 VkMemoryAllocateInfo alloc_info = {};
1627 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1628 alloc_info.pNext = NULL;
1629 alloc_info.memoryTypeIndex = 0;
1630
1631 // Ensure memory is big enough for both bindings
1632 static const VkDeviceSize allocation_size = 0x10000;
1633 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001634 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 -06001635 if (!pass) {
1636 vkDestroyBuffer(m_device->device(), buffer, NULL);
1637 return;
1638 }
1639 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1640 ASSERT_VK_SUCCESS(err);
1641
1642 uint8_t *pData;
1643 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001644 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 -06001645 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1646 m_errorMonitor->VerifyFound();
1647 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001648 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001649 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1651 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1652 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001653 m_errorMonitor->VerifyFound();
1654
1655 // Unmap the memory to avoid re-map error
1656 vkUnmapMemory(m_device->device(), mem);
1657 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1659 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1660 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001661 m_errorMonitor->VerifyFound();
1662 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1664 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001665 m_errorMonitor->VerifyFound();
1666 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001668 vkUnmapMemory(m_device->device(), mem);
1669 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001670
Tobin Ehlis35372522016-05-12 08:32:31 -06001671 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001672 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001673 ASSERT_VK_SUCCESS(err);
1674 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001675 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001677 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001679 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1680 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 // Now flush range that oversteps mapped range
1683 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001684 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001686 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001687 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1689 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1690 m_errorMonitor->VerifyFound();
1691
1692 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1693 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001694 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001695 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001696 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 mmr.size = VK_WHOLE_SIZE;
1698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1700 m_errorMonitor->VerifyFound();
1701
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001702#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001703 // Some platforms have an atomsize of 1 which makes the test meaningless
1704 if (atom_size > 3) {
1705 // Now with an offset NOT a multiple of the device limit
1706 vkUnmapMemory(m_device->device(), mem);
1707 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1708 ASSERT_VK_SUCCESS(err);
1709 mmr.offset = 3; // Not a multiple of atom_size
1710 mmr.size = VK_WHOLE_SIZE;
1711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1712 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1713 m_errorMonitor->VerifyFound();
1714
1715 // Now with a size NOT a multiple of the device limit
1716 vkUnmapMemory(m_device->device(), mem);
1717 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1718 ASSERT_VK_SUCCESS(err);
1719 mmr.offset = atom_size;
1720 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1722 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1723 m_errorMonitor->VerifyFound();
1724 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001725#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001726 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1727 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001728 if (!pass) {
1729 vkFreeMemory(m_device->device(), mem, NULL);
1730 vkDestroyBuffer(m_device->device(), buffer, NULL);
1731 return;
1732 }
1733 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1734 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1735
1736 vkDestroyBuffer(m_device->device(), buffer, NULL);
1737 vkFreeMemory(m_device->device(), mem, NULL);
1738}
1739
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001740#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001741TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1742 VkResult err;
1743 bool pass;
1744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001745 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1746 // following declaration (which is temporarily being moved below):
1747 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001748 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001749 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001750 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001751 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001752 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001753 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001754
Tony Barbour1fa09702017-03-16 12:09:08 -06001755 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001756
Ian Elliott3f06ce52016-04-29 14:46:21 -06001757#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1758#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1759 // Use the functions from the VK_KHR_android_surface extension without
1760 // enabling that extension:
1761
1762 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001763 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1765 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766 pass = (err != VK_SUCCESS);
1767 ASSERT_TRUE(pass);
1768 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001769#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001770
Ian Elliott3f06ce52016-04-29 14:46:21 -06001771#if defined(VK_USE_PLATFORM_MIR_KHR)
1772 // Use the functions from the VK_KHR_mir_surface extension without enabling
1773 // that extension:
1774
1775 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001776 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001778 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1779 pass = (err != VK_SUCCESS);
1780 ASSERT_TRUE(pass);
1781 m_errorMonitor->VerifyFound();
1782
1783 // Tell whether an mir_connection supports presentation:
1784 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1786 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001788#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001789
Ian Elliott3f06ce52016-04-29 14:46:21 -06001790#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1791 // Use the functions from the VK_KHR_wayland_surface extension without
1792 // enabling that extension:
1793
1794 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001795 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1797 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798 pass = (err != VK_SUCCESS);
1799 ASSERT_TRUE(pass);
1800 m_errorMonitor->VerifyFound();
1801
1802 // Tell whether an wayland_display supports presentation:
1803 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1805 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001806 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001807#endif // VK_USE_PLATFORM_WAYLAND_KHR
1808#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809
Ian Elliott3f06ce52016-04-29 14:46:21 -06001810#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001811 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1812 // TO NON-LINUX PLATFORMS:
1813 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001814 // Use the functions from the VK_KHR_win32_surface extension without
1815 // enabling that extension:
1816
1817 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001818 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1820 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821 pass = (err != VK_SUCCESS);
1822 ASSERT_TRUE(pass);
1823 m_errorMonitor->VerifyFound();
1824
1825 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001827 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001828 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001829// Set this (for now, until all platforms are supported and tested):
1830#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001831#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001832#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001833 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1834 // TO NON-LINUX PLATFORMS:
1835 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001836#endif
1837#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001838 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1839 // that extension:
1840
1841 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001842 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001844 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1845 pass = (err != VK_SUCCESS);
1846 ASSERT_TRUE(pass);
1847 m_errorMonitor->VerifyFound();
1848
1849 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001850 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001851 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1853 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001854 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001855// Set this (for now, until all platforms are supported and tested):
1856#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001857#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001858
Ian Elliott12630812016-04-29 14:35:43 -06001859#if defined(VK_USE_PLATFORM_XLIB_KHR)
1860 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1861 // that extension:
1862
1863 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001864 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001866 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1867 pass = (err != VK_SUCCESS);
1868 ASSERT_TRUE(pass);
1869 m_errorMonitor->VerifyFound();
1870
1871 // Tell whether an Xlib VisualID supports presentation:
1872 Display *dpy = NULL;
1873 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1876 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001877// Set this (for now, until all platforms are supported and tested):
1878#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001879#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001880
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001881// Use the functions from the VK_KHR_surface extension without enabling
1882// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001883
Ian Elliott489eec02016-05-05 14:12:44 -06001884#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001887 vkDestroySurfaceKHR(instance(), surface, NULL);
1888 m_errorMonitor->VerifyFound();
1889
1890 // Check if surface supports presentation:
1891 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001893 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1894 pass = (err != VK_SUCCESS);
1895 ASSERT_TRUE(pass);
1896 m_errorMonitor->VerifyFound();
1897
1898 // Check surface capabilities:
1899 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1901 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 pass = (err != VK_SUCCESS);
1903 ASSERT_TRUE(pass);
1904 m_errorMonitor->VerifyFound();
1905
1906 // Check surface formats:
1907 uint32_t format_count = 0;
1908 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface present modes:
1916 uint32_t present_mode_count = 0;
1917 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001923#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001924
Ian Elliott1c32c772016-04-28 14:47:13 -06001925 // Use the functions from the VK_KHR_swapchain extension without enabling
1926 // that extension:
1927
1928 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001930 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1931 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001932 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Get the images from the swapchain:
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 = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001940 pass = (err != VK_SUCCESS);
1941 ASSERT_TRUE(pass);
1942 m_errorMonitor->VerifyFound();
1943
Chris Forbeseb7d5502016-09-13 18:19:21 +12001944 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1945 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1946 VkFence fence;
1947 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1948
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001951 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001952 pass = (err != VK_SUCCESS);
1953 ASSERT_TRUE(pass);
1954 m_errorMonitor->VerifyFound();
1955
Chris Forbeseb7d5502016-09-13 18:19:21 +12001956 vkDestroyFence(m_device->device(), fence, nullptr);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001959 //
1960 // NOTE: Currently can't test this because a real swapchain is needed (as
1961 // opposed to the fake one we created) in order for the layer to lookup the
1962 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001963
1964 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001966 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1967 m_errorMonitor->VerifyFound();
1968}
Chris Forbes09368e42016-10-13 11:59:22 +13001969#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001970
Karl Schultz6addd812016-02-02 17:17:23 -07001971TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1972 VkResult err;
1973 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001974
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1976 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001977
Tony Barbour1fa09702017-03-16 12:09:08 -06001978 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001979
1980 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001981 VkImage image;
1982 VkDeviceMemory mem;
1983 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001984
Karl Schultz6addd812016-02-02 17:17:23 -07001985 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1986 const int32_t tex_width = 32;
1987 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
Tony Barboureb254902015-07-15 12:50:33 -06001989 VkImageCreateInfo image_create_info = {};
1990 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001991 image_create_info.pNext = NULL;
1992 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1993 image_create_info.format = tex_format;
1994 image_create_info.extent.width = tex_width;
1995 image_create_info.extent.height = tex_height;
1996 image_create_info.extent.depth = 1;
1997 image_create_info.mipLevels = 1;
1998 image_create_info.arrayLayers = 1;
1999 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2000 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2001 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2002 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002003 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002004
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002005 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002006 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002007 mem_alloc.pNext = NULL;
2008 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002009
Chia-I Wuf7458c52015-10-26 21:10:41 +08002010 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002011 ASSERT_VK_SUCCESS(err);
2012
Karl Schultz6addd812016-02-02 17:17:23 -07002013 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002014
Mark Lobodzinski23065352015-05-29 09:32:35 -05002015 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002016
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002017 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 -07002018 if (!pass) { // If we can't find any unmappable memory this test doesn't
2019 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002020 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002021 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002022 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002023
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002024 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002025 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002026 ASSERT_VK_SUCCESS(err);
2027
2028 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002029 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002030 ASSERT_VK_SUCCESS(err);
2031
2032 // Map memory as if to initialize the image
2033 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002034 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002036 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002037
Chia-I Wuf7458c52015-10-26 21:10:41 +08002038 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002039 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040}
2041
Karl Schultz6addd812016-02-02 17:17:23 -07002042TEST_F(VkLayerTest, RebindMemory) {
2043 VkResult err;
2044 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002045
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002047
Tony Barbour1fa09702017-03-16 12:09:08 -06002048 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002049
2050 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002051 VkImage image;
2052 VkDeviceMemory mem1;
2053 VkDeviceMemory mem2;
2054 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002055
Karl Schultz6addd812016-02-02 17:17:23 -07002056 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2057 const int32_t tex_width = 32;
2058 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002059
Tony Barboureb254902015-07-15 12:50:33 -06002060 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002061 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2062 image_create_info.pNext = NULL;
2063 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2064 image_create_info.format = tex_format;
2065 image_create_info.extent.width = tex_width;
2066 image_create_info.extent.height = tex_height;
2067 image_create_info.extent.depth = 1;
2068 image_create_info.mipLevels = 1;
2069 image_create_info.arrayLayers = 1;
2070 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2071 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2072 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2073 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002075 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002076 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2077 mem_alloc.pNext = NULL;
2078 mem_alloc.allocationSize = 0;
2079 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 // Introduce failure, do NOT set memProps to
2082 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002083 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002084 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002085 ASSERT_VK_SUCCESS(err);
2086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002088
2089 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002090 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002091 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002092
2093 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002094 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002095 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002096 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097 ASSERT_VK_SUCCESS(err);
2098
2099 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002100 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101 ASSERT_VK_SUCCESS(err);
2102
Karl Schultz6addd812016-02-02 17:17:23 -07002103 // Introduce validation failure, try to bind a different memory object to
2104 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002105 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002107 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002108
Chia-I Wuf7458c52015-10-26 21:10:41 +08002109 vkDestroyImage(m_device->device(), image, NULL);
2110 vkFreeMemory(m_device->device(), mem1, NULL);
2111 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002112}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002113
Karl Schultz6addd812016-02-02 17:17:23 -07002114TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002115 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002116
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2118 "submitted in SIGNALED state. Fences "
2119 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002120
2121 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002122 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2123 fenceInfo.pNext = NULL;
2124 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002125
Tony Barbour1fa09702017-03-16 12:09:08 -06002126 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002127 ASSERT_NO_FATAL_FAILURE(InitViewport());
2128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2129
Tony Barbour552f6c02016-12-21 14:34:07 -07002130 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002131 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002132 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002133
2134 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002135
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002136 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002137 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2138 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002139 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002140 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002141 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002142 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002143 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002144 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002146
2147 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002148 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002149
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002150 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002151}
Chris Forbes4e44c912016-06-16 10:20:00 +12002152
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002153TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002154 TEST_DESCRIPTION(
2155 "Specify wrong usage for image then create conflicting view of image "
2156 "Initialize buffer with wrong usage then perform copy expecting errors "
2157 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002159
Tony Barbour1fa09702017-03-16 12:09:08 -06002160 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002161 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002162 if (!format) {
2163 printf(" No Depth + Stencil format found. Skipped.\n");
2164 return;
2165 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002166
Tony Barbourf92621a2016-05-02 14:28:12 -06002167 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002168 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002169 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002170 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002171
Tony Barbourf92621a2016-05-02 14:28:12 -06002172 VkImageView dsv;
2173 VkImageViewCreateInfo dsvci = {};
2174 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2175 dsvci.image = image.handle();
2176 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002177 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002178 dsvci.subresourceRange.layerCount = 1;
2179 dsvci.subresourceRange.baseMipLevel = 0;
2180 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002181 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002182
Tony Barbourf92621a2016-05-02 14:28:12 -06002183 // Create a view with depth / stencil aspect for image with different usage
2184 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002185
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002186 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002187
2188 // Initialize buffer with TRANSFER_DST usage
2189 vk_testing::Buffer buffer;
2190 VkMemoryPropertyFlags reqs = 0;
2191 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2192 VkBufferImageCopy region = {};
2193 region.bufferRowLength = 128;
2194 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002195 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002196 region.imageSubresource.layerCount = 1;
2197 region.imageExtent.height = 16;
2198 region.imageExtent.width = 16;
2199 region.imageExtent.depth = 1;
2200
Mark Lobodzinski80871462017-02-16 10:37:27 -07002201 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002202 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002203
Chris Forbesda581202016-10-06 18:25:26 +13002204 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
Chris Forbesda581202016-10-06 18:25:26 +13002207
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002208 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2209 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002210 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002211}
Tony Barbour75d79f02016-08-30 09:39:07 -06002212
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002213TEST_F(VkLayerTest, LeakAnObject) {
2214 VkResult err;
2215
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002216 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002217
2218 // Note that we have to create a new device since destroying the
2219 // framework's device causes Teardown() to fail and just calling Teardown
2220 // will destroy the errorMonitor.
2221
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223
Tony Barbour1fa09702017-03-16 12:09:08 -06002224 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227 std::vector<VkDeviceQueueCreateInfo> queue_info;
2228 queue_info.reserve(queue_props.size());
2229 std::vector<std::vector<float>> queue_priorities;
2230 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2231 VkDeviceQueueCreateInfo qi = {};
2232 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2233 qi.pNext = NULL;
2234 qi.queueFamilyIndex = i;
2235 qi.queueCount = queue_props[i].queueCount;
2236 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2237 qi.pQueuePriorities = queue_priorities[i].data();
2238 queue_info.push_back(qi);
2239 }
2240
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002241 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002242
2243 // The sacrificial device object
2244 VkDevice testDevice;
2245 VkDeviceCreateInfo device_create_info = {};
2246 auto features = m_device->phy().features();
2247 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2248 device_create_info.pNext = NULL;
2249 device_create_info.queueCreateInfoCount = queue_info.size();
2250 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002251 device_create_info.enabledLayerCount = 0;
2252 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002253 device_create_info.pEnabledFeatures = &features;
2254 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2255 ASSERT_VK_SUCCESS(err);
2256
2257 VkFence fence;
2258 VkFenceCreateInfo fence_create_info = {};
2259 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2260 fence_create_info.pNext = NULL;
2261 fence_create_info.flags = 0;
2262 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2263 ASSERT_VK_SUCCESS(err);
2264
2265 // Induce failure by not calling vkDestroyFence
2266 vkDestroyDevice(testDevice, NULL);
2267 m_errorMonitor->VerifyFound();
2268}
2269
2270TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002271 TEST_DESCRIPTION(
2272 "Allocate command buffers from one command pool and "
2273 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002274
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002276
Tony Barbour1fa09702017-03-16 12:09:08 -06002277 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002278 VkCommandPool command_pool_one;
2279 VkCommandPool command_pool_two;
2280
2281 VkCommandPoolCreateInfo pool_create_info{};
2282 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2283 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2284 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2285
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002286 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002288 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002289
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002290 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002291 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002292 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002293 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002294 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002295 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002296 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002298 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
2300 m_errorMonitor->VerifyFound();
2301
2302 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2303 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2304}
2305
2306TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2307 VkResult err;
2308
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002309 TEST_DESCRIPTION(
2310 "Allocate descriptor sets from one DS pool and "
2311 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002312
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002314
Tony Barbour1fa09702017-03-16 12:09:08 -06002315 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002316 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2317
2318 VkDescriptorPoolSize ds_type_count = {};
2319 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2320 ds_type_count.descriptorCount = 1;
2321
2322 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2323 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2324 ds_pool_ci.pNext = NULL;
2325 ds_pool_ci.flags = 0;
2326 ds_pool_ci.maxSets = 1;
2327 ds_pool_ci.poolSizeCount = 1;
2328 ds_pool_ci.pPoolSizes = &ds_type_count;
2329
2330 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002331 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002332 ASSERT_VK_SUCCESS(err);
2333
2334 // Create a second descriptor pool
2335 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002336 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002337 ASSERT_VK_SUCCESS(err);
2338
2339 VkDescriptorSetLayoutBinding dsl_binding = {};
2340 dsl_binding.binding = 0;
2341 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2342 dsl_binding.descriptorCount = 1;
2343 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2344 dsl_binding.pImmutableSamplers = NULL;
2345
2346 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2347 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2348 ds_layout_ci.pNext = NULL;
2349 ds_layout_ci.bindingCount = 1;
2350 ds_layout_ci.pBindings = &dsl_binding;
2351
2352 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002353 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002354 ASSERT_VK_SUCCESS(err);
2355
2356 VkDescriptorSet descriptorSet;
2357 VkDescriptorSetAllocateInfo alloc_info = {};
2358 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2359 alloc_info.descriptorSetCount = 1;
2360 alloc_info.descriptorPool = ds_pool_one;
2361 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2366
2367 m_errorMonitor->VerifyFound();
2368
2369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2370 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2371 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2372}
2373
2374TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002376
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002377 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002378
Tony Barbour1fa09702017-03-16 12:09:08 -06002379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002380
2381 // Pass bogus handle into GetImageMemoryRequirements
2382 VkMemoryRequirements mem_reqs;
2383 uint64_t fakeImageHandle = 0xCADECADE;
2384 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2385
2386 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2387
2388 m_errorMonitor->VerifyFound();
2389}
2390
Mike Schuchardt17838902017-02-21 09:48:06 -07002391TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2392 TEST_DESCRIPTION(
2393 "Try to destroy a render pass object using a device other than the one it was created on. "
2394 "This should generate a distinct error from the invalid handle error.");
2395 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002396 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002397 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2398
2399 // Create second device
2400 float priorities[] = {1.0f};
2401 VkDeviceQueueCreateInfo queue_info{};
2402 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2403 queue_info.pNext = NULL;
2404 queue_info.flags = 0;
2405 queue_info.queueFamilyIndex = 0;
2406 queue_info.queueCount = 1;
2407 queue_info.pQueuePriorities = &priorities[0];
2408
2409 VkDeviceCreateInfo device_create_info = {};
2410 auto features = m_device->phy().features();
2411 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2412 device_create_info.pNext = NULL;
2413 device_create_info.queueCreateInfoCount = 1;
2414 device_create_info.pQueueCreateInfos = &queue_info;
2415 device_create_info.enabledLayerCount = 0;
2416 device_create_info.ppEnabledLayerNames = NULL;
2417 device_create_info.pEnabledFeatures = &features;
2418
2419 VkDevice second_device;
2420 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2421
2422 // Try to destroy the renderpass from the first device using the second device
2423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2424 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2425 m_errorMonitor->VerifyFound();
2426
2427 vkDestroyDevice(second_device, NULL);
2428}
2429
Karl Schultz6addd812016-02-02 17:17:23 -07002430TEST_F(VkLayerTest, PipelineNotBound) {
2431 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002432
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002433 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002434
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002436
Tony Barbour1fa09702017-03-16 12:09:08 -06002437 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002439
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002440 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002441 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2442 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002443
2444 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002445 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2446 ds_pool_ci.pNext = NULL;
2447 ds_pool_ci.maxSets = 1;
2448 ds_pool_ci.poolSizeCount = 1;
2449 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002450
2451 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002452 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453 ASSERT_VK_SUCCESS(err);
2454
2455 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002456 dsl_binding.binding = 0;
2457 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2458 dsl_binding.descriptorCount = 1;
2459 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2460 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002461
2462 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002463 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2464 ds_layout_ci.pNext = NULL;
2465 ds_layout_ci.bindingCount = 1;
2466 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002467
2468 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002469 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470 ASSERT_VK_SUCCESS(err);
2471
2472 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002473 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002474 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002475 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002476 alloc_info.descriptorPool = ds_pool;
2477 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002478 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002479 ASSERT_VK_SUCCESS(err);
2480
2481 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002482 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2483 pipeline_layout_ci.pNext = NULL;
2484 pipeline_layout_ci.setLayoutCount = 1;
2485 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002486
2487 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
Mark Youngad779052016-01-06 14:26:04 -07002491 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
Tony Barbour552f6c02016-12-21 14:34:07 -07002493 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002494 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002495
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002496 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002497
Chia-I Wuf7458c52015-10-26 21:10:41 +08002498 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2499 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2500 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002501}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002502
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002503TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2504 VkResult err;
2505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002506 TEST_DESCRIPTION(
2507 "Test validation check for an invalid memory type index "
2508 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002509
Tony Barbour1fa09702017-03-16 12:09:08 -06002510 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002511
2512 // Create an image, allocate memory, set a bad typeIndex and then try to
2513 // bind it
2514 VkImage image;
2515 VkDeviceMemory mem;
2516 VkMemoryRequirements mem_reqs;
2517 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2518 const int32_t tex_width = 32;
2519 const int32_t tex_height = 32;
2520
2521 VkImageCreateInfo image_create_info = {};
2522 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2523 image_create_info.pNext = NULL;
2524 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2525 image_create_info.format = tex_format;
2526 image_create_info.extent.width = tex_width;
2527 image_create_info.extent.height = tex_height;
2528 image_create_info.extent.depth = 1;
2529 image_create_info.mipLevels = 1;
2530 image_create_info.arrayLayers = 1;
2531 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2532 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2533 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2534 image_create_info.flags = 0;
2535
2536 VkMemoryAllocateInfo mem_alloc = {};
2537 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2538 mem_alloc.pNext = NULL;
2539 mem_alloc.allocationSize = 0;
2540 mem_alloc.memoryTypeIndex = 0;
2541
2542 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2543 ASSERT_VK_SUCCESS(err);
2544
2545 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2546 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002547
2548 // Introduce Failure, select invalid TypeIndex
2549 VkPhysicalDeviceMemoryProperties memory_info;
2550
2551 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2552 unsigned int i;
2553 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2554 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2555 mem_alloc.memoryTypeIndex = i;
2556 break;
2557 }
2558 }
2559 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002560 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002561 vkDestroyImage(m_device->device(), image, NULL);
2562 return;
2563 }
2564
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002565 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 -06002566
2567 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2568 ASSERT_VK_SUCCESS(err);
2569
2570 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2571 (void)err;
2572
2573 m_errorMonitor->VerifyFound();
2574
2575 vkDestroyImage(m_device->device(), image, NULL);
2576 vkFreeMemory(m_device->device(), mem, NULL);
2577}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
Karl Schultz6addd812016-02-02 17:17:23 -07002579TEST_F(VkLayerTest, BindInvalidMemory) {
2580 VkResult err;
2581 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002582
Tony Barbour1fa09702017-03-16 12:09:08 -06002583 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002584
Cortf801b982017-01-17 18:10:21 -08002585 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002586 const int32_t tex_width = 256;
2587 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002588
2589 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002590 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2591 image_create_info.pNext = NULL;
2592 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2593 image_create_info.format = tex_format;
2594 image_create_info.extent.width = tex_width;
2595 image_create_info.extent.height = tex_height;
2596 image_create_info.extent.depth = 1;
2597 image_create_info.mipLevels = 1;
2598 image_create_info.arrayLayers = 1;
2599 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002600 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002601 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2602 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002603
Cortf801b982017-01-17 18:10:21 -08002604 VkBufferCreateInfo buffer_create_info = {};
2605 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2606 buffer_create_info.pNext = NULL;
2607 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002608 buffer_create_info.size = 4 * 1024 * 1024;
2609 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002610 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002611
Cortf801b982017-01-17 18:10:21 -08002612 // Create an image/buffer, allocate memory, free it, and then try to bind it
2613 {
2614 VkImage image = VK_NULL_HANDLE;
2615 VkBuffer buffer = VK_NULL_HANDLE;
2616 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2617 ASSERT_VK_SUCCESS(err);
2618 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2619 ASSERT_VK_SUCCESS(err);
2620 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2621 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2622 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002623
Cortf801b982017-01-17 18:10:21 -08002624 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2625 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2626 image_mem_alloc.allocationSize = image_mem_reqs.size;
2627 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2628 ASSERT_TRUE(pass);
2629 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2630 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2631 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2632 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2635 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2636 ASSERT_VK_SUCCESS(err);
2637 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2638 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002639
Cortf801b982017-01-17 18:10:21 -08002640 vkFreeMemory(device(), image_mem, NULL);
2641 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2644 err = vkBindImageMemory(device(), image, image_mem, 0);
2645 (void)err; // This may very well return an error.
2646 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002647
Cortf801b982017-01-17 18:10:21 -08002648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2649 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2650 (void)err; // This may very well return an error.
2651 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 vkDestroyImage(m_device->device(), image, NULL);
2654 vkDestroyBuffer(m_device->device(), buffer, NULL);
2655 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002656
2657 // Try to bind memory to an object that already has a memory binding
2658 {
2659 VkImage image = VK_NULL_HANDLE;
2660 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2661 ASSERT_VK_SUCCESS(err);
2662 VkBuffer buffer = VK_NULL_HANDLE;
2663 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2664 ASSERT_VK_SUCCESS(err);
2665 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2666 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2667 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2668 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2669 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2670 image_alloc_info.allocationSize = image_mem_reqs.size;
2671 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2672 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2673 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2674 ASSERT_TRUE(pass);
2675 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2676 ASSERT_TRUE(pass);
2677 VkDeviceMemory image_mem, buffer_mem;
2678 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2679 ASSERT_VK_SUCCESS(err);
2680 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2681 ASSERT_VK_SUCCESS(err);
2682
2683 err = vkBindImageMemory(device(), image, image_mem, 0);
2684 ASSERT_VK_SUCCESS(err);
2685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2686 err = vkBindImageMemory(device(), image, image_mem, 0);
2687 (void)err; // This may very well return an error.
2688 m_errorMonitor->VerifyFound();
2689
2690 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2691 ASSERT_VK_SUCCESS(err);
2692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2693 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2694 (void)err; // This may very well return an error.
2695 m_errorMonitor->VerifyFound();
2696
2697 vkFreeMemory(device(), image_mem, NULL);
2698 vkFreeMemory(device(), buffer_mem, NULL);
2699 vkDestroyImage(device(), image, NULL);
2700 vkDestroyBuffer(device(), buffer, NULL);
2701 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002702
Cort Strattonde748202017-02-17 12:50:01 -08002703 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002704 {
2705 VkImage image = VK_NULL_HANDLE;
2706 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2707 ASSERT_VK_SUCCESS(err);
2708 VkBuffer buffer = VK_NULL_HANDLE;
2709 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2710 ASSERT_VK_SUCCESS(err);
2711 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2712 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2713 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2714 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2715 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002716 // Leave some extra space for alignment wiggle room
2717 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002718 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002719 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002720 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2721 ASSERT_TRUE(pass);
2722 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2723 ASSERT_TRUE(pass);
2724 VkDeviceMemory image_mem, buffer_mem;
2725 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2726 ASSERT_VK_SUCCESS(err);
2727 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2728 ASSERT_VK_SUCCESS(err);
2729
Cort Strattonde748202017-02-17 12:50:01 -08002730 // Test unaligned memory offset
2731 {
2732 if (image_mem_reqs.alignment > 1) {
2733 VkDeviceSize image_offset = 1;
2734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2735 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2736 (void)err; // This may very well return an error.
2737 m_errorMonitor->VerifyFound();
2738 }
Cort6c7dff72017-01-27 18:34:50 -08002739
Cort Strattonde748202017-02-17 12:50:01 -08002740 if (buffer_mem_reqs.alignment > 1) {
2741 VkDeviceSize buffer_offset = 1;
2742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2743 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2744 (void)err; // This may very well return an error.
2745 m_errorMonitor->VerifyFound();
2746 }
2747 }
2748
2749 // Test memory offsets outside the memory allocation
2750 {
2751 VkDeviceSize image_offset =
2752 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2754 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2755 (void)err; // This may very well return an error.
2756 m_errorMonitor->VerifyFound();
2757
2758 VkDeviceSize buffer_offset =
2759 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2761 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2762 (void)err; // This may very well return an error.
2763 m_errorMonitor->VerifyFound();
2764 }
2765
2766 // Test memory offsets within the memory allocation, but which leave too little memory for
2767 // the resource.
2768 {
2769 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002770 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2772 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2773 (void)err; // This may very well return an error.
2774 m_errorMonitor->VerifyFound();
2775 }
2776
2777 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2778 if (buffer_offset > 0) {
2779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2780 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2781 (void)err; // This may very well return an error.
2782 m_errorMonitor->VerifyFound();
2783 }
2784 }
Cort6c7dff72017-01-27 18:34:50 -08002785
2786 vkFreeMemory(device(), image_mem, NULL);
2787 vkFreeMemory(device(), buffer_mem, NULL);
2788 vkDestroyImage(device(), image, NULL);
2789 vkDestroyBuffer(device(), buffer, NULL);
2790 }
2791
Cort Stratton4c38bb52017-01-28 13:33:10 -08002792 // Try to bind memory to an object with an invalid memory type
2793 {
2794 VkImage image = VK_NULL_HANDLE;
2795 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2796 ASSERT_VK_SUCCESS(err);
2797 VkBuffer buffer = VK_NULL_HANDLE;
2798 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2799 ASSERT_VK_SUCCESS(err);
2800 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2801 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2802 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2803 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2804 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2805 image_alloc_info.allocationSize = image_mem_reqs.size;
2806 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2807 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002808 // Create a mask of available memory types *not* supported by these resources,
2809 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002810 VkPhysicalDeviceMemoryProperties memory_properties = {};
2811 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002812 VkDeviceMemory image_mem, buffer_mem;
2813
Cort Stratton4c38bb52017-01-28 13:33:10 -08002814 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002815 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002816 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2817 ASSERT_TRUE(pass);
2818 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2819 ASSERT_VK_SUCCESS(err);
2820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2821 err = vkBindImageMemory(device(), image, image_mem, 0);
2822 (void)err; // This may very well return an error.
2823 m_errorMonitor->VerifyFound();
2824 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 }
2826
Cort Stratton4c38bb52017-01-28 13:33:10 -08002827 uint32_t buffer_unsupported_mem_type_bits =
2828 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002829 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002830 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2831 ASSERT_TRUE(pass);
2832 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2833 ASSERT_VK_SUCCESS(err);
2834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2835 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2836 (void)err; // This may very well return an error.
2837 m_errorMonitor->VerifyFound();
2838 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002840
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 vkDestroyImage(device(), image, NULL);
2842 vkDestroyBuffer(device(), buffer, NULL);
2843 }
2844
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002845 // Try to bind memory to an image created with sparse memory flags
2846 {
2847 VkImageCreateInfo sparse_image_create_info = image_create_info;
2848 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2849 VkImageFormatProperties image_format_properties = {};
2850 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2851 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2852 sparse_image_create_info.usage, sparse_image_create_info.flags,
2853 &image_format_properties);
2854 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2855 // most likely means sparse formats aren't supported here; skip this test.
2856 } else {
2857 ASSERT_VK_SUCCESS(err);
2858 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002859 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002860 return;
2861 } else {
2862 VkImage sparse_image = VK_NULL_HANDLE;
2863 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2864 ASSERT_VK_SUCCESS(err);
2865 VkMemoryRequirements sparse_mem_reqs = {};
2866 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2867 if (sparse_mem_reqs.memoryTypeBits != 0) {
2868 VkMemoryAllocateInfo sparse_mem_alloc = {};
2869 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2870 sparse_mem_alloc.pNext = NULL;
2871 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2872 sparse_mem_alloc.memoryTypeIndex = 0;
2873 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2874 ASSERT_TRUE(pass);
2875 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2876 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2877 ASSERT_VK_SUCCESS(err);
2878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2879 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2880 // This may very well return an error.
2881 (void)err;
2882 m_errorMonitor->VerifyFound();
2883 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2884 }
2885 vkDestroyImage(m_device->device(), sparse_image, NULL);
2886 }
2887 }
2888 }
2889
2890 // Try to bind memory to a buffer created with sparse memory flags
2891 {
2892 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2893 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2894 if (!m_device->phy().features().sparseResidencyBuffer) {
2895 // most likely means sparse formats aren't supported here; skip this test.
2896 } else {
2897 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2898 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2899 ASSERT_VK_SUCCESS(err);
2900 VkMemoryRequirements sparse_mem_reqs = {};
2901 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2902 if (sparse_mem_reqs.memoryTypeBits != 0) {
2903 VkMemoryAllocateInfo sparse_mem_alloc = {};
2904 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2905 sparse_mem_alloc.pNext = NULL;
2906 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2907 sparse_mem_alloc.memoryTypeIndex = 0;
2908 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2909 ASSERT_TRUE(pass);
2910 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2911 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2912 ASSERT_VK_SUCCESS(err);
2913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2914 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2915 // This may very well return an error.
2916 (void)err;
2917 m_errorMonitor->VerifyFound();
2918 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2919 }
2920 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2921 }
2922 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002923}
2924
Karl Schultz6addd812016-02-02 17:17:23 -07002925TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2926 VkResult err;
2927 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002928
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002930
Tony Barbour1fa09702017-03-16 12:09:08 -06002931 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002932
Karl Schultz6addd812016-02-02 17:17:23 -07002933 // Create an image object, allocate memory, destroy the object and then try
2934 // to bind it
2935 VkImage image;
2936 VkDeviceMemory mem;
2937 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultz6addd812016-02-02 17:17:23 -07002939 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2940 const int32_t tex_width = 32;
2941 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
2943 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002944 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2945 image_create_info.pNext = NULL;
2946 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2947 image_create_info.format = tex_format;
2948 image_create_info.extent.width = tex_width;
2949 image_create_info.extent.height = tex_height;
2950 image_create_info.extent.depth = 1;
2951 image_create_info.mipLevels = 1;
2952 image_create_info.arrayLayers = 1;
2953 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2954 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2955 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2956 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002957
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002958 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002959 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2960 mem_alloc.pNext = NULL;
2961 mem_alloc.allocationSize = 0;
2962 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Chia-I Wuf7458c52015-10-26 21:10:41 +08002964 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002965 ASSERT_VK_SUCCESS(err);
2966
Karl Schultz6addd812016-02-02 17:17:23 -07002967 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002968
2969 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002970 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002971 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002972
2973 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002974 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
2977 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002978 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002979 ASSERT_VK_SUCCESS(err);
2980
2981 // Now Try to bind memory to this destroyed object
2982 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2983 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002984 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002985
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002986 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002987
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002989}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002990
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002991TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2992 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2993
Tony Barbour1fa09702017-03-16 12:09:08 -06002994 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002995 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2996
2997 VkVertexInputBindingDescription input_binding;
2998 memset(&input_binding, 0, sizeof(input_binding));
2999
3000 VkVertexInputAttributeDescription input_attribs;
3001 memset(&input_attribs, 0, sizeof(input_attribs));
3002
3003 // Pick a really bad format for this purpose and make sure it should fail
3004 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3005 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3006 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003007 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003008 return;
3009 }
3010
3011 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003012 char const *vsSource =
3013 "#version 450\n"
3014 "\n"
3015 "out gl_PerVertex {\n"
3016 " vec4 gl_Position;\n"
3017 "};\n"
3018 "void main(){\n"
3019 " gl_Position = vec4(1);\n"
3020 "}\n";
3021 char const *fsSource =
3022 "#version 450\n"
3023 "\n"
3024 "layout(location=0) out vec4 color;\n"
3025 "void main(){\n"
3026 " color = vec4(1);\n"
3027 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003028
3029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3030 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3031 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3032
3033 VkPipelineObj pipe(m_device);
3034 pipe.AddColorAttachment();
3035 pipe.AddShader(&vs);
3036 pipe.AddShader(&fs);
3037
3038 pipe.AddVertexInputBindings(&input_binding, 1);
3039 pipe.AddVertexInputAttribs(&input_attribs, 1);
3040
3041 VkDescriptorSetObj descriptorSet(m_device);
3042 descriptorSet.AppendDummy();
3043 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3044
3045 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3046
3047 m_errorMonitor->VerifyFound();
3048}
3049
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003050TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003051 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003052 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003053
3054 VkMemoryPropertyFlags reqs = 0;
3055 VkImageCreateInfo image_create_info = {};
3056 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3057 image_create_info.pNext = NULL;
3058 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3059 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3060 image_create_info.extent.width = 256;
3061 image_create_info.extent.height = 256;
3062 image_create_info.extent.depth = 1;
3063 image_create_info.mipLevels = 1;
3064 image_create_info.arrayLayers = 1;
3065 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3066 image_create_info.flags = 0;
3067
3068 VkImageBlit blit_region = {};
3069 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3070 blit_region.srcSubresource.baseArrayLayer = 0;
3071 blit_region.srcSubresource.layerCount = 1;
3072 blit_region.srcSubresource.mipLevel = 0;
3073 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3074 blit_region.dstSubresource.baseArrayLayer = 0;
3075 blit_region.dstSubresource.layerCount = 1;
3076 blit_region.dstSubresource.mipLevel = 0;
3077
3078 // Create two images, the source with sampleCount = 2, and attempt to blit
3079 // between them
3080 {
3081 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003082 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003083 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003084 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003085 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003086 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003087 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003088 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003089 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003090 m_errorMonitor->SetDesiredFailureMsg(
3091 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3092 "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 -06003093 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3094 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 m_errorMonitor->VerifyFound();
3096 m_commandBuffer->EndCommandBuffer();
3097 }
3098
3099 // Create two images, the dest with sampleCount = 4, and attempt to blit
3100 // between them
3101 {
3102 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003103 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003104 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003105 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003106 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003107 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003108 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003109 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003110 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003111 m_errorMonitor->SetDesiredFailureMsg(
3112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3113 "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 -06003114 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3115 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 m_errorMonitor->VerifyFound();
3117 m_commandBuffer->EndCommandBuffer();
3118 }
3119
3120 VkBufferImageCopy copy_region = {};
3121 copy_region.bufferRowLength = 128;
3122 copy_region.bufferImageHeight = 128;
3123 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3124 copy_region.imageSubresource.layerCount = 1;
3125 copy_region.imageExtent.height = 64;
3126 copy_region.imageExtent.width = 64;
3127 copy_region.imageExtent.depth = 1;
3128
3129 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3130 // buffer to image
3131 {
3132 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003133 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3134 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003135 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003136 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003137 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003138 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003139 m_errorMonitor->SetDesiredFailureMsg(
3140 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3141 "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 -06003142 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3143 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003144 m_errorMonitor->VerifyFound();
3145 m_commandBuffer->EndCommandBuffer();
3146 }
3147
3148 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3149 // image to buffer
3150 {
3151 vk_testing::Buffer dst_buffer;
3152 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3153 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003154 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003155 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003156 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003157 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003158 m_errorMonitor->SetDesiredFailureMsg(
3159 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3160 "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 -06003161 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003162 dst_buffer.handle(), 1, &copy_region);
3163 m_errorMonitor->VerifyFound();
3164 m_commandBuffer->EndCommandBuffer();
3165 }
3166}
3167
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003168TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003169 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003170
3171 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003172 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003173 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003174 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003175 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003176 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003177
3178 VkImageBlit blitRegion = {};
3179 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3180 blitRegion.srcSubresource.baseArrayLayer = 0;
3181 blitRegion.srcSubresource.layerCount = 1;
3182 blitRegion.srcSubresource.mipLevel = 0;
3183 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3184 blitRegion.dstSubresource.baseArrayLayer = 0;
3185 blitRegion.dstSubresource.layerCount = 1;
3186 blitRegion.dstSubresource.mipLevel = 0;
3187
Dave Houlton34df4cb2016-12-01 16:43:06 -07003188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3189
3190 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3191 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003192
3193 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003194 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003195 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003196 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003197
3198 m_errorMonitor->VerifyFound();
3199
Dave Houlton34df4cb2016-12-01 16:43:06 -07003200 // Test should generate 2 VU failures
3201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003203
3204 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
Dave Houlton34df4cb2016-12-01 16:43:06 -07003208 // TODO: Note that this only verifies that at least one of the VU enums was found
3209 // 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 -06003210 m_errorMonitor->VerifyFound();
3211
Tony Barbour552f6c02016-12-21 14:34:07 -07003212 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213}
3214
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003215TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3216 VkResult err;
3217 bool pass;
3218
3219 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003220 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003221
3222 // If w/d/h granularity is 1, test is not meaningful
3223 // TODO: When virtual device limits are available, create a set of limits for this test that
3224 // will always have a granularity of > 1 for w, h, and d
3225 auto index = m_device->graphics_queue_node_index_;
3226 auto queue_family_properties = m_device->phy().queue_properties();
3227
3228 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3229 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3230 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3231 return;
3232 }
3233
3234 // Create two images of different types and try to copy between them
3235 VkImage srcImage;
3236 VkImage dstImage;
3237 VkDeviceMemory srcMem;
3238 VkDeviceMemory destMem;
3239 VkMemoryRequirements memReqs;
3240
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003241 VkImageCreateInfo image_create_info = {};
3242 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3243 image_create_info.pNext = NULL;
3244 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3245 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3246 image_create_info.extent.width = 32;
3247 image_create_info.extent.height = 32;
3248 image_create_info.extent.depth = 1;
3249 image_create_info.mipLevels = 1;
3250 image_create_info.arrayLayers = 4;
3251 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3252 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3253 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3254 image_create_info.flags = 0;
3255
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003256 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003257 ASSERT_VK_SUCCESS(err);
3258
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003259 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003260 ASSERT_VK_SUCCESS(err);
3261
3262 // Allocate memory
3263 VkMemoryAllocateInfo memAlloc = {};
3264 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3265 memAlloc.pNext = NULL;
3266 memAlloc.allocationSize = 0;
3267 memAlloc.memoryTypeIndex = 0;
3268
3269 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3270 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003271 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 ASSERT_TRUE(pass);
3273 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3274 ASSERT_VK_SUCCESS(err);
3275
3276 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3277 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003278 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003279 ASSERT_VK_SUCCESS(err);
3280 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3281 ASSERT_VK_SUCCESS(err);
3282
3283 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3284 ASSERT_VK_SUCCESS(err);
3285 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3286 ASSERT_VK_SUCCESS(err);
3287
Tony Barbour552f6c02016-12-21 14:34:07 -07003288 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 VkImageCopy copyRegion;
3290 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3291 copyRegion.srcSubresource.mipLevel = 0;
3292 copyRegion.srcSubresource.baseArrayLayer = 0;
3293 copyRegion.srcSubresource.layerCount = 1;
3294 copyRegion.srcOffset.x = 0;
3295 copyRegion.srcOffset.y = 0;
3296 copyRegion.srcOffset.z = 0;
3297 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3298 copyRegion.dstSubresource.mipLevel = 0;
3299 copyRegion.dstSubresource.baseArrayLayer = 0;
3300 copyRegion.dstSubresource.layerCount = 1;
3301 copyRegion.dstOffset.x = 0;
3302 copyRegion.dstOffset.y = 0;
3303 copyRegion.dstOffset.z = 0;
3304 copyRegion.extent.width = 1;
3305 copyRegion.extent.height = 1;
3306 copyRegion.extent.depth = 1;
3307
3308 // Introduce failure by setting srcOffset to a bad granularity value
3309 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3311 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003312 m_errorMonitor->VerifyFound();
3313
3314 // Introduce failure by setting extent to a bad granularity value
3315 copyRegion.srcOffset.y = 0;
3316 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3318 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003319 m_errorMonitor->VerifyFound();
3320
3321 // Now do some buffer/image copies
3322 vk_testing::Buffer buffer;
3323 VkMemoryPropertyFlags reqs = 0;
3324 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3325 VkBufferImageCopy region = {};
3326 region.bufferOffset = 0;
3327 region.bufferRowLength = 3;
3328 region.bufferImageHeight = 128;
3329 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3330 region.imageSubresource.layerCount = 1;
3331 region.imageExtent.height = 16;
3332 region.imageExtent.width = 16;
3333 region.imageExtent.depth = 1;
3334 region.imageOffset.x = 0;
3335 region.imageOffset.y = 0;
3336 region.imageOffset.z = 0;
3337
3338 // Introduce failure by setting bufferRowLength to a bad granularity value
3339 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3341 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3342 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344 region.bufferRowLength = 128;
3345
3346 // Introduce failure by setting bufferOffset to a bad granularity value
3347 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3350 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003351 m_errorMonitor->VerifyFound();
3352 region.bufferOffset = 0;
3353
3354 // Introduce failure by setting bufferImageHeight to a bad granularity value
3355 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3357 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3358 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003359 m_errorMonitor->VerifyFound();
3360 region.bufferImageHeight = 128;
3361
3362 // Introduce failure by setting imageExtent to a bad granularity value
3363 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3365 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3366 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003367 m_errorMonitor->VerifyFound();
3368 region.imageExtent.width = 16;
3369
3370 // Introduce failure by setting imageOffset to a bad granularity value
3371 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3373 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3374 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003375 m_errorMonitor->VerifyFound();
3376
Tony Barbour552f6c02016-12-21 14:34:07 -07003377 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003378
3379 vkDestroyImage(m_device->device(), srcImage, NULL);
3380 vkDestroyImage(m_device->device(), dstImage, NULL);
3381 vkFreeMemory(m_device->device(), srcMem, NULL);
3382 vkFreeMemory(m_device->device(), destMem, NULL);
3383}
3384
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003385TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003386 TEST_DESCRIPTION(
3387 "Submit command buffer created using one queue family and "
3388 "attempt to submit them on a queue created in a different "
3389 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003390
Tony Barbour1fa09702017-03-16 12:09:08 -06003391 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003392
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003393 // This test is meaningless unless we have multiple queue families
3394 auto queue_family_properties = m_device->phy().queue_properties();
3395 if (queue_family_properties.size() < 2) {
3396 return;
3397 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003399 // Get safe index of another queue family
3400 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003401 VkQueue other_queue;
3402 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3403
3404 // Record an empty cmd buffer
3405 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3406 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3407 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3408 vkEndCommandBuffer(m_commandBuffer->handle());
3409
3410 // And submit on the wrong queue
3411 VkSubmitInfo submit_info = {};
3412 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3413 submit_info.commandBufferCount = 1;
3414 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003415 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416
3417 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003418}
3419
Chris Forbes4c24a922016-11-16 08:59:10 +13003420TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003421 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003422
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003423 // There are no attachments, but refer to attachment 0.
3424 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003425 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003426 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003427 };
3428
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003429 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003430 VkRenderPass rp;
3431
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003432 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003434 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3435 m_errorMonitor->VerifyFound();
3436}
3437
Chris Forbesa58c4522016-09-28 15:19:39 +13003438TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3439 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003440 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003441
3442 // A renderpass with two subpasses, both writing the same attachment.
3443 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003444 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3445 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3446 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003447 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003448 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003449 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003450 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3451 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003452 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003453 VkSubpassDependency dep = {0,
3454 1,
3455 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3456 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3457 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3458 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3459 VK_DEPENDENCY_BY_REGION_BIT};
3460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkRenderPass rp;
3462 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3463 ASSERT_VK_SUCCESS(err);
3464
3465 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003466 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003467 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3468
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003469 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003470 VkFramebuffer fb;
3471 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3472 ASSERT_VK_SUCCESS(err);
3473
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003474 char const *vsSource =
3475 "#version 450\n"
3476 "void main() { gl_Position = vec4(1); }\n";
3477 char const *fsSource =
3478 "#version 450\n"
3479 "layout(location=0) out vec4 color;\n"
3480 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003481
3482 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3483 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3484 VkPipelineObj pipe(m_device);
3485 pipe.AddColorAttachment();
3486 pipe.AddShader(&vs);
3487 pipe.AddShader(&fs);
3488 VkViewport view_port = {};
3489 m_viewports.push_back(view_port);
3490 pipe.SetViewport(m_viewports);
3491 VkRect2D rect = {};
3492 m_scissors.push_back(rect);
3493 pipe.SetScissor(m_scissors);
3494
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003495 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003496 VkPipelineLayout pl;
3497 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3498 ASSERT_VK_SUCCESS(err);
3499 pipe.CreateVKPipeline(pl, rp);
3500
Tony Barbour552f6c02016-12-21 14:34:07 -07003501 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003502
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003503 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3504 nullptr,
3505 rp,
3506 fb,
3507 {{
3508 0, 0,
3509 },
3510 {32, 32}},
3511 0,
3512 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003513
3514 // subtest 1: bind in the wrong subpass
3515 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3516 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003517 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 +13003518 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3519 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3520 m_errorMonitor->VerifyFound();
3521
3522 vkCmdEndRenderPass(m_commandBuffer->handle());
3523
3524 // subtest 2: bind in correct subpass, then transition to next subpass
3525 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3526 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3527 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003528 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 +13003529 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3530 m_errorMonitor->VerifyFound();
3531
3532 vkCmdEndRenderPass(m_commandBuffer->handle());
3533
Tony Barbour552f6c02016-12-21 14:34:07 -07003534 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003535
3536 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3537 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3538 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3539}
3540
Tony Barbour4e919972016-08-09 13:27:40 -06003541TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003542 TEST_DESCRIPTION(
3543 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3544 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003545 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3547
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3549 "Cannot execute a render pass with renderArea "
3550 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003551
3552 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3553 m_renderPassBeginInfo.renderArea.extent.width = 257;
3554 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003555 m_commandBuffer->BeginCommandBuffer();
3556 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003557 m_errorMonitor->VerifyFound();
3558}
3559
3560TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003561 TEST_DESCRIPTION(
3562 "Generate INDEPENDENT_BLEND by disabling independent "
3563 "blend and then specifying different blend states for two "
3564 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003565 VkPhysicalDeviceFeatures features = {};
3566 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003567 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003568
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3570 "Invalid Pipeline CreateInfo: If independent blend feature not "
3571 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003572
Cody Northropc31a84f2016-08-22 10:41:47 -06003573 VkDescriptorSetObj descriptorSet(m_device);
3574 descriptorSet.AppendDummy();
3575 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003576
Cody Northropc31a84f2016-08-22 10:41:47 -06003577 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003578 // Create a renderPass with two color attachments
3579 VkAttachmentReference attachments[2] = {};
3580 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003581 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003582 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3583
3584 VkSubpassDescription subpass = {};
3585 subpass.pColorAttachments = attachments;
3586 subpass.colorAttachmentCount = 2;
3587
3588 VkRenderPassCreateInfo rpci = {};
3589 rpci.subpassCount = 1;
3590 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003591 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003592
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 VkAttachmentDescription attach_desc[2] = {};
3594 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3595 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3596 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3597 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3598 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3599 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3600 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3601 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003602
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3605
3606 VkRenderPass renderpass;
3607 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003608 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003609 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003610
Cody Northropc31a84f2016-08-22 10:41:47 -06003611 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3612 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3613 att_state1.blendEnable = VK_TRUE;
3614 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3615 att_state2.blendEnable = VK_FALSE;
3616 pipeline.AddColorAttachment(0, &att_state1);
3617 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003618 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003619 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003620 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003621}
3622
Mike Weiblen40b160e2017-02-06 19:21:52 -07003623// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3624TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3625 TEST_DESCRIPTION(
3626 "Create a graphics pipeline that is incompatible with the requirements "
3627 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003628 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003629
3630 VkDescriptorSetObj ds_obj(m_device);
3631 ds_obj.AppendDummy();
3632 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3633
3634 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3635
3636 VkPipelineColorBlendAttachmentState att_state1 = {};
3637 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3638 att_state1.blendEnable = VK_TRUE;
3639
3640 VkRenderpassObj rp_obj(m_device);
3641
3642 {
3643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3644 VkPipelineObj pipeline(m_device);
3645 pipeline.AddShader(&vs_obj);
3646 pipeline.AddColorAttachment(0, &att_state1);
3647
3648 VkGraphicsPipelineCreateInfo info = {};
3649 pipeline.InitGraphicsPipelineCreateInfo(&info);
3650 info.pColorBlendState = nullptr;
3651
3652 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3653 m_errorMonitor->VerifyFound();
3654 }
3655}
3656
Cort Stratton7547f772017-05-04 15:18:52 -07003657TEST_F(VkLayerTest, CreateRenderPassAttachments) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003658 TEST_DESCRIPTION(
Cort Stratton7547f772017-05-04 15:18:52 -07003659 "Ensure that CreateRenderPass produces the expected validation errors "
3660 "when a subpass's attachments violate the valid usage conditions.");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003661
Tony Barbour1fa09702017-03-16 12:09:08 -06003662 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003663
Cort Stratton7547f772017-05-04 15:18:52 -07003664 std::vector<VkAttachmentDescription> attachments = {
3665 // input attachments
3666 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3667 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_GENERAL,
3668 VK_IMAGE_LAYOUT_GENERAL},
3669 // color attachments
3670 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3671 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3672 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3673 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3674 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3675 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3676 // depth attachment
3677 {0, VK_FORMAT_D24_UNORM_S8_UINT, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3678 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
3679 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
3680 // resolve attachment
3681 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3682 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3683 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3684 // preserve attachments
3685 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3686 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3687 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3688 };
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003689
Cort Stratton7547f772017-05-04 15:18:52 -07003690 std::vector<VkAttachmentReference> input = {
3691 {0, VK_IMAGE_LAYOUT_GENERAL},
3692 };
3693 std::vector<VkAttachmentReference> color = {
3694 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3695 };
3696 VkAttachmentReference depth = {3, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
3697 std::vector<VkAttachmentReference> resolve = {
3698 {4, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3699 };
3700 std::vector<uint32_t> preserve = {5};
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003701
Cort Stratton7547f772017-05-04 15:18:52 -07003702 VkSubpassDescription subpass = {0,
3703 VK_PIPELINE_BIND_POINT_GRAPHICS,
3704 (uint32_t)input.size(),
3705 input.data(),
3706 (uint32_t)color.size(),
3707 color.data(),
3708 resolve.data(),
3709 &depth,
3710 (uint32_t)preserve.size(),
3711 preserve.data()};
3712
3713 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3714 nullptr,
3715 0,
3716 (uint32_t)attachments.size(),
3717 attachments.data(),
3718 1,
3719 &subpass,
3720 0,
3721 nullptr};
3722
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003723 VkRenderPass rp;
Cort Stratton7547f772017-05-04 15:18:52 -07003724 VkResult err;
3725 // Test too many color attachments
3726 {
3727 std::vector<VkAttachmentReference> too_many_colors(m_device->props.limits.maxColorAttachments + 1, color[0]);
3728 subpass.colorAttachmentCount = (uint32_t)too_many_colors.size();
3729 subpass.pColorAttachments = too_many_colors.data();
3730 subpass.pResolveAttachments = NULL;
3731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00348);
3732 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3733 m_errorMonitor->VerifyFound();
3734 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3735 subpass.colorAttachmentCount = (uint32_t)color.size();
3736 subpass.pColorAttachments = color.data();
3737 subpass.pResolveAttachments = resolve.data();
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003738 }
Cort Stratton7547f772017-05-04 15:18:52 -07003739 // Test sample count mismatch between color buffers
3740 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3742 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003743 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003744 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003745 attachments[subpass.pColorAttachments[1].attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3746 // Test sample count mismatch between color buffers and depth buffer
3747 attachments[subpass.pDepthStencilAttachment->attachment].samples = VK_SAMPLE_COUNT_8_BIT;
3748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00337);
3749 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbesc5389742016-06-29 11:49:23 +12003750 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003751 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003752 attachments[subpass.pDepthStencilAttachment->attachment].samples = attachments[subpass.pColorAttachments[0].attachment].samples;
3753 // Test resolve attachment with UNUSED color attachment
3754 color[0].attachment = VK_ATTACHMENT_UNUSED;
3755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00350);
3756 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003757 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003758 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Cort Stratton7547f772017-05-04 15:18:52 -07003759 color[0].attachment = 1;
3760 // Test resolve from a single-sampled color attachment
3761 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3762 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_1_BIT; // avoid mismatch (00337)
3763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00351);
3764 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3765 m_errorMonitor->VerifyFound();
3766 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3767 attachments[subpass.pColorAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3768 attachments[subpass.pColorAttachments[1].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3769 // Test resolve to a multi-sampled resolve attachment
3770 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_4_BIT;
3771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00352);
3772 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3773 m_errorMonitor->VerifyFound();
3774 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3775 attachments[subpass.pResolveAttachments[0].attachment].samples = VK_SAMPLE_COUNT_1_BIT;
3776 // Test with color/resolve format mismatch
3777 attachments[subpass.pColorAttachments[0].attachment].format = VK_FORMAT_R8G8B8A8_SRGB;
3778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00353);
3779 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3780 m_errorMonitor->VerifyFound();
3781 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3782 attachments[subpass.pColorAttachments[0].attachment].format = attachments[subpass.pResolveAttachments[0].attachment].format;
3783 // Test for UNUSED preserve attachments
3784 preserve[0] = VK_ATTACHMENT_UNUSED;
3785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00356);
3786 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3787 m_errorMonitor->VerifyFound();
3788 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3789 preserve[0] = 5;
3790 // Test for preserve attachments used elsewhere in the subpass
3791 color[0].attachment = preserve[0];
3792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00357);
3793 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3794 m_errorMonitor->VerifyFound();
3795 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3796 color[0].attachment = 1;
3797 // test for layout mismatch between input attachment and color attachment
3798 input[0].attachment = color[0].attachment;
3799 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3801 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3802 m_errorMonitor->VerifyFound();
3803 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3804 input[0].attachment = 0;
3805 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3806 // test for layout mismatch between input attachment and depth attachment
3807 input[0].attachment = depth.attachment;
3808 input[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
3809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00358);
3810 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3811 m_errorMonitor->VerifyFound();
3812 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3813 input[0].attachment = 0;
3814 input[0].layout = VK_IMAGE_LAYOUT_GENERAL;
3815 // Test for attachment used first as input with loadOp=CLEAR
3816 {
3817 std::vector<VkSubpassDescription> subpasses = {subpass, subpass, subpass};
3818 subpasses[0].inputAttachmentCount = 0;
3819 subpasses[1].inputAttachmentCount = 0;
3820 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
3821 VkRenderPassCreateInfo rpci_multipass = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
3822 nullptr,
3823 0,
3824 (uint32_t)attachments.size(),
3825 attachments.data(),
3826 (uint32_t)subpasses.size(),
3827 subpasses.data(),
3828 0,
3829 nullptr};
3830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00349);
3831 err = vkCreateRenderPass(m_device->device(), &rpci_multipass, nullptr, &rp);
3832 m_errorMonitor->VerifyFound();
3833 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
3834 attachments[input[0].attachment].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
3835 }
Chris Forbes3f128ef2016-06-29 14:58:53 +12003836}
3837
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003838TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003839 TEST_DESCRIPTION(
3840 "Hit errors when attempting to create a framebuffer :\n"
3841 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3842 " 2. Use a color image as depthStencil attachment\n"
3843 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3844 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3845 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3846 " 6. Framebuffer attachment where dimensions don't match\n"
Cort Stratton8133ec22017-04-27 16:25:03 +02003847 " 7. Framebuffer attachment where dimensions don't match\n"
3848 " 8. Framebuffer attachment w/o identity swizzle\n"
3849 " 9. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003850
Tony Barbour1fa09702017-03-16 12:09:08 -06003851 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3853
Cort Stratton8133ec22017-04-27 16:25:03 +02003854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00404);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003855
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003856 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003857 VkAttachmentReference attach = {};
3858 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3859 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003860 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003861 VkRenderPassCreateInfo rpci = {};
3862 rpci.subpassCount = 1;
3863 rpci.pSubpasses = &subpass;
3864 rpci.attachmentCount = 1;
3865 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003866 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003867 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003868 rpci.pAttachments = &attach_desc;
3869 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3870 VkRenderPass rp;
3871 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3872 ASSERT_VK_SUCCESS(err);
3873
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003874 VkImageView ivs[2];
3875 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3876 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003877 VkFramebufferCreateInfo fb_info = {};
3878 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3879 fb_info.pNext = NULL;
3880 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003881 // Set mis-matching attachmentCount
3882 fb_info.attachmentCount = 2;
3883 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003884 fb_info.width = 100;
3885 fb_info.height = 100;
3886 fb_info.layers = 1;
3887
3888 VkFramebuffer fb;
3889 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3890
3891 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 if (err == VK_SUCCESS) {
3893 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3894 }
3895 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003896
3897 // Create a renderPass with a depth-stencil attachment created with
3898 // IMAGE_USAGE_COLOR_ATTACHMENT
3899 // Add our color attachment to pDepthStencilAttachment
3900 subpass.pDepthStencilAttachment = &attach;
3901 subpass.pColorAttachments = NULL;
3902 VkRenderPass rp_ds;
3903 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3904 ASSERT_VK_SUCCESS(err);
3905 // Set correct attachment count, but attachment has COLOR usage bit set
3906 fb_info.attachmentCount = 1;
3907 fb_info.renderPass = rp_ds;
3908
Cort Stratton8133ec22017-04-27 16:25:03 +02003909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00406);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003910 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3911
3912 m_errorMonitor->VerifyFound();
3913 if (err == VK_SUCCESS) {
3914 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3915 }
3916 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003917
3918 // Create new renderpass with alternate attachment format from fb
3919 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3920 subpass.pDepthStencilAttachment = NULL;
3921 subpass.pColorAttachments = &attach;
3922 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3923 ASSERT_VK_SUCCESS(err);
3924
3925 // Cause error due to mis-matched formats between rp & fb
3926 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3927 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00408);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003929 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3930
3931 m_errorMonitor->VerifyFound();
3932 if (err == VK_SUCCESS) {
3933 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3934 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003935 vkDestroyRenderPass(m_device->device(), rp, NULL);
3936
3937 // Create new renderpass with alternate sample count from fb
3938 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3939 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3940 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3941 ASSERT_VK_SUCCESS(err);
3942
3943 // Cause error due to mis-matched sample count between rp & fb
3944 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00409);
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003946 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3947
3948 m_errorMonitor->VerifyFound();
3949 if (err == VK_SUCCESS) {
3950 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3951 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003952
3953 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003954
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003955 {
3956 // Create an image with 2 mip levels.
3957 VkImageObj image(m_device);
3958 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3959 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003960
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003961 // Create a image view with two mip levels.
3962 VkImageView view;
3963 VkImageViewCreateInfo ivci = {};
3964 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3965 ivci.image = image.handle();
3966 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3967 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3968 ivci.subresourceRange.layerCount = 1;
3969 ivci.subresourceRange.baseMipLevel = 0;
3970 // Set level count to 2 (only 1 is allowed for FB attachment)
3971 ivci.subresourceRange.levelCount = 2;
3972 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3973 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3974 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003975
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003976 // Re-create renderpass to have matching sample count
3977 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3978 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3979 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003981 fb_info.renderPass = rp;
3982 fb_info.pAttachments = &view;
Cort Stratton8133ec22017-04-27 16:25:03 +02003983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00411);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003984 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3985
3986 m_errorMonitor->VerifyFound();
3987 if (err == VK_SUCCESS) {
3988 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3989 }
3990 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003991 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003992
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003993 // Update view to original color buffer and grow FB dimensions too big
3994 fb_info.pAttachments = ivs;
3995 fb_info.height = 1024;
3996 fb_info.width = 1024;
3997 fb_info.layers = 2;
Cort Stratton8133ec22017-04-27 16:25:03 +02003998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06003999 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4000
4001 m_errorMonitor->VerifyFound();
4002 if (err == VK_SUCCESS) {
4003 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4004 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004005
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004006 {
4007 // Create an image with one mip level.
4008 VkImageObj image(m_device);
4009 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4010 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004011
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004012 // Create view attachment with non-identity swizzle
4013 VkImageView view;
4014 VkImageViewCreateInfo ivci = {};
4015 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4016 ivci.image = image.handle();
4017 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4018 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4019 ivci.subresourceRange.layerCount = 1;
4020 ivci.subresourceRange.baseMipLevel = 0;
4021 ivci.subresourceRange.levelCount = 1;
4022 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4023 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4024 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4025 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4026 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4027 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4028 ASSERT_VK_SUCCESS(err);
4029
4030 fb_info.pAttachments = &view;
4031 fb_info.height = 100;
4032 fb_info.width = 100;
4033 fb_info.layers = 1;
4034
Cort Stratton8133ec22017-04-27 16:25:03 +02004035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00412);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004036 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4037
4038 m_errorMonitor->VerifyFound();
4039 if (err == VK_SUCCESS) {
4040 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4041 }
4042 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004043 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004044
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004045 // reset attachment to color attachment
4046 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004047
4048 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004049 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004050 fb_info.height = 100;
4051 fb_info.layers = 1;
4052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Cort Stratton8133ec22017-04-27 16:25:03 +02004053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004054 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004055 m_errorMonitor->VerifyFound();
4056 if (err == VK_SUCCESS) {
4057 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4058 }
4059 // and width=0
4060 fb_info.width = 0;
4061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02806);
4062 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004063 m_errorMonitor->VerifyFound();
4064 if (err == VK_SUCCESS) {
4065 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4066 }
4067
4068 // Request fb that exceeds max height
4069 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004070 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004071 fb_info.layers = 1;
4072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Cort Stratton8133ec22017-04-27 16:25:03 +02004073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004074 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004075 m_errorMonitor->VerifyFound();
4076 if (err == VK_SUCCESS) {
4077 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4078 }
4079 // and height=0
4080 fb_info.height = 0;
4081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02807);
4082 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004083 m_errorMonitor->VerifyFound();
4084 if (err == VK_SUCCESS) {
4085 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4086 }
4087
4088 // Request fb that exceeds max layers
4089 fb_info.width = 100;
4090 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004091 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Cort Stratton8133ec22017-04-27 16:25:03 +02004093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004094 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004095 m_errorMonitor->VerifyFound();
4096 if (err == VK_SUCCESS) {
4097 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4098 }
4099 // and layers=0
4100 fb_info.layers = 0;
4101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02808);
4102 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read 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 Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 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 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinski33826372017-04-13 11:10:11 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Mark Lobodzinski33826372017-04-13 11:10:11 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinski33826372017-04-13 11:10:11 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005060 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005194 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005195 subpass.pColorAttachments = &attach;
5196 VkRenderPassCreateInfo rpci = {};
5197 rpci.subpassCount = 1;
5198 rpci.pSubpasses = &subpass;
5199 rpci.attachmentCount = 1;
5200 VkAttachmentDescription attach_desc = {};
5201 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5202 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5203 rpci.pAttachments = &attach_desc;
5204 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5205 VkRenderPass rp;
5206 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5207 ASSERT_VK_SUCCESS(err);
5208
5209 // Create a pipeline that uses the given renderpass
5210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5212
5213 VkPipelineLayout pipeline_layout;
5214 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5215 ASSERT_VK_SUCCESS(err);
5216
5217 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5218 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005220 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005221 vp_state_ci.pViewports = &vp;
5222 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005223 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 vp_state_ci.pScissors = &scissors;
5225
5226 VkPipelineShaderStageCreateInfo shaderStages[2];
5227 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5228
5229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005230 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 -06005231 // but add it to be able to run on more devices
5232 shaderStages[0] = vs.GetStageCreateInfo();
5233 shaderStages[1] = fs.GetStageCreateInfo();
5234
5235 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5236 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5237
5238 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5239 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5240 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5241
5242 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5243 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5244 rs_ci.rasterizerDiscardEnable = true;
5245 rs_ci.lineWidth = 1.0f;
5246
5247 VkPipelineColorBlendAttachmentState att = {};
5248 att.blendEnable = VK_FALSE;
5249 att.colorWriteMask = 0xf;
5250
5251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5253 cb_ci.attachmentCount = 1;
5254 cb_ci.pAttachments = &att;
5255
5256 VkGraphicsPipelineCreateInfo gp_ci = {};
5257 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5258 gp_ci.stageCount = 2;
5259 gp_ci.pStages = shaderStages;
5260 gp_ci.pVertexInputState = &vi_ci;
5261 gp_ci.pInputAssemblyState = &ia_ci;
5262 gp_ci.pViewportState = &vp_state_ci;
5263 gp_ci.pRasterizationState = &rs_ci;
5264 gp_ci.pColorBlendState = &cb_ci;
5265 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5266 gp_ci.layout = pipeline_layout;
5267 gp_ci.renderPass = rp;
5268
5269 VkPipelineCacheCreateInfo pc_ci = {};
5270 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5271
Dave Houlton756e6742017-03-23 14:33:22 -06005272 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 VkPipeline pipeline;
5274 VkPipelineCache pipe_cache;
5275 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5276 ASSERT_VK_SUCCESS(err);
5277
5278 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5279 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005280
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005281 // Bind pipeline to cmd buffer, will also bind renderpass
5282 m_commandBuffer->BeginCommandBuffer();
5283 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5284 m_commandBuffer->EndCommandBuffer();
5285
5286 VkSubmitInfo submit_info = {};
5287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5288 submit_info.commandBufferCount = 1;
5289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5290 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005291 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005292
5293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5294 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5295 m_errorMonitor->VerifyFound();
5296
5297 // Wait for queue to complete so we can safely destroy everything
5298 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005299 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005300 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005301 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5302 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5303 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5304 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5305}
5306
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005307TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005308 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005310
5311 VkImage image;
5312 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5313 VkImageCreateInfo image_create_info = {};
5314 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5315 image_create_info.pNext = NULL;
5316 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5317 image_create_info.format = tex_format;
5318 image_create_info.extent.width = 32;
5319 image_create_info.extent.height = 32;
5320 image_create_info.extent.depth = 1;
5321 image_create_info.mipLevels = 1;
5322 image_create_info.arrayLayers = 1;
5323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5324 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005326 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005327 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005328 ASSERT_VK_SUCCESS(err);
5329 // Have to bind memory to image before recording cmd in cmd buffer using it
5330 VkMemoryRequirements mem_reqs;
5331 VkDeviceMemory image_mem;
5332 bool pass;
5333 VkMemoryAllocateInfo mem_alloc = {};
5334 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5335 mem_alloc.pNext = NULL;
5336 mem_alloc.memoryTypeIndex = 0;
5337 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5338 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005339 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340 ASSERT_TRUE(pass);
5341 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5342 ASSERT_VK_SUCCESS(err);
5343
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005344 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005346 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005347
5348 m_commandBuffer->BeginCommandBuffer();
5349 VkClearColorValue ccv;
5350 ccv.float32[0] = 1.0f;
5351 ccv.float32[1] = 1.0f;
5352 ccv.float32[2] = 1.0f;
5353 ccv.float32[3] = 1.0f;
5354 VkImageSubresourceRange isr = {};
5355 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5356 isr.baseArrayLayer = 0;
5357 isr.baseMipLevel = 0;
5358 isr.layerCount = 1;
5359 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005360 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005361 m_commandBuffer->EndCommandBuffer();
5362
5363 m_errorMonitor->VerifyFound();
5364 vkDestroyImage(m_device->device(), image, NULL);
5365 vkFreeMemory(m_device->device(), image_mem, nullptr);
5366}
5367
5368TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005371
5372 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005373 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005374 VK_IMAGE_TILING_OPTIMAL, 0);
5375 ASSERT_TRUE(image.initialized());
5376
5377 VkBuffer buffer;
5378 VkDeviceMemory mem;
5379 VkMemoryRequirements mem_reqs;
5380
5381 VkBufferCreateInfo buf_info = {};
5382 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005383 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005384 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005385 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5386 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5387 ASSERT_VK_SUCCESS(err);
5388
5389 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5390
5391 VkMemoryAllocateInfo alloc_info = {};
5392 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005393 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005394 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005395 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 -06005396 if (!pass) {
5397 vkDestroyBuffer(m_device->device(), buffer, NULL);
5398 return;
5399 }
5400 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5401 ASSERT_VK_SUCCESS(err);
5402
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005403 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005405 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005406 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005407 region.bufferRowLength = 16;
5408 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005409 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5410
5411 region.imageSubresource.layerCount = 1;
5412 region.imageExtent.height = 4;
5413 region.imageExtent.width = 4;
5414 region.imageExtent.depth = 1;
5415 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005416 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5417 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005418 m_commandBuffer->EndCommandBuffer();
5419
5420 m_errorMonitor->VerifyFound();
5421
5422 vkDestroyBuffer(m_device->device(), buffer, NULL);
5423 vkFreeMemory(m_device->handle(), mem, NULL);
5424}
5425
Tobin Ehlis85940f52016-07-07 16:57:21 -06005426TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005427 TEST_DESCRIPTION(
5428 "Attempt to draw with a command buffer that is invalid "
5429 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005431
5432 VkEvent event;
5433 VkEventCreateInfo evci = {};
5434 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5435 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5436 ASSERT_VK_SUCCESS(result);
5437
5438 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005439 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005440 m_commandBuffer->EndCommandBuffer();
5441
Mark Lobodzinski33826372017-04-13 11:10:11 -06005442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005443 // Destroy event dependency prior to submit to cause ERROR
5444 vkDestroyEvent(m_device->device(), event, NULL);
5445
5446 VkSubmitInfo submit_info = {};
5447 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5448 submit_info.commandBufferCount = 1;
5449 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5450 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5451
5452 m_errorMonitor->VerifyFound();
5453}
5454
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005455TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005456 TEST_DESCRIPTION(
5457 "Attempt to draw with a command buffer that is invalid "
5458 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005459 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005460
5461 VkQueryPool query_pool;
5462 VkQueryPoolCreateInfo qpci{};
5463 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5464 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5465 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005466 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005467 ASSERT_VK_SUCCESS(result);
5468
5469 m_commandBuffer->BeginCommandBuffer();
5470 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5471 m_commandBuffer->EndCommandBuffer();
5472
Mark Lobodzinski33826372017-04-13 11:10:11 -06005473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005474 // Destroy query pool dependency prior to submit to cause ERROR
5475 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5476
5477 VkSubmitInfo submit_info = {};
5478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5479 submit_info.commandBufferCount = 1;
5480 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5482
5483 m_errorMonitor->VerifyFound();
5484}
5485
Tobin Ehlis24130d92016-07-08 15:50:53 -06005486TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005487 TEST_DESCRIPTION(
5488 "Attempt to draw with a command buffer that is invalid "
5489 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005490 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5492
5493 VkResult err;
5494
5495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5497
5498 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005500 ASSERT_VK_SUCCESS(err);
5501
5502 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5503 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5504 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005505 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005506 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005507 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005508 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005510
5511 VkPipelineShaderStageCreateInfo shaderStages[2];
5512 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5513
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005514 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005515 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 -06005516 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005517 shaderStages[0] = vs.GetStageCreateInfo();
5518 shaderStages[1] = fs.GetStageCreateInfo();
5519
5520 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5521 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5522
5523 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5524 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5525 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5526
5527 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5528 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005529 rs_ci.rasterizerDiscardEnable = true;
5530 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005531
5532 VkPipelineColorBlendAttachmentState att = {};
5533 att.blendEnable = VK_FALSE;
5534 att.colorWriteMask = 0xf;
5535
5536 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5537 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5538 cb_ci.attachmentCount = 1;
5539 cb_ci.pAttachments = &att;
5540
5541 VkGraphicsPipelineCreateInfo gp_ci = {};
5542 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5543 gp_ci.stageCount = 2;
5544 gp_ci.pStages = shaderStages;
5545 gp_ci.pVertexInputState = &vi_ci;
5546 gp_ci.pInputAssemblyState = &ia_ci;
5547 gp_ci.pViewportState = &vp_state_ci;
5548 gp_ci.pRasterizationState = &rs_ci;
5549 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005550 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5551 gp_ci.layout = pipeline_layout;
5552 gp_ci.renderPass = renderPass();
5553
5554 VkPipelineCacheCreateInfo pc_ci = {};
5555 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5556
5557 VkPipeline pipeline;
5558 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005559 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005560 ASSERT_VK_SUCCESS(err);
5561
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005562 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005563 ASSERT_VK_SUCCESS(err);
5564
5565 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005566 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567 m_commandBuffer->EndCommandBuffer();
5568 // Now destroy pipeline in order to cause error when submitting
5569 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5570
Mark Lobodzinski33826372017-04-13 11:10:11 -06005571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005572
5573 VkSubmitInfo submit_info = {};
5574 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5575 submit_info.commandBufferCount = 1;
5576 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5578
5579 m_errorMonitor->VerifyFound();
5580 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5581 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5582}
5583
Tobin Ehlis31289162016-08-17 14:57:58 -06005584TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005585 TEST_DESCRIPTION(
5586 "Attempt to draw with a command buffer that is invalid "
5587 "due to a bound descriptor set with a buffer dependency "
5588 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005590 ASSERT_NO_FATAL_FAILURE(InitViewport());
5591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5592
5593 VkDescriptorPoolSize ds_type_count = {};
5594 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5595 ds_type_count.descriptorCount = 1;
5596
5597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5599 ds_pool_ci.pNext = NULL;
5600 ds_pool_ci.maxSets = 1;
5601 ds_pool_ci.poolSizeCount = 1;
5602 ds_pool_ci.pPoolSizes = &ds_type_count;
5603
5604 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSetLayoutBinding dsl_binding = {};
5609 dsl_binding.binding = 0;
5610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5611 dsl_binding.descriptorCount = 1;
5612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5613 dsl_binding.pImmutableSamplers = NULL;
5614
5615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5617 ds_layout_ci.pNext = NULL;
5618 ds_layout_ci.bindingCount = 1;
5619 ds_layout_ci.pBindings = &dsl_binding;
5620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSet descriptorSet;
5625 VkDescriptorSetAllocateInfo alloc_info = {};
5626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5627 alloc_info.descriptorSetCount = 1;
5628 alloc_info.descriptorPool = ds_pool;
5629 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5635 pipeline_layout_ci.pNext = NULL;
5636 pipeline_layout_ci.setLayoutCount = 1;
5637 pipeline_layout_ci.pSetLayouts = &ds_layout;
5638
5639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005641 ASSERT_VK_SUCCESS(err);
5642
5643 // Create a buffer to update the descriptor with
5644 uint32_t qfi = 0;
5645 VkBufferCreateInfo buffCI = {};
5646 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5647 buffCI.size = 1024;
5648 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5649 buffCI.queueFamilyIndexCount = 1;
5650 buffCI.pQueueFamilyIndices = &qfi;
5651
5652 VkBuffer buffer;
5653 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5654 ASSERT_VK_SUCCESS(err);
5655 // Allocate memory and bind to buffer so we can make it to the appropriate
5656 // error
5657 VkMemoryAllocateInfo mem_alloc = {};
5658 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5659 mem_alloc.pNext = NULL;
5660 mem_alloc.allocationSize = 1024;
5661 mem_alloc.memoryTypeIndex = 0;
5662
5663 VkMemoryRequirements memReqs;
5664 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005665 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005666 if (!pass) {
5667 vkDestroyBuffer(m_device->device(), buffer, NULL);
5668 return;
5669 }
5670
5671 VkDeviceMemory mem;
5672 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5673 ASSERT_VK_SUCCESS(err);
5674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5675 ASSERT_VK_SUCCESS(err);
5676 // Correctly update descriptor to avoid "NOT_UPDATED" error
5677 VkDescriptorBufferInfo buffInfo = {};
5678 buffInfo.buffer = buffer;
5679 buffInfo.offset = 0;
5680 buffInfo.range = 1024;
5681
5682 VkWriteDescriptorSet descriptor_write;
5683 memset(&descriptor_write, 0, sizeof(descriptor_write));
5684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5685 descriptor_write.dstSet = descriptorSet;
5686 descriptor_write.dstBinding = 0;
5687 descriptor_write.descriptorCount = 1;
5688 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5689 descriptor_write.pBufferInfo = &buffInfo;
5690
5691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5692
5693 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005694 char const *vsSource =
5695 "#version 450\n"
5696 "\n"
5697 "out gl_PerVertex { \n"
5698 " vec4 gl_Position;\n"
5699 "};\n"
5700 "void main(){\n"
5701 " gl_Position = vec4(1);\n"
5702 "}\n";
5703 char const *fsSource =
5704 "#version 450\n"
5705 "\n"
5706 "layout(location=0) out vec4 x;\n"
5707 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5708 "void main(){\n"
5709 " x = vec4(bar.y);\n"
5710 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5713 VkPipelineObj pipe(m_device);
5714 pipe.AddShader(&vs);
5715 pipe.AddShader(&fs);
5716 pipe.AddColorAttachment();
5717 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5718
Tony Barbour552f6c02016-12-21 14:34:07 -07005719 m_commandBuffer->BeginCommandBuffer();
5720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005721 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5722 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5723 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005724
5725 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5726 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5727
Tobin Ehlis31289162016-08-17 14:57:58 -06005728 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005729 m_commandBuffer->EndRenderPass();
5730 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005732 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5733 vkDestroyBuffer(m_device->device(), buffer, NULL);
5734 // Attempt to submit cmd buffer
5735 VkSubmitInfo submit_info = {};
5736 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5737 submit_info.commandBufferCount = 1;
5738 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5740 m_errorMonitor->VerifyFound();
5741 // Cleanup
5742 vkFreeMemory(m_device->device(), mem, NULL);
5743
5744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5747}
5748
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005749TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005750 TEST_DESCRIPTION(
5751 "Attempt to draw with a command buffer that is invalid "
5752 "due to a bound descriptor sets with a combined image "
5753 "sampler having their image, sampler, and descriptor set "
5754 "each respectively destroyed and then attempting to "
5755 "submit associated cmd buffers. Attempt to destroy a "
5756 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005757 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005758 ASSERT_NO_FATAL_FAILURE(InitViewport());
5759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5760
5761 VkDescriptorPoolSize ds_type_count = {};
5762 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5763 ds_type_count.descriptorCount = 1;
5764
5765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5767 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005768 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005769 ds_pool_ci.maxSets = 1;
5770 ds_pool_ci.poolSizeCount = 1;
5771 ds_pool_ci.pPoolSizes = &ds_type_count;
5772
5773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005775 ASSERT_VK_SUCCESS(err);
5776
5777 VkDescriptorSetLayoutBinding dsl_binding = {};
5778 dsl_binding.binding = 0;
5779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5780 dsl_binding.descriptorCount = 1;
5781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5782 dsl_binding.pImmutableSamplers = NULL;
5783
5784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5786 ds_layout_ci.pNext = NULL;
5787 ds_layout_ci.bindingCount = 1;
5788 ds_layout_ci.pBindings = &dsl_binding;
5789 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 ASSERT_VK_SUCCESS(err);
5792
5793 VkDescriptorSet descriptorSet;
5794 VkDescriptorSetAllocateInfo alloc_info = {};
5795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5796 alloc_info.descriptorSetCount = 1;
5797 alloc_info.descriptorPool = ds_pool;
5798 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_VK_SUCCESS(err);
5801
5802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5804 pipeline_layout_ci.pNext = NULL;
5805 pipeline_layout_ci.setLayoutCount = 1;
5806 pipeline_layout_ci.pSetLayouts = &ds_layout;
5807
5808 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005810 ASSERT_VK_SUCCESS(err);
5811
5812 // Create images to update the descriptor with
5813 VkImage image;
5814 VkImage image2;
5815 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5816 const int32_t tex_width = 32;
5817 const int32_t tex_height = 32;
5818 VkImageCreateInfo image_create_info = {};
5819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5820 image_create_info.pNext = NULL;
5821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5822 image_create_info.format = tex_format;
5823 image_create_info.extent.width = tex_width;
5824 image_create_info.extent.height = tex_height;
5825 image_create_info.extent.depth = 1;
5826 image_create_info.mipLevels = 1;
5827 image_create_info.arrayLayers = 1;
5828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5831 image_create_info.flags = 0;
5832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5833 ASSERT_VK_SUCCESS(err);
5834 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5835 ASSERT_VK_SUCCESS(err);
5836
5837 VkMemoryRequirements memory_reqs;
5838 VkDeviceMemory image_memory;
5839 bool pass;
5840 VkMemoryAllocateInfo memory_info = {};
5841 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5842 memory_info.pNext = NULL;
5843 memory_info.allocationSize = 0;
5844 memory_info.memoryTypeIndex = 0;
5845 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5846 // Allocate enough memory for both images
5847 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005848 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005849 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005850 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005851 ASSERT_VK_SUCCESS(err);
5852 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5853 ASSERT_VK_SUCCESS(err);
5854 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005856 ASSERT_VK_SUCCESS(err);
5857
5858 VkImageViewCreateInfo image_view_create_info = {};
5859 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5860 image_view_create_info.image = image;
5861 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5862 image_view_create_info.format = tex_format;
5863 image_view_create_info.subresourceRange.layerCount = 1;
5864 image_view_create_info.subresourceRange.baseMipLevel = 0;
5865 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005866 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005867
5868 VkImageView view;
5869 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005870 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005871 ASSERT_VK_SUCCESS(err);
5872 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005874 ASSERT_VK_SUCCESS(err);
5875 // Create Samplers
5876 VkSamplerCreateInfo sampler_ci = {};
5877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5878 sampler_ci.pNext = NULL;
5879 sampler_ci.magFilter = VK_FILTER_NEAREST;
5880 sampler_ci.minFilter = VK_FILTER_NEAREST;
5881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5885 sampler_ci.mipLodBias = 1.0;
5886 sampler_ci.anisotropyEnable = VK_FALSE;
5887 sampler_ci.maxAnisotropy = 1;
5888 sampler_ci.compareEnable = VK_FALSE;
5889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5890 sampler_ci.minLod = 1.0;
5891 sampler_ci.maxLod = 1.0;
5892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5894 VkSampler sampler;
5895 VkSampler sampler2;
5896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5897 ASSERT_VK_SUCCESS(err);
5898 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5899 ASSERT_VK_SUCCESS(err);
5900 // Update descriptor with image and sampler
5901 VkDescriptorImageInfo img_info = {};
5902 img_info.sampler = sampler;
5903 img_info.imageView = view;
5904 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5905
5906 VkWriteDescriptorSet descriptor_write;
5907 memset(&descriptor_write, 0, sizeof(descriptor_write));
5908 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5909 descriptor_write.dstSet = descriptorSet;
5910 descriptor_write.dstBinding = 0;
5911 descriptor_write.descriptorCount = 1;
5912 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5913 descriptor_write.pImageInfo = &img_info;
5914
5915 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5916
5917 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005918 char const *vsSource =
5919 "#version 450\n"
5920 "\n"
5921 "out gl_PerVertex { \n"
5922 " vec4 gl_Position;\n"
5923 "};\n"
5924 "void main(){\n"
5925 " gl_Position = vec4(1);\n"
5926 "}\n";
5927 char const *fsSource =
5928 "#version 450\n"
5929 "\n"
5930 "layout(set=0, binding=0) uniform sampler2D s;\n"
5931 "layout(location=0) out vec4 x;\n"
5932 "void main(){\n"
5933 " x = texture(s, vec2(1));\n"
5934 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5937 VkPipelineObj pipe(m_device);
5938 pipe.AddShader(&vs);
5939 pipe.AddShader(&fs);
5940 pipe.AddColorAttachment();
5941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5942
5943 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005945 m_commandBuffer->BeginCommandBuffer();
5946 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005947 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5948 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5949 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005950 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5951 VkRect2D scissor = {{0, 0}, {16, 16}};
5952 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5953 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005954 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005955 m_commandBuffer->EndRenderPass();
5956 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005957 // Destroy sampler invalidates the cmd buffer, causing error on submit
5958 vkDestroySampler(m_device->device(), sampler, NULL);
5959 // Attempt to submit cmd buffer
5960 VkSubmitInfo submit_info = {};
5961 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5962 submit_info.commandBufferCount = 1;
5963 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5965 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005966
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005967 // Now re-update descriptor with valid sampler and delete image
5968 img_info.sampler = sampler2;
5969 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005970
5971 VkCommandBufferBeginInfo info = {};
5972 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5973 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5974
Mark Lobodzinski33826372017-04-13 11:10:11 -06005975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005976 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005977 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005978 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5979 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5980 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005981 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5982 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005983 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005984 m_commandBuffer->EndRenderPass();
5985 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005986 // Destroy image invalidates the cmd buffer, causing error on submit
5987 vkDestroyImage(m_device->device(), image, NULL);
5988 // Attempt to submit cmd buffer
5989 submit_info = {};
5990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5991 submit_info.commandBufferCount = 1;
5992 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5994 m_errorMonitor->VerifyFound();
5995 // Now update descriptor to be valid, but then free descriptor
5996 img_info.imageView = view2;
5997 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005998 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005999 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006000 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6001 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6002 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006003 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6004 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006005 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006006 m_commandBuffer->EndRenderPass();
6007 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006009
6010 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006012 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006013 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006014
6015 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006016 // 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 -07006017 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006018 m_errorMonitor->SetUnexpectedError(
6019 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6020 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006021 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006022 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6023
6024 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006030 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6031 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006032
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006033 // Cleanup
6034 vkFreeMemory(m_device->device(), image_memory, NULL);
6035 vkDestroySampler(m_device->device(), sampler2, NULL);
6036 vkDestroyImage(m_device->device(), image2, NULL);
6037 vkDestroyImageView(m_device->device(), view, NULL);
6038 vkDestroyImageView(m_device->device(), view2, NULL);
6039 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6042}
6043
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006044TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6045 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6046 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6047 ASSERT_NO_FATAL_FAILURE(InitViewport());
6048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6049
6050 VkDescriptorPoolSize ds_type_count = {};
6051 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6052 ds_type_count.descriptorCount = 1;
6053
6054 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6055 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6056 ds_pool_ci.pNext = NULL;
6057 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6058 ds_pool_ci.maxSets = 1;
6059 ds_pool_ci.poolSizeCount = 1;
6060 ds_pool_ci.pPoolSizes = &ds_type_count;
6061
6062 VkDescriptorPool ds_pool;
6063 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6064 ASSERT_VK_SUCCESS(err);
6065
6066 VkDescriptorSetLayoutBinding dsl_binding = {};
6067 dsl_binding.binding = 0;
6068 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6069 dsl_binding.descriptorCount = 1;
6070 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6071 dsl_binding.pImmutableSamplers = NULL;
6072
6073 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6074 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6075 ds_layout_ci.pNext = NULL;
6076 ds_layout_ci.bindingCount = 1;
6077 ds_layout_ci.pBindings = &dsl_binding;
6078 VkDescriptorSetLayout ds_layout;
6079 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6080 ASSERT_VK_SUCCESS(err);
6081
6082 VkDescriptorSet descriptorSet;
6083 VkDescriptorSetAllocateInfo alloc_info = {};
6084 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6085 alloc_info.descriptorSetCount = 1;
6086 alloc_info.descriptorPool = ds_pool;
6087 alloc_info.pSetLayouts = &ds_layout;
6088 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6089 ASSERT_VK_SUCCESS(err);
6090
6091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6093 pipeline_layout_ci.pNext = NULL;
6094 pipeline_layout_ci.setLayoutCount = 1;
6095 pipeline_layout_ci.pSetLayouts = &ds_layout;
6096
6097 VkPipelineLayout pipeline_layout;
6098 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6099 ASSERT_VK_SUCCESS(err);
6100
6101 // Create images to update the descriptor with
6102 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6103 VkImageObj image(m_device);
6104 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6105 0);
6106 ASSERT_TRUE(image.initialized());
6107
6108 VkImageViewCreateInfo image_view_create_info = {};
6109 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6110 image_view_create_info.image = image.handle();
6111 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6112 image_view_create_info.format = format;
6113 image_view_create_info.subresourceRange.layerCount = 1;
6114 image_view_create_info.subresourceRange.baseMipLevel = 0;
6115 image_view_create_info.subresourceRange.levelCount = 1;
6116 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6117
6118 VkImageView view;
6119 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6120 ASSERT_VK_SUCCESS(err);
6121 // Create Sampler
6122 VkSamplerCreateInfo sampler_ci = {};
6123 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6124 sampler_ci.pNext = NULL;
6125 sampler_ci.magFilter = VK_FILTER_NEAREST;
6126 sampler_ci.minFilter = VK_FILTER_NEAREST;
6127 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6128 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6129 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6130 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6131 sampler_ci.mipLodBias = 1.0;
6132 sampler_ci.anisotropyEnable = VK_FALSE;
6133 sampler_ci.maxAnisotropy = 1;
6134 sampler_ci.compareEnable = VK_FALSE;
6135 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6136 sampler_ci.minLod = 1.0;
6137 sampler_ci.maxLod = 1.0;
6138 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6139 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6140 VkSampler sampler;
6141 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6142 ASSERT_VK_SUCCESS(err);
6143 // Update descriptor with image and sampler
6144 VkDescriptorImageInfo img_info = {};
6145 img_info.sampler = sampler;
6146 img_info.imageView = view;
6147 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6148 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6149
6150 VkWriteDescriptorSet descriptor_write;
6151 memset(&descriptor_write, 0, sizeof(descriptor_write));
6152 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6153 descriptor_write.dstSet = descriptorSet;
6154 descriptor_write.dstBinding = 0;
6155 descriptor_write.descriptorCount = 1;
6156 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6157 descriptor_write.pImageInfo = &img_info;
6158
6159 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6160
6161 // Create PSO to be used for draw-time errors below
6162 char const *vsSource =
6163 "#version 450\n"
6164 "\n"
6165 "out gl_PerVertex { \n"
6166 " vec4 gl_Position;\n"
6167 "};\n"
6168 "void main(){\n"
6169 " gl_Position = vec4(1);\n"
6170 "}\n";
6171 char const *fsSource =
6172 "#version 450\n"
6173 "\n"
6174 "layout(set=0, binding=0) uniform sampler2D s;\n"
6175 "layout(location=0) out vec4 x;\n"
6176 "void main(){\n"
6177 " x = texture(s, vec2(1));\n"
6178 "}\n";
6179 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6180 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6181 VkPipelineObj pipe(m_device);
6182 pipe.AddShader(&vs);
6183 pipe.AddShader(&fs);
6184 pipe.AddColorAttachment();
6185 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6186
6187 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6188 cmd_buf.BeginCommandBuffer();
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006189 // record layout different than actual descriptor layout of SHADER_RO
6190 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski95512b72017-05-10 12:21:30 -06006191 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006192 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6193 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6194 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6195 VkRect2D scissor = {{0, 0}, {16, 16}};
6196 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6197 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6198 // At draw time the update layout will mis-match the actual layout
6199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6200 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6201 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6202 m_errorMonitor->SetDesiredFailureMsg(
6203 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6204 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6205 cmd_buf.Draw(1, 0, 0, 0);
6206 m_errorMonitor->VerifyFound();
6207 cmd_buf.EndRenderPass();
6208 cmd_buf.EndCommandBuffer();
6209 // Submit cmd buffer
6210 VkSubmitInfo submit_info = {};
6211 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6212 submit_info.commandBufferCount = 1;
6213 submit_info.pCommandBuffers = &cmd_buf.handle();
6214 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6215 vkQueueWaitIdle(m_device->m_queue);
6216 // Cleanup
6217 vkDestroySampler(m_device->device(), sampler, NULL);
6218 vkDestroyImageView(m_device->device(), view, NULL);
6219 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6220 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6221 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6222}
6223
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006224TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6225 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006226 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -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 descriptor_set;
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, &descriptor_set);
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 image to update the descriptor with
6281 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006282 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006283 ASSERT_TRUE(image.initialized());
6284
6285 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6286 // Create Sampler
6287 VkSamplerCreateInfo sampler_ci = {};
6288 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6289 sampler_ci.pNext = NULL;
6290 sampler_ci.magFilter = VK_FILTER_NEAREST;
6291 sampler_ci.minFilter = VK_FILTER_NEAREST;
6292 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6293 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6294 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6295 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6296 sampler_ci.mipLodBias = 1.0;
6297 sampler_ci.anisotropyEnable = VK_FALSE;
6298 sampler_ci.maxAnisotropy = 1;
6299 sampler_ci.compareEnable = VK_FALSE;
6300 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6301 sampler_ci.minLod = 1.0;
6302 sampler_ci.maxLod = 1.0;
6303 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6304 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6305 VkSampler sampler;
6306 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6307 ASSERT_VK_SUCCESS(err);
6308 // Update descriptor with image and sampler
6309 VkDescriptorImageInfo img_info = {};
6310 img_info.sampler = sampler;
6311 img_info.imageView = view;
6312 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6313
6314 VkWriteDescriptorSet descriptor_write;
6315 memset(&descriptor_write, 0, sizeof(descriptor_write));
6316 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6317 descriptor_write.dstSet = descriptor_set;
6318 descriptor_write.dstBinding = 0;
6319 descriptor_write.descriptorCount = 1;
6320 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6321 descriptor_write.pImageInfo = &img_info;
6322
6323 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6324
6325 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006326 char const *vsSource =
6327 "#version 450\n"
6328 "\n"
6329 "out gl_PerVertex { \n"
6330 " vec4 gl_Position;\n"
6331 "};\n"
6332 "void main(){\n"
6333 " gl_Position = vec4(1);\n"
6334 "}\n";
6335 char const *fsSource =
6336 "#version 450\n"
6337 "\n"
6338 "layout(set=0, binding=0) uniform sampler2D s;\n"
6339 "layout(location=0) out vec4 x;\n"
6340 "void main(){\n"
6341 " x = texture(s, vec2(1));\n"
6342 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006343 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6344 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6345 VkPipelineObj pipe(m_device);
6346 pipe.AddShader(&vs);
6347 pipe.AddShader(&fs);
6348 pipe.AddColorAttachment();
6349 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6350
Tony Barbour552f6c02016-12-21 14:34:07 -07006351 m_commandBuffer->BeginCommandBuffer();
6352 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006353 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6354 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6355 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006356
6357 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6358 VkRect2D scissor = {{0, 0}, {16, 16}};
6359 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6360 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6361
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006362 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006363 m_commandBuffer->EndRenderPass();
6364 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006365 // Submit cmd buffer to put pool in-flight
6366 VkSubmitInfo submit_info = {};
6367 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6368 submit_info.commandBufferCount = 1;
6369 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6370 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6371 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006373 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6374 m_errorMonitor->VerifyFound();
6375 vkQueueWaitIdle(m_device->m_queue);
6376 // Cleanup
6377 vkDestroySampler(m_device->device(), sampler, NULL);
6378 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006380 m_errorMonitor->SetUnexpectedError(
6381 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006382 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006383 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006384 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006385}
6386
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006387TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6388 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006389 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006390 ASSERT_NO_FATAL_FAILURE(InitViewport());
6391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6392
6393 VkDescriptorPoolSize ds_type_count = {};
6394 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6395 ds_type_count.descriptorCount = 1;
6396
6397 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6398 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6399 ds_pool_ci.pNext = NULL;
6400 ds_pool_ci.maxSets = 1;
6401 ds_pool_ci.poolSizeCount = 1;
6402 ds_pool_ci.pPoolSizes = &ds_type_count;
6403
6404 VkDescriptorPool ds_pool;
6405 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6406 ASSERT_VK_SUCCESS(err);
6407
6408 VkDescriptorSetLayoutBinding dsl_binding = {};
6409 dsl_binding.binding = 0;
6410 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6411 dsl_binding.descriptorCount = 1;
6412 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6413 dsl_binding.pImmutableSamplers = NULL;
6414
6415 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6416 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6417 ds_layout_ci.pNext = NULL;
6418 ds_layout_ci.bindingCount = 1;
6419 ds_layout_ci.pBindings = &dsl_binding;
6420 VkDescriptorSetLayout ds_layout;
6421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6422 ASSERT_VK_SUCCESS(err);
6423
6424 VkDescriptorSet descriptorSet;
6425 VkDescriptorSetAllocateInfo alloc_info = {};
6426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6427 alloc_info.descriptorSetCount = 1;
6428 alloc_info.descriptorPool = ds_pool;
6429 alloc_info.pSetLayouts = &ds_layout;
6430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6431 ASSERT_VK_SUCCESS(err);
6432
6433 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6434 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6435 pipeline_layout_ci.pNext = NULL;
6436 pipeline_layout_ci.setLayoutCount = 1;
6437 pipeline_layout_ci.pSetLayouts = &ds_layout;
6438
6439 VkPipelineLayout pipeline_layout;
6440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6441 ASSERT_VK_SUCCESS(err);
6442
6443 // Create images to update the descriptor with
6444 VkImage image;
6445 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6446 const int32_t tex_width = 32;
6447 const int32_t tex_height = 32;
6448 VkImageCreateInfo image_create_info = {};
6449 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6450 image_create_info.pNext = NULL;
6451 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6452 image_create_info.format = tex_format;
6453 image_create_info.extent.width = tex_width;
6454 image_create_info.extent.height = tex_height;
6455 image_create_info.extent.depth = 1;
6456 image_create_info.mipLevels = 1;
6457 image_create_info.arrayLayers = 1;
6458 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6459 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6460 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6461 image_create_info.flags = 0;
6462 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6463 ASSERT_VK_SUCCESS(err);
6464 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6465 VkMemoryRequirements memory_reqs;
6466 VkDeviceMemory image_memory;
6467 bool pass;
6468 VkMemoryAllocateInfo memory_info = {};
6469 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6470 memory_info.pNext = NULL;
6471 memory_info.allocationSize = 0;
6472 memory_info.memoryTypeIndex = 0;
6473 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6474 // Allocate enough memory for image
6475 memory_info.allocationSize = memory_reqs.size;
6476 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6477 ASSERT_TRUE(pass);
6478 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6479 ASSERT_VK_SUCCESS(err);
6480 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6481 ASSERT_VK_SUCCESS(err);
6482
6483 VkImageViewCreateInfo image_view_create_info = {};
6484 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6485 image_view_create_info.image = image;
6486 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6487 image_view_create_info.format = tex_format;
6488 image_view_create_info.subresourceRange.layerCount = 1;
6489 image_view_create_info.subresourceRange.baseMipLevel = 0;
6490 image_view_create_info.subresourceRange.levelCount = 1;
6491 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6492
6493 VkImageView view;
6494 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6495 ASSERT_VK_SUCCESS(err);
6496 // Create Samplers
6497 VkSamplerCreateInfo sampler_ci = {};
6498 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6499 sampler_ci.pNext = NULL;
6500 sampler_ci.magFilter = VK_FILTER_NEAREST;
6501 sampler_ci.minFilter = VK_FILTER_NEAREST;
6502 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6503 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6504 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6505 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6506 sampler_ci.mipLodBias = 1.0;
6507 sampler_ci.anisotropyEnable = VK_FALSE;
6508 sampler_ci.maxAnisotropy = 1;
6509 sampler_ci.compareEnable = VK_FALSE;
6510 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6511 sampler_ci.minLod = 1.0;
6512 sampler_ci.maxLod = 1.0;
6513 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6514 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6515 VkSampler sampler;
6516 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6517 ASSERT_VK_SUCCESS(err);
6518 // Update descriptor with image and sampler
6519 VkDescriptorImageInfo img_info = {};
6520 img_info.sampler = sampler;
6521 img_info.imageView = view;
6522 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6523
6524 VkWriteDescriptorSet descriptor_write;
6525 memset(&descriptor_write, 0, sizeof(descriptor_write));
6526 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6527 descriptor_write.dstSet = descriptorSet;
6528 descriptor_write.dstBinding = 0;
6529 descriptor_write.descriptorCount = 1;
6530 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6531 descriptor_write.pImageInfo = &img_info;
6532 // Break memory binding and attempt update
6533 vkFreeMemory(m_device->device(), image_memory, nullptr);
6534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006535 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6537 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6538 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6539 m_errorMonitor->VerifyFound();
6540 // Cleanup
6541 vkDestroyImage(m_device->device(), image, NULL);
6542 vkDestroySampler(m_device->device(), sampler, NULL);
6543 vkDestroyImageView(m_device->device(), view, NULL);
6544 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6545 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6547}
6548
Karl Schultz6addd812016-02-02 17:17:23 -07006549TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006550 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6551 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006552 // Create a valid cmd buffer
6553 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006554 uint64_t fake_pipeline_handle = 0xbaad6001;
6555 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006556 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6558
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006560 m_commandBuffer->BeginCommandBuffer();
6561 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006562 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006563 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006564
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006565 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006566 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 -06006567 Draw(1, 0, 0, 0);
6568 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006569
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006570 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006571 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 -07006572 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006573 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6574 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006575}
6576
Karl Schultz6addd812016-02-02 17:17:23 -07006577TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006578 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006579 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006582
Tony Barbour1fa09702017-03-16 12:09:08 -06006583 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006584 ASSERT_NO_FATAL_FAILURE(InitViewport());
6585 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006586 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6588 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006589
6590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6592 ds_pool_ci.pNext = NULL;
6593 ds_pool_ci.maxSets = 1;
6594 ds_pool_ci.poolSizeCount = 1;
6595 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006596
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006597 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006598 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006599 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006600
Tony Barboureb254902015-07-15 12:50:33 -06006601 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006602 dsl_binding.binding = 0;
6603 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6604 dsl_binding.descriptorCount = 1;
6605 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6606 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006607
Tony Barboureb254902015-07-15 12:50:33 -06006608 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006609 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6610 ds_layout_ci.pNext = NULL;
6611 ds_layout_ci.bindingCount = 1;
6612 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006613 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006614 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006615 ASSERT_VK_SUCCESS(err);
6616
6617 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006618 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006619 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006620 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006621 alloc_info.descriptorPool = ds_pool;
6622 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006624 ASSERT_VK_SUCCESS(err);
6625
Tony Barboureb254902015-07-15 12:50:33 -06006626 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6628 pipeline_layout_ci.pNext = NULL;
6629 pipeline_layout_ci.setLayoutCount = 1;
6630 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006631
6632 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006633 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006634 ASSERT_VK_SUCCESS(err);
6635
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006636 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006637 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006638 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006639 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006640
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006641 VkPipelineObj pipe(m_device);
6642 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006643 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006644 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006645 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006646
Tony Barbour552f6c02016-12-21 14:34:07 -07006647 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006648 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6649 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6650 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006651
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006652 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006653
Chia-I Wuf7458c52015-10-26 21:10:41 +08006654 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6655 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6656 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006657}
6658
Karl Schultz6addd812016-02-02 17:17:23 -07006659TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006660 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006661 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006662
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006664
Tony Barbour1fa09702017-03-16 12:09:08 -06006665 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006666 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006667 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6668 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006669
6670 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006671 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6672 ds_pool_ci.pNext = NULL;
6673 ds_pool_ci.maxSets = 1;
6674 ds_pool_ci.poolSizeCount = 1;
6675 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006676
6677 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006679 ASSERT_VK_SUCCESS(err);
6680
6681 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006682 dsl_binding.binding = 0;
6683 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6684 dsl_binding.descriptorCount = 1;
6685 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6686 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006687
6688 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006689 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6690 ds_layout_ci.pNext = NULL;
6691 ds_layout_ci.bindingCount = 1;
6692 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006693 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006694 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006695 ASSERT_VK_SUCCESS(err);
6696
6697 VkDescriptorSet descriptorSet;
6698 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006700 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006701 alloc_info.descriptorPool = ds_pool;
6702 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006704 ASSERT_VK_SUCCESS(err);
6705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006706 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006707 VkWriteDescriptorSet descriptor_write;
6708 memset(&descriptor_write, 0, sizeof(descriptor_write));
6709 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6710 descriptor_write.dstSet = descriptorSet;
6711 descriptor_write.dstBinding = 0;
6712 descriptor_write.descriptorCount = 1;
6713 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6714 descriptor_write.pTexelBufferView = &view;
6715
6716 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6717
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006718 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006719
6720 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6721 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6722}
6723
Mark Youngd339ba32016-05-30 13:28:35 -06006724TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006725 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 -06006726
6727 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006729 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006730
Tony Barbour1fa09702017-03-16 12:09:08 -06006731 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006732
6733 // Create a buffer with no bound memory and then attempt to create
6734 // a buffer view.
6735 VkBufferCreateInfo buff_ci = {};
6736 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006737 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006738 buff_ci.size = 256;
6739 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6740 VkBuffer buffer;
6741 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6742 ASSERT_VK_SUCCESS(err);
6743
6744 VkBufferViewCreateInfo buff_view_ci = {};
6745 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6746 buff_view_ci.buffer = buffer;
6747 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6748 buff_view_ci.range = VK_WHOLE_SIZE;
6749 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006750 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006751
6752 m_errorMonitor->VerifyFound();
6753 vkDestroyBuffer(m_device->device(), buffer, NULL);
6754 // If last error is success, it still created the view, so delete it.
6755 if (err == VK_SUCCESS) {
6756 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6757 }
6758}
6759
Karl Schultz6addd812016-02-02 17:17:23 -07006760TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6761 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6762 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006763 // 1. No dynamicOffset supplied
6764 // 2. Too many dynamicOffsets supplied
6765 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006766 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6768 " requires 1 dynamicOffsets, but only "
6769 "0 dynamicOffsets are left in "
6770 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006771
Tony Barbour1fa09702017-03-16 12:09:08 -06006772 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006773 ASSERT_NO_FATAL_FAILURE(InitViewport());
6774 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6775
6776 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006777 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6778 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006779
6780 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006781 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6782 ds_pool_ci.pNext = NULL;
6783 ds_pool_ci.maxSets = 1;
6784 ds_pool_ci.poolSizeCount = 1;
6785 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006786
6787 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006788 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006789 ASSERT_VK_SUCCESS(err);
6790
6791 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006792 dsl_binding.binding = 0;
6793 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6794 dsl_binding.descriptorCount = 1;
6795 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6796 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006797
6798 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006799 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6800 ds_layout_ci.pNext = NULL;
6801 ds_layout_ci.bindingCount = 1;
6802 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006803 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006805 ASSERT_VK_SUCCESS(err);
6806
6807 VkDescriptorSet descriptorSet;
6808 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006809 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006810 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006811 alloc_info.descriptorPool = ds_pool;
6812 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006813 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006814 ASSERT_VK_SUCCESS(err);
6815
6816 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006817 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6818 pipeline_layout_ci.pNext = NULL;
6819 pipeline_layout_ci.setLayoutCount = 1;
6820 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006821
6822 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006823 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006824 ASSERT_VK_SUCCESS(err);
6825
6826 // Create a buffer to update the descriptor with
6827 uint32_t qfi = 0;
6828 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006829 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6830 buffCI.size = 1024;
6831 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6832 buffCI.queueFamilyIndexCount = 1;
6833 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006834
6835 VkBuffer dyub;
6836 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6837 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006838 // Allocate memory and bind to buffer so we can make it to the appropriate
6839 // error
6840 VkMemoryAllocateInfo mem_alloc = {};
6841 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6842 mem_alloc.pNext = NULL;
6843 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006844 mem_alloc.memoryTypeIndex = 0;
6845
6846 VkMemoryRequirements memReqs;
6847 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006848 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006849 if (!pass) {
6850 vkDestroyBuffer(m_device->device(), dyub, NULL);
6851 return;
6852 }
6853
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006854 VkDeviceMemory mem;
6855 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6856 ASSERT_VK_SUCCESS(err);
6857 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6858 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006859 // Correctly update descriptor to avoid "NOT_UPDATED" error
6860 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006861 buffInfo.buffer = dyub;
6862 buffInfo.offset = 0;
6863 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006864
6865 VkWriteDescriptorSet descriptor_write;
6866 memset(&descriptor_write, 0, sizeof(descriptor_write));
6867 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6868 descriptor_write.dstSet = descriptorSet;
6869 descriptor_write.dstBinding = 0;
6870 descriptor_write.descriptorCount = 1;
6871 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6872 descriptor_write.pBufferInfo = &buffInfo;
6873
6874 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6875
Tony Barbour552f6c02016-12-21 14:34:07 -07006876 m_commandBuffer->BeginCommandBuffer();
6877 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006878 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6879 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006880 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006881 uint32_t pDynOff[2] = {512, 756};
6882 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6884 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6885 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6886 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006887 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006888 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6890 " dynamic offset 512 combined with "
6891 "offset 0 and range 1024 that "
6892 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006893 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006894 char const *vsSource =
6895 "#version 450\n"
6896 "\n"
6897 "out gl_PerVertex { \n"
6898 " vec4 gl_Position;\n"
6899 "};\n"
6900 "void main(){\n"
6901 " gl_Position = vec4(1);\n"
6902 "}\n";
6903 char const *fsSource =
6904 "#version 450\n"
6905 "\n"
6906 "layout(location=0) out vec4 x;\n"
6907 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6908 "void main(){\n"
6909 " x = vec4(bar.y);\n"
6910 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006911 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6912 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6913 VkPipelineObj pipe(m_device);
6914 pipe.AddShader(&vs);
6915 pipe.AddShader(&fs);
6916 pipe.AddColorAttachment();
6917 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6918
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006919 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6920 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6921 VkRect2D scissor = {{0, 0}, {16, 16}};
6922 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6923
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006924 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006925 // This update should succeed, but offset size of 512 will overstep buffer
6926 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6928 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006929 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006930 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006931
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006932 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006933 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006934
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006935 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006936 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006937 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6938}
6939
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006940TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006941 TEST_DESCRIPTION(
6942 "Attempt to update a descriptor with a non-sparse buffer "
6943 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006944 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006946 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6948 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006949
Tony Barbour1fa09702017-03-16 12:09:08 -06006950 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006951 ASSERT_NO_FATAL_FAILURE(InitViewport());
6952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6953
6954 VkDescriptorPoolSize ds_type_count = {};
6955 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6956 ds_type_count.descriptorCount = 1;
6957
6958 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6959 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6960 ds_pool_ci.pNext = NULL;
6961 ds_pool_ci.maxSets = 1;
6962 ds_pool_ci.poolSizeCount = 1;
6963 ds_pool_ci.pPoolSizes = &ds_type_count;
6964
6965 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006966 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006967 ASSERT_VK_SUCCESS(err);
6968
6969 VkDescriptorSetLayoutBinding dsl_binding = {};
6970 dsl_binding.binding = 0;
6971 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6972 dsl_binding.descriptorCount = 1;
6973 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6974 dsl_binding.pImmutableSamplers = NULL;
6975
6976 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6977 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6978 ds_layout_ci.pNext = NULL;
6979 ds_layout_ci.bindingCount = 1;
6980 ds_layout_ci.pBindings = &dsl_binding;
6981 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006982 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006983 ASSERT_VK_SUCCESS(err);
6984
6985 VkDescriptorSet descriptorSet;
6986 VkDescriptorSetAllocateInfo alloc_info = {};
6987 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6988 alloc_info.descriptorSetCount = 1;
6989 alloc_info.descriptorPool = ds_pool;
6990 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006991 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006992 ASSERT_VK_SUCCESS(err);
6993
6994 // Create a buffer to update the descriptor with
6995 uint32_t qfi = 0;
6996 VkBufferCreateInfo buffCI = {};
6997 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6998 buffCI.size = 1024;
6999 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7000 buffCI.queueFamilyIndexCount = 1;
7001 buffCI.pQueueFamilyIndices = &qfi;
7002
7003 VkBuffer dyub;
7004 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7005 ASSERT_VK_SUCCESS(err);
7006
7007 // Attempt to update descriptor without binding memory to it
7008 VkDescriptorBufferInfo buffInfo = {};
7009 buffInfo.buffer = dyub;
7010 buffInfo.offset = 0;
7011 buffInfo.range = 1024;
7012
7013 VkWriteDescriptorSet descriptor_write;
7014 memset(&descriptor_write, 0, sizeof(descriptor_write));
7015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7016 descriptor_write.dstSet = descriptorSet;
7017 descriptor_write.dstBinding = 0;
7018 descriptor_write.descriptorCount = 1;
7019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7020 descriptor_write.pBufferInfo = &buffInfo;
7021
7022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7023 m_errorMonitor->VerifyFound();
7024
7025 vkDestroyBuffer(m_device->device(), dyub, NULL);
7026 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7027 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7028}
7029
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007030TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007031 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007032 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007033 ASSERT_NO_FATAL_FAILURE(InitViewport());
7034 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7035
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007036 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007037 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007038 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7039 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7040 pipeline_layout_ci.pushConstantRangeCount = 1;
7041 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7042
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007043 //
7044 // Check for invalid push constant ranges in pipeline layouts.
7045 //
7046 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007047 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007048 char const *msg;
7049 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007050
Karl Schultzc81037d2016-05-12 08:11:23 -06007051 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7052 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7053 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7054 "vkCreatePipelineLayout() call has push constants index 0 with "
7055 "size 0."},
7056 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7057 "vkCreatePipelineLayout() call has push constants index 0 with "
7058 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007059 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007060 "vkCreatePipelineLayout() call has push constants index 0 with "
7061 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007062 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007063 "vkCreatePipelineLayout() call has push constants index 0 with "
7064 "size 0."},
7065 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7066 "vkCreatePipelineLayout() call has push constants index 0 with "
7067 "offset 1. Offset must"},
7068 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7069 "vkCreatePipelineLayout() call has push constants index 0 "
7070 "with offset "},
7071 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7072 "vkCreatePipelineLayout() call has push constants "
7073 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007074 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007075 "vkCreatePipelineLayout() call has push constants index 0 "
7076 "with offset "},
7077 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7078 "vkCreatePipelineLayout() call has push "
7079 "constants index 0 with offset "},
7080 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7081 "vkCreatePipelineLayout() call has push "
7082 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007083 }};
7084
7085 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007086 for (const auto &iter : range_tests) {
7087 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7089 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007090 m_errorMonitor->VerifyFound();
7091 if (VK_SUCCESS == err) {
7092 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7093 }
7094 }
7095
7096 // Check for invalid stage flag
7097 pc_range.offset = 0;
7098 pc_range.size = 16;
7099 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007100 m_errorMonitor->SetDesiredFailureMsg(
7101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7102 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007103 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007104 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007105 if (VK_SUCCESS == err) {
7106 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7107 }
7108
Karl Schultzc59b72d2017-02-24 15:45:05 -07007109 // Check for duplicate stage flags in a list of push constant ranges.
7110 // A shader can only have one push constant block and that block is mapped
7111 // to the push constant range that has that shader's stage flag set.
7112 // The shader's stage flag can only appear once in all the ranges, so the
7113 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007114 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007115 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007116 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007117 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007118 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007119 // Overlapping ranges are OK, but a stage flag can appear only once.
7120 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7121 {
7122 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7123 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7124 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7125 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007126 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007127 {
7128 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7129 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7130 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7131 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7132 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7133 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7134 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7135 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7136 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7137 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7138 }},
7139 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7140 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7141 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7142 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7143 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7144 {
7145 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7146 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7147 }},
7148 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7149 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7150 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7151 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7152 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7153 {
7154 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7155 }},
7156 },
7157 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007158
Karl Schultzc59b72d2017-02-24 15:45:05 -07007159 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007160 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007161 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007163 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007164 m_errorMonitor->VerifyFound();
7165 if (VK_SUCCESS == err) {
7166 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7167 }
7168 }
7169
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007170 //
7171 // CmdPushConstants tests
7172 //
7173
Karl Schultzc59b72d2017-02-24 15:45:05 -07007174 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007175 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007176 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007177 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007178 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007179 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007181 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007182
7183 const uint8_t dummy_values[100] = {};
7184
7185 m_commandBuffer->BeginCommandBuffer();
7186 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007187
7188 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007189 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007191 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007192 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007193
Karl Schultzc59b72d2017-02-24 15:45:05 -07007194 m_errorMonitor->ExpectSuccess();
7195 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7196 m_errorMonitor->VerifyNotFound();
7197 m_errorMonitor->ExpectSuccess();
7198 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7199 m_errorMonitor->VerifyNotFound();
7200 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7201 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7202 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7203 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7204 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7205 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7206 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007207 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007208 for (const auto &iter : cmd_range_tests) {
7209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7210 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7211 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007212 m_errorMonitor->VerifyFound();
7213 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007214
Tony Barbour552f6c02016-12-21 14:34:07 -07007215 m_commandBuffer->EndRenderPass();
7216 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007217 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007218}
7219
Karl Schultz6addd812016-02-02 17:17:23 -07007220TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007221 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007222 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007223
Tony Barbour1fa09702017-03-16 12:09:08 -06007224 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007225 ASSERT_NO_FATAL_FAILURE(InitViewport());
7226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7227
7228 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7229 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007230 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7231 ds_type_count[0].descriptorCount = 10;
7232 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7233 ds_type_count[1].descriptorCount = 2;
7234 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7235 ds_type_count[2].descriptorCount = 2;
7236 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7237 ds_type_count[3].descriptorCount = 5;
7238 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7239 // type
7240 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7241 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7242 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007243
7244 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007245 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7246 ds_pool_ci.pNext = NULL;
7247 ds_pool_ci.maxSets = 5;
7248 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7249 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007250
7251 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007252 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007253 ASSERT_VK_SUCCESS(err);
7254
7255 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7256 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007257 dsl_binding[0].binding = 0;
7258 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7259 dsl_binding[0].descriptorCount = 5;
7260 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7261 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007262
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007263 // Create layout identical to set0 layout but w/ different stageFlags
7264 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007265 dsl_fs_stage_only.binding = 0;
7266 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7267 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007268 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7269 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007270 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007271 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007272 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7273 ds_layout_ci.pNext = NULL;
7274 ds_layout_ci.bindingCount = 1;
7275 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007276 static const uint32_t NUM_LAYOUTS = 4;
7277 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007278 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007279 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7280 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007281 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007282 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007283 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007284 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007285 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007286 dsl_binding[0].binding = 0;
7287 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007288 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007289 dsl_binding[1].binding = 1;
7290 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7291 dsl_binding[1].descriptorCount = 2;
7292 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7293 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007294 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007295 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007296 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007297 ASSERT_VK_SUCCESS(err);
7298 dsl_binding[0].binding = 0;
7299 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007300 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007301 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007302 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007303 ASSERT_VK_SUCCESS(err);
7304 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007305 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007306 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007307 ASSERT_VK_SUCCESS(err);
7308
7309 static const uint32_t NUM_SETS = 4;
7310 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7311 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007312 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007313 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007314 alloc_info.descriptorPool = ds_pool;
7315 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007316 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007317 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007318 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007319 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007320 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007321 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007322 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007323
7324 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007325 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7326 pipeline_layout_ci.pNext = NULL;
7327 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7328 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007329
7330 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007331 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007332 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007333 // Create pipelineLayout with only one setLayout
7334 pipeline_layout_ci.setLayoutCount = 1;
7335 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007336 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007337 ASSERT_VK_SUCCESS(err);
7338 // Create pipelineLayout with 2 descriptor setLayout at index 0
7339 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7340 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007341 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 ASSERT_VK_SUCCESS(err);
7343 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7344 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7345 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007346 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007347 ASSERT_VK_SUCCESS(err);
7348 // Create pipelineLayout with UB type, but stageFlags for FS only
7349 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7350 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007351 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007352 ASSERT_VK_SUCCESS(err);
7353 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7354 VkDescriptorSetLayout pl_bad_s0[2] = {};
7355 pl_bad_s0[0] = ds_layout_fs_only;
7356 pl_bad_s0[1] = ds_layout[1];
7357 pipeline_layout_ci.setLayoutCount = 2;
7358 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7359 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007360 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007361 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007362
Tobin Ehlis88452832015-12-03 09:40:56 -07007363 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007364 char const *vsSource =
7365 "#version 450\n"
7366 "\n"
7367 "out gl_PerVertex {\n"
7368 " vec4 gl_Position;\n"
7369 "};\n"
7370 "void main(){\n"
7371 " gl_Position = vec4(1);\n"
7372 "}\n";
7373 char const *fsSource =
7374 "#version 450\n"
7375 "\n"
7376 "layout(location=0) out vec4 x;\n"
7377 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7378 "void main(){\n"
7379 " x = vec4(bar.y);\n"
7380 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007381 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007383 VkPipelineObj pipe(m_device);
7384 pipe.AddShader(&vs);
7385 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007386 pipe.AddColorAttachment();
7387 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007388
Tony Barbour552f6c02016-12-21 14:34:07 -07007389 m_commandBuffer->BeginCommandBuffer();
7390 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007391
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007392 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007393 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7394 // of PSO
7395 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7396 // cmd_pipeline.c
7397 // due to the fact that cmd_alloc_dset_data() has not been called in
7398 // cmd_bind_graphics_pipeline()
7399 // TODO : Want to cause various binding incompatibility issues here to test
7400 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007401 // First cause various verify_layout_compatibility() fails
7402 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007403 // verify_set_layout_compatibility fail cases:
7404 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007406 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7407 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007408 m_errorMonitor->VerifyFound();
7409
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007410 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7412 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7413 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007414 m_errorMonitor->VerifyFound();
7415
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007416 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007417 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7418 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7420 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7421 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007422 m_errorMonitor->VerifyFound();
7423
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007424 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7425 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7427 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7428 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007429 m_errorMonitor->VerifyFound();
7430
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007431 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7432 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7434 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7435 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7436 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007437 m_errorMonitor->VerifyFound();
7438
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007439 // Cause INFO messages due to disturbing previously bound Sets
7440 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007441 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7442 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007443 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7445 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7446 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007447 m_errorMonitor->VerifyFound();
7448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007449 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7450 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007451 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7453 " newly bound as set #0 so set #1 and "
7454 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7456 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007457 m_errorMonitor->VerifyFound();
7458
Tobin Ehlis10fad692016-07-07 12:00:36 -06007459 // Now that we're done actively using the pipelineLayout that gfx pipeline
7460 // was created with, we should be able to delete it. Do that now to verify
7461 // that validation obeys pipelineLayout lifetime
7462 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7463
Tobin Ehlis88452832015-12-03 09:40:56 -07007464 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007465 // 1. Error due to not binding required set (we actually use same code as
7466 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007467 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7468 &descriptorSet[0], 0, NULL);
7469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7470 &descriptorSet[1], 0, NULL);
7471 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 -07007472
7473 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7474 VkRect2D scissor = {{0, 0}, {16, 16}};
7475 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7476 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7477
Tobin Ehlis88452832015-12-03 09:40:56 -07007478 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007479 m_errorMonitor->VerifyFound();
7480
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007481 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007482 // 2. Error due to bound set not being compatible with PSO's
7483 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007484 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7485 &descriptorSet[0], 0, NULL);
7486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007487 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007488 m_errorMonitor->VerifyFound();
7489
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007490 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007491 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007492 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7493 }
7494 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007495 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7496 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7497}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007498
Karl Schultz6addd812016-02-02 17:17:23 -07007499TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7501 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007502
Tony Barbour1fa09702017-03-16 12:09:08 -06007503 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007504 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007505 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007506 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007508 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007509}
7510
Karl Schultz6addd812016-02-02 17:17:23 -07007511TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7512 VkResult err;
7513 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007514
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007516
Tony Barbour1fa09702017-03-16 12:09:08 -06007517 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007518
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007519 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007520 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007521 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007522 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007523 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007524 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007525
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007526 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007527 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007528
7529 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007530 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007531 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7532
7533 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007534 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007535 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007536 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 -07007537 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007538
7539 // The error should be caught by validation of the BeginCommandBuffer call
7540 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007542 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007543 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007544}
7545
Karl Schultz6addd812016-02-02 17:17:23 -07007546TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007547 // Cause error due to Begin while recording CB
7548 // Then cause 2 errors for attempting to reset CB w/o having
7549 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7550 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007552
Tony Barbour1fa09702017-03-16 12:09:08 -06007553 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007554
7555 // Calls AllocateCommandBuffers
7556 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7557
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007558 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007559 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007560 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7561 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007562 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7563 cmd_buf_info.pNext = NULL;
7564 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007565 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007566
7567 // Begin CB to transition to recording state
7568 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7569 // Can't re-begin. This should trigger error
7570 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007571 m_errorMonitor->VerifyFound();
7572
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007574 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007575 // Reset attempt will trigger error due to incorrect CommandPool state
7576 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007577 m_errorMonitor->VerifyFound();
7578
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007580 // Transition CB to RECORDED state
7581 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7582 // Now attempting to Begin will implicitly reset, which triggers error
7583 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007584 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007585}
7586
Karl Schultz6addd812016-02-02 17:17:23 -07007587TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007588 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007589 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007590
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7592 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007593
Tony Barbour1fa09702017-03-16 12:09:08 -06007594 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007596
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007597 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007598 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7599 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007600
7601 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007602 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7603 ds_pool_ci.pNext = NULL;
7604 ds_pool_ci.maxSets = 1;
7605 ds_pool_ci.poolSizeCount = 1;
7606 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007607
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007608 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007609 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007610 ASSERT_VK_SUCCESS(err);
7611
Tony Barboureb254902015-07-15 12:50:33 -06007612 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007613 dsl_binding.binding = 0;
7614 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7615 dsl_binding.descriptorCount = 1;
7616 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7617 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007618
Tony Barboureb254902015-07-15 12:50:33 -06007619 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007620 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7621 ds_layout_ci.pNext = NULL;
7622 ds_layout_ci.bindingCount = 1;
7623 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007624
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007625 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007626 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007627 ASSERT_VK_SUCCESS(err);
7628
7629 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007630 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007631 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007632 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007633 alloc_info.descriptorPool = ds_pool;
7634 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007635 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007636 ASSERT_VK_SUCCESS(err);
7637
Tony Barboureb254902015-07-15 12:50:33 -06007638 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007639 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7640 pipeline_layout_ci.setLayoutCount = 1;
7641 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007642
7643 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007644 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007645 ASSERT_VK_SUCCESS(err);
7646
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007647 VkViewport vp = {}; // Just need dummy vp to point to
7648 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007649
7650 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007651 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7652 vp_state_ci.scissorCount = 1;
7653 vp_state_ci.pScissors = &sc;
7654 vp_state_ci.viewportCount = 1;
7655 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007656
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007657 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7658 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7659 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7660 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7661 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7662 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007663 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007664 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007665 rs_state_ci.lineWidth = 1.0f;
7666
7667 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7668 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7669 vi_ci.pNext = nullptr;
7670 vi_ci.vertexBindingDescriptionCount = 0;
7671 vi_ci.pVertexBindingDescriptions = nullptr;
7672 vi_ci.vertexAttributeDescriptionCount = 0;
7673 vi_ci.pVertexAttributeDescriptions = nullptr;
7674
7675 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7676 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7677 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7678
7679 VkPipelineShaderStageCreateInfo shaderStages[2];
7680 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7681
7682 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7683 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007684 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007685 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007686
Tony Barboureb254902015-07-15 12:50:33 -06007687 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007688 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7689 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007690 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007691 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7692 gp_ci.layout = pipeline_layout;
7693 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007694 gp_ci.pVertexInputState = &vi_ci;
7695 gp_ci.pInputAssemblyState = &ia_ci;
7696
7697 gp_ci.stageCount = 1;
7698 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007699
7700 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007701 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7702 pc_ci.initialDataSize = 0;
7703 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007704
7705 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007706 VkPipelineCache pipelineCache;
7707
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007708 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007709 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007710 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007711 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007712
Chia-I Wuf7458c52015-10-26 21:10:41 +08007713 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7714 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7715 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7716 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007717}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007718
Tobin Ehlis912df022015-09-17 08:46:18 -06007719/*// TODO : This test should be good, but needs Tess support in compiler to run
7720TEST_F(VkLayerTest, InvalidPatchControlPoints)
7721{
7722 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007723 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007724
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007726 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7727primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007728
Tony Barbour1fa09702017-03-16 12:09:08 -06007729 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007731
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007732 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007733 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007734 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007735
7736 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7737 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7738 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007739 ds_pool_ci.poolSizeCount = 1;
7740 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007741
7742 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007743 err = vkCreateDescriptorPool(m_device->device(),
7744VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007745 ASSERT_VK_SUCCESS(err);
7746
7747 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007748 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007749 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007750 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007751 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7752 dsl_binding.pImmutableSamplers = NULL;
7753
7754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007755 ds_layout_ci.sType =
7756VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007757 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007758 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007759 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007760
7761 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007762 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7763&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007764 ASSERT_VK_SUCCESS(err);
7765
7766 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007767 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7768VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007769 ASSERT_VK_SUCCESS(err);
7770
7771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007772 pipeline_layout_ci.sType =
7773VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007774 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007775 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007776 pipeline_layout_ci.pSetLayouts = &ds_layout;
7777
7778 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007779 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7780&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007781 ASSERT_VK_SUCCESS(err);
7782
7783 VkPipelineShaderStageCreateInfo shaderStages[3];
7784 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7785
Karl Schultz6addd812016-02-02 17:17:23 -07007786 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7787this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007788 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007789 VkShaderObj
7790tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7791this);
7792 VkShaderObj
7793te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7794this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007795
Karl Schultz6addd812016-02-02 17:17:23 -07007796 shaderStages[0].sType =
7797VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007798 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007799 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007800 shaderStages[1].sType =
7801VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007802 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007803 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007804 shaderStages[2].sType =
7805VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007806 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007807 shaderStages[2].shader = te.handle();
7808
7809 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007810 iaCI.sType =
7811VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007812 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007813
7814 VkPipelineTessellationStateCreateInfo tsCI = {};
7815 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7816 tsCI.patchControlPoints = 0; // This will cause an error
7817
7818 VkGraphicsPipelineCreateInfo gp_ci = {};
7819 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7820 gp_ci.pNext = NULL;
7821 gp_ci.stageCount = 3;
7822 gp_ci.pStages = shaderStages;
7823 gp_ci.pVertexInputState = NULL;
7824 gp_ci.pInputAssemblyState = &iaCI;
7825 gp_ci.pTessellationState = &tsCI;
7826 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007827 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007828 gp_ci.pMultisampleState = NULL;
7829 gp_ci.pDepthStencilState = NULL;
7830 gp_ci.pColorBlendState = NULL;
7831 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7832 gp_ci.layout = pipeline_layout;
7833 gp_ci.renderPass = renderPass();
7834
7835 VkPipelineCacheCreateInfo pc_ci = {};
7836 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7837 pc_ci.pNext = NULL;
7838 pc_ci.initialSize = 0;
7839 pc_ci.initialData = 0;
7840 pc_ci.maxSize = 0;
7841
7842 VkPipeline pipeline;
7843 VkPipelineCache pipelineCache;
7844
Karl Schultz6addd812016-02-02 17:17:23 -07007845 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7846&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007847 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007848 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7849&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007850
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007851 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007852
Chia-I Wuf7458c52015-10-26 21:10:41 +08007853 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7854 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7855 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7856 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007857}
7858*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007859
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007860TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007861 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007862
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007863 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007864
Tony Barbour1fa09702017-03-16 12:09:08 -06007865 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007867
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007868 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007869 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7870 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007871
7872 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007873 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7874 ds_pool_ci.maxSets = 1;
7875 ds_pool_ci.poolSizeCount = 1;
7876 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007877
7878 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007879 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007880 ASSERT_VK_SUCCESS(err);
7881
7882 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007883 dsl_binding.binding = 0;
7884 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7885 dsl_binding.descriptorCount = 1;
7886 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007887
7888 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007889 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7890 ds_layout_ci.bindingCount = 1;
7891 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007892
7893 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007894 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007895 ASSERT_VK_SUCCESS(err);
7896
7897 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007898 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007899 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007900 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007901 alloc_info.descriptorPool = ds_pool;
7902 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007903 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007904 ASSERT_VK_SUCCESS(err);
7905
7906 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007907 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7908 pipeline_layout_ci.setLayoutCount = 1;
7909 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910
7911 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007912 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007913 ASSERT_VK_SUCCESS(err);
7914
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007915 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007916 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007917 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007918 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007919 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007920 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007921
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007922 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7923 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7924 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7925 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7926 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7927 rs_state_ci.depthClampEnable = VK_FALSE;
7928 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7929 rs_state_ci.depthBiasEnable = VK_FALSE;
7930
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007931 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7932 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7933 vi_ci.pNext = nullptr;
7934 vi_ci.vertexBindingDescriptionCount = 0;
7935 vi_ci.pVertexBindingDescriptions = nullptr;
7936 vi_ci.vertexAttributeDescriptionCount = 0;
7937 vi_ci.pVertexAttributeDescriptions = nullptr;
7938
7939 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7940 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7941 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7942
7943 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7944 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7945 pipe_ms_state_ci.pNext = NULL;
7946 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7947 pipe_ms_state_ci.sampleShadingEnable = 0;
7948 pipe_ms_state_ci.minSampleShading = 1.0;
7949 pipe_ms_state_ci.pSampleMask = NULL;
7950
Cody Northropeb3a6c12015-10-05 14:44:45 -06007951 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007952 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007953
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007954 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007955 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007956 shaderStages[0] = vs.GetStageCreateInfo();
7957 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007958
7959 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007960 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7961 gp_ci.stageCount = 2;
7962 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007963 gp_ci.pVertexInputState = &vi_ci;
7964 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007965 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007966 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007967 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007968 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7969 gp_ci.layout = pipeline_layout;
7970 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007971
7972 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007973 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007974
7975 VkPipeline pipeline;
7976 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007977 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007978 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007979
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007980 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007981 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007982
7983 // Check case where multiViewport is disabled and viewport count is not 1
7984 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7987 vp_state_ci.scissorCount = 0;
7988 vp_state_ci.viewportCount = 0;
7989 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7990 m_errorMonitor->VerifyFound();
7991 } else {
7992 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007993 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007994 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007995 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007996
7997 // Check is that viewportcount and scissorcount match
7998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7999 vp_state_ci.scissorCount = 1;
8000 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8001 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8002 m_errorMonitor->VerifyFound();
8003
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008004 // Check case where multiViewport is enabled and viewport count is greater than max
8005 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8008 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8009 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8010 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8011 m_errorMonitor->VerifyFound();
8012 }
8013 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008014
Chia-I Wuf7458c52015-10-26 21:10:41 +08008015 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8016 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8017 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8018 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008019}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008020
8021// 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
8022// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008023TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008024 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008025
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008026 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8027
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008029
Tony Barbour1fa09702017-03-16 12:09:08 -06008030 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008032
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008033 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008034 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8035 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008036
8037 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008038 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8039 ds_pool_ci.maxSets = 1;
8040 ds_pool_ci.poolSizeCount = 1;
8041 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008042
8043 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008044 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008045 ASSERT_VK_SUCCESS(err);
8046
8047 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008048 dsl_binding.binding = 0;
8049 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8050 dsl_binding.descriptorCount = 1;
8051 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008052
8053 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008054 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8055 ds_layout_ci.bindingCount = 1;
8056 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008057
8058 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008059 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008060 ASSERT_VK_SUCCESS(err);
8061
8062 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008063 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008064 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008065 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008066 alloc_info.descriptorPool = ds_pool;
8067 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008068 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008069 ASSERT_VK_SUCCESS(err);
8070
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008071 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8072 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8073 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8074
8075 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8076 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8077 vi_ci.pNext = nullptr;
8078 vi_ci.vertexBindingDescriptionCount = 0;
8079 vi_ci.pVertexBindingDescriptions = nullptr;
8080 vi_ci.vertexAttributeDescriptionCount = 0;
8081 vi_ci.pVertexAttributeDescriptions = nullptr;
8082
8083 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8084 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8085 pipe_ms_state_ci.pNext = NULL;
8086 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8087 pipe_ms_state_ci.sampleShadingEnable = 0;
8088 pipe_ms_state_ci.minSampleShading = 1.0;
8089 pipe_ms_state_ci.pSampleMask = NULL;
8090
Tobin Ehlise68360f2015-10-01 11:15:13 -06008091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8093 pipeline_layout_ci.setLayoutCount = 1;
8094 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008095
8096 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008097 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008098 ASSERT_VK_SUCCESS(err);
8099
8100 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8101 // Set scissor as dynamic to avoid second error
8102 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008103 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8104 dyn_state_ci.dynamicStateCount = 1;
8105 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008106
Cody Northropeb3a6c12015-10-05 14:44:45 -06008107 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008108 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008109
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008110 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008111 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8112 // 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 +08008113 shaderStages[0] = vs.GetStageCreateInfo();
8114 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008115
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008116 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8117 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8118 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8119 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8120 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8121 rs_state_ci.depthClampEnable = VK_FALSE;
8122 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8123 rs_state_ci.depthBiasEnable = VK_FALSE;
8124
Tobin Ehlise68360f2015-10-01 11:15:13 -06008125 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008126 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8127 gp_ci.stageCount = 2;
8128 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008129 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008130 // Not setting VP state w/o dynamic vp state should cause validation error
8131 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008132 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008133 gp_ci.pVertexInputState = &vi_ci;
8134 gp_ci.pInputAssemblyState = &ia_ci;
8135 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008136 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8137 gp_ci.layout = pipeline_layout;
8138 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008139
8140 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008141 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008142
8143 VkPipeline pipeline;
8144 VkPipelineCache pipelineCache;
8145
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008146 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008147 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008148 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008149
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008150 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151
Chia-I Wuf7458c52015-10-26 21:10:41 +08008152 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8153 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8154 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8155 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008156}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008157
8158// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8159// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008160TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8161 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008162
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008164
Tony Barbour1fa09702017-03-16 12:09:08 -06008165 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008166
8167 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008168 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008169 return;
8170 }
8171
Tobin Ehlise68360f2015-10-01 11:15:13 -06008172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008173
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008174 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008175 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8176 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008177
8178 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008179 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8180 ds_pool_ci.maxSets = 1;
8181 ds_pool_ci.poolSizeCount = 1;
8182 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008183
8184 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008185 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008186 ASSERT_VK_SUCCESS(err);
8187
8188 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008189 dsl_binding.binding = 0;
8190 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8191 dsl_binding.descriptorCount = 1;
8192 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008193
8194 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008195 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8196 ds_layout_ci.bindingCount = 1;
8197 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008198
8199 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008200 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008201 ASSERT_VK_SUCCESS(err);
8202
8203 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008204 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008205 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008206 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008207 alloc_info.descriptorPool = ds_pool;
8208 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008209 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008210 ASSERT_VK_SUCCESS(err);
8211
8212 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008213 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8214 pipeline_layout_ci.setLayoutCount = 1;
8215 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008216
8217 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008218 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008219 ASSERT_VK_SUCCESS(err);
8220
8221 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008222 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8223 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008224 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008225 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008226 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008227
8228 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8229 // Set scissor as dynamic to avoid that error
8230 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8232 dyn_state_ci.dynamicStateCount = 1;
8233 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008234
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008235 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8236 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8237 pipe_ms_state_ci.pNext = NULL;
8238 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8239 pipe_ms_state_ci.sampleShadingEnable = 0;
8240 pipe_ms_state_ci.minSampleShading = 1.0;
8241 pipe_ms_state_ci.pSampleMask = NULL;
8242
Cody Northropeb3a6c12015-10-05 14:44:45 -06008243 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008244 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008245
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008246 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008247 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8248 // 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 +08008249 shaderStages[0] = vs.GetStageCreateInfo();
8250 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008251
Cody Northropf6622dc2015-10-06 10:33:21 -06008252 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8253 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8254 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008255 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008256 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008257 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008258 vi_ci.pVertexAttributeDescriptions = nullptr;
8259
8260 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8261 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8262 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8263
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008264 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008265 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008266 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008267 rs_ci.pNext = nullptr;
8268
Mark Youngc89c6312016-03-31 16:03:20 -06008269 VkPipelineColorBlendAttachmentState att = {};
8270 att.blendEnable = VK_FALSE;
8271 att.colorWriteMask = 0xf;
8272
Cody Northropf6622dc2015-10-06 10:33:21 -06008273 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8274 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8275 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008276 cb_ci.attachmentCount = 1;
8277 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008278
Tobin Ehlise68360f2015-10-01 11:15:13 -06008279 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008280 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8281 gp_ci.stageCount = 2;
8282 gp_ci.pStages = shaderStages;
8283 gp_ci.pVertexInputState = &vi_ci;
8284 gp_ci.pInputAssemblyState = &ia_ci;
8285 gp_ci.pViewportState = &vp_state_ci;
8286 gp_ci.pRasterizationState = &rs_ci;
8287 gp_ci.pColorBlendState = &cb_ci;
8288 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008289 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008290 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8291 gp_ci.layout = pipeline_layout;
8292 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008293
8294 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008295 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008296
8297 VkPipeline pipeline;
8298 VkPipelineCache pipelineCache;
8299
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008300 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008301 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008302 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008303
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008304 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008305
Tobin Ehlisd332f282015-10-02 11:00:56 -06008306 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008307 // First need to successfully create the PSO from above by setting
8308 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008309 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 -07008310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008311 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008312 vp_state_ci.pViewports = &vp;
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 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008315 m_commandBuffer->BeginCommandBuffer();
8316 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008317 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008318 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008319 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008320 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008321 Draw(1, 0, 0, 0);
8322
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008323 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008324
8325 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8326 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8327 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8328 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008329 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008330}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008331
8332// 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 -07008333// viewportCount
8334TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8335 VkResult err;
8336
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008338
Tony Barbour1fa09702017-03-16 12:09:08 -06008339 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008340
8341 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008342 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008343 return;
8344 }
8345
Karl Schultz6addd812016-02-02 17:17:23 -07008346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8347
8348 VkDescriptorPoolSize ds_type_count = {};
8349 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8350 ds_type_count.descriptorCount = 1;
8351
8352 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8353 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8354 ds_pool_ci.maxSets = 1;
8355 ds_pool_ci.poolSizeCount = 1;
8356 ds_pool_ci.pPoolSizes = &ds_type_count;
8357
8358 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008359 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008360 ASSERT_VK_SUCCESS(err);
8361
8362 VkDescriptorSetLayoutBinding dsl_binding = {};
8363 dsl_binding.binding = 0;
8364 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8365 dsl_binding.descriptorCount = 1;
8366 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8367
8368 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8369 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8370 ds_layout_ci.bindingCount = 1;
8371 ds_layout_ci.pBindings = &dsl_binding;
8372
8373 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008374 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008375 ASSERT_VK_SUCCESS(err);
8376
8377 VkDescriptorSet descriptorSet;
8378 VkDescriptorSetAllocateInfo alloc_info = {};
8379 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8380 alloc_info.descriptorSetCount = 1;
8381 alloc_info.descriptorPool = ds_pool;
8382 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008383 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008384 ASSERT_VK_SUCCESS(err);
8385
8386 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8387 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8388 pipeline_layout_ci.setLayoutCount = 1;
8389 pipeline_layout_ci.pSetLayouts = &ds_layout;
8390
8391 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008392 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008393 ASSERT_VK_SUCCESS(err);
8394
8395 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8396 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8397 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008398 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008399 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008400 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008401
8402 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8403 // Set scissor as dynamic to avoid that error
8404 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8405 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8406 dyn_state_ci.dynamicStateCount = 1;
8407 dyn_state_ci.pDynamicStates = &vp_state;
8408
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008409 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8410 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8411 pipe_ms_state_ci.pNext = NULL;
8412 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8413 pipe_ms_state_ci.sampleShadingEnable = 0;
8414 pipe_ms_state_ci.minSampleShading = 1.0;
8415 pipe_ms_state_ci.pSampleMask = NULL;
8416
Karl Schultz6addd812016-02-02 17:17:23 -07008417 VkPipelineShaderStageCreateInfo shaderStages[2];
8418 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8419
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008420 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008421 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8422 // 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 -07008423 shaderStages[0] = vs.GetStageCreateInfo();
8424 shaderStages[1] = fs.GetStageCreateInfo();
8425
8426 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8427 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8428 vi_ci.pNext = nullptr;
8429 vi_ci.vertexBindingDescriptionCount = 0;
8430 vi_ci.pVertexBindingDescriptions = nullptr;
8431 vi_ci.vertexAttributeDescriptionCount = 0;
8432 vi_ci.pVertexAttributeDescriptions = nullptr;
8433
8434 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8435 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8436 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8437
8438 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8439 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008440 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008441 rs_ci.pNext = nullptr;
8442
Mark Youngc89c6312016-03-31 16:03:20 -06008443 VkPipelineColorBlendAttachmentState att = {};
8444 att.blendEnable = VK_FALSE;
8445 att.colorWriteMask = 0xf;
8446
Karl Schultz6addd812016-02-02 17:17:23 -07008447 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8448 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8449 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008450 cb_ci.attachmentCount = 1;
8451 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008452
8453 VkGraphicsPipelineCreateInfo gp_ci = {};
8454 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8455 gp_ci.stageCount = 2;
8456 gp_ci.pStages = shaderStages;
8457 gp_ci.pVertexInputState = &vi_ci;
8458 gp_ci.pInputAssemblyState = &ia_ci;
8459 gp_ci.pViewportState = &vp_state_ci;
8460 gp_ci.pRasterizationState = &rs_ci;
8461 gp_ci.pColorBlendState = &cb_ci;
8462 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008463 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008464 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8465 gp_ci.layout = pipeline_layout;
8466 gp_ci.renderPass = renderPass();
8467
8468 VkPipelineCacheCreateInfo pc_ci = {};
8469 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8470
8471 VkPipeline pipeline;
8472 VkPipelineCache pipelineCache;
8473
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008474 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008475 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008476 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008477
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008478 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008479
8480 // Now hit second fail case where we set scissor w/ different count than PSO
8481 // First need to successfully create the PSO from above by setting
8482 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8484 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008486 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008487 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008488 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008489 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008490 m_commandBuffer->BeginCommandBuffer();
8491 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008492 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008493 VkViewport viewports[1] = {};
8494 viewports[0].width = 8;
8495 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008496 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008497 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008498 Draw(1, 0, 0, 0);
8499
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008500 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008501
Chia-I Wuf7458c52015-10-26 21:10:41 +08008502 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8503 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8504 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8505 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008506 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008507}
8508
Mark Young7394fdd2016-03-31 14:56:43 -06008509TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8510 VkResult err;
8511
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008513
Tony Barbour1fa09702017-03-16 12:09:08 -06008514 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8516
8517 VkDescriptorPoolSize ds_type_count = {};
8518 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8519 ds_type_count.descriptorCount = 1;
8520
8521 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8522 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8523 ds_pool_ci.maxSets = 1;
8524 ds_pool_ci.poolSizeCount = 1;
8525 ds_pool_ci.pPoolSizes = &ds_type_count;
8526
8527 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008528 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008529 ASSERT_VK_SUCCESS(err);
8530
8531 VkDescriptorSetLayoutBinding dsl_binding = {};
8532 dsl_binding.binding = 0;
8533 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8534 dsl_binding.descriptorCount = 1;
8535 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8536
8537 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8538 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8539 ds_layout_ci.bindingCount = 1;
8540 ds_layout_ci.pBindings = &dsl_binding;
8541
8542 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008543 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008544 ASSERT_VK_SUCCESS(err);
8545
8546 VkDescriptorSet descriptorSet;
8547 VkDescriptorSetAllocateInfo alloc_info = {};
8548 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8549 alloc_info.descriptorSetCount = 1;
8550 alloc_info.descriptorPool = ds_pool;
8551 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008552 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008553 ASSERT_VK_SUCCESS(err);
8554
8555 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8556 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8557 pipeline_layout_ci.setLayoutCount = 1;
8558 pipeline_layout_ci.pSetLayouts = &ds_layout;
8559
8560 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008561 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008562 ASSERT_VK_SUCCESS(err);
8563
8564 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8565 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8566 vp_state_ci.scissorCount = 1;
8567 vp_state_ci.pScissors = NULL;
8568 vp_state_ci.viewportCount = 1;
8569 vp_state_ci.pViewports = NULL;
8570
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008571 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008572 // Set scissor as dynamic to avoid that error
8573 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8574 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8575 dyn_state_ci.dynamicStateCount = 2;
8576 dyn_state_ci.pDynamicStates = dynamic_states;
8577
8578 VkPipelineShaderStageCreateInfo shaderStages[2];
8579 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008581 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8582 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008583 this); // TODO - We shouldn't need a fragment shader
8584 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008585 shaderStages[0] = vs.GetStageCreateInfo();
8586 shaderStages[1] = fs.GetStageCreateInfo();
8587
8588 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8589 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8590 vi_ci.pNext = nullptr;
8591 vi_ci.vertexBindingDescriptionCount = 0;
8592 vi_ci.pVertexBindingDescriptions = nullptr;
8593 vi_ci.vertexAttributeDescriptionCount = 0;
8594 vi_ci.pVertexAttributeDescriptions = nullptr;
8595
8596 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8597 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8598 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8599
8600 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8601 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8602 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008603 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008604
Mark Young47107952016-05-02 15:59:55 -06008605 // Check too low (line width of -1.0f).
8606 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008607
8608 VkPipelineColorBlendAttachmentState att = {};
8609 att.blendEnable = VK_FALSE;
8610 att.colorWriteMask = 0xf;
8611
8612 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8613 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8614 cb_ci.pNext = nullptr;
8615 cb_ci.attachmentCount = 1;
8616 cb_ci.pAttachments = &att;
8617
8618 VkGraphicsPipelineCreateInfo gp_ci = {};
8619 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8620 gp_ci.stageCount = 2;
8621 gp_ci.pStages = shaderStages;
8622 gp_ci.pVertexInputState = &vi_ci;
8623 gp_ci.pInputAssemblyState = &ia_ci;
8624 gp_ci.pViewportState = &vp_state_ci;
8625 gp_ci.pRasterizationState = &rs_ci;
8626 gp_ci.pColorBlendState = &cb_ci;
8627 gp_ci.pDynamicState = &dyn_state_ci;
8628 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8629 gp_ci.layout = pipeline_layout;
8630 gp_ci.renderPass = renderPass();
8631
8632 VkPipelineCacheCreateInfo pc_ci = {};
8633 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8634
8635 VkPipeline pipeline;
8636 VkPipelineCache pipelineCache;
8637
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008638 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008639 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008640 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008641
8642 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008643 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008644
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008646
8647 // Check too high (line width of 65536.0f).
8648 rs_ci.lineWidth = 65536.0f;
8649
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008650 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008651 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008652 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008653
8654 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008655 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008656
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008658
8659 dyn_state_ci.dynamicStateCount = 3;
8660
8661 rs_ci.lineWidth = 1.0f;
8662
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008663 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008664 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008665 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008666 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008667 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008668
8669 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008670 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008671 m_errorMonitor->VerifyFound();
8672
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008674
8675 // Check too high with dynamic setting.
8676 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8677 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008678 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008679
8680 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8681 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8682 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8683 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008684 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008685}
8686
Jeremy Hayes37f0cdd2017-05-04 18:08:49 -06008687TEST_F(VkLayerTest, VALIDATION_ERROR_01407) {
8688 TEST_DESCRIPTION("Test VALIDATION_ERROR_01407: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
8689
8690 ASSERT_NO_FATAL_FAILURE(Init());
8691 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8692
8693 VkPipelineCache pipeline_cache;
8694 {
8695 VkPipelineCacheCreateInfo create_info{};
8696 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8697
8698 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8699 ASSERT_VK_SUCCESS(err);
8700 }
8701
8702 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8703 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8704
8705 VkPipelineShaderStageCreateInfo stages[2]{{}};
8706 stages[0] = vs.GetStageCreateInfo();
8707 stages[1] = fs.GetStageCreateInfo();
8708
8709 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
8710 VkVertexInputBindingDescription vertex_input_binding_description{};
8711 vertex_input_binding_description.binding = m_device->props.limits.maxVertexInputBindings;
8712
8713 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8714 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8715 vertex_input_state.pNext = nullptr;
8716 vertex_input_state.vertexBindingDescriptionCount = 1;
8717 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8718 vertex_input_state.vertexAttributeDescriptionCount = 0;
8719 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8720
8721 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8722 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8723 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8724
8725 VkViewport viewport{};
8726 VkPipelineViewportStateCreateInfo viewport_state{};
8727 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8728 viewport_state.scissorCount = 1;
8729 viewport_state.viewportCount = 1;
8730 viewport_state.pViewports = &viewport;
8731
8732 VkPipelineMultisampleStateCreateInfo multisample_state{};
8733 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8734 multisample_state.pNext = nullptr;
8735 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8736 multisample_state.sampleShadingEnable = 0;
8737 multisample_state.minSampleShading = 1.0;
8738 multisample_state.pSampleMask = nullptr;
8739
8740 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8741 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8742 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8743 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8744 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8745 rasterization_state.depthClampEnable = VK_FALSE;
8746 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8747 rasterization_state.depthBiasEnable = VK_FALSE;
8748
8749 VkPipelineLayout pipeline_layout;
8750 {
8751 VkPipelineLayoutCreateInfo create_info{};
8752 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8753 create_info.setLayoutCount = 0;
8754 create_info.pSetLayouts = nullptr;
8755
8756 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8757 ASSERT_VK_SUCCESS(err);
8758 }
8759
8760 {
8761 VkGraphicsPipelineCreateInfo create_info{};
8762 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8763 create_info.stageCount = 2;
8764 create_info.pStages = stages;
8765 create_info.pVertexInputState = &vertex_input_state;
8766 create_info.pInputAssemblyState = &input_assembly_state;
8767 create_info.pViewportState = &viewport_state;
8768 create_info.pMultisampleState = &multisample_state;
8769 create_info.pRasterizationState = &rasterization_state;
8770 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8771 create_info.layout = pipeline_layout;
8772 create_info.renderPass = renderPass();
8773
8774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01407);
8775 VkPipeline pipeline;
8776 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8777 m_errorMonitor->VerifyFound();
8778 }
8779
8780 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8781 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8782}
8783
8784TEST_F(VkLayerTest, VALIDATION_ERROR_01408) {
8785 TEST_DESCRIPTION(
8786 "Test VALIDATION_ERROR_01408: stride must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride");
8787
8788 ASSERT_NO_FATAL_FAILURE(Init());
8789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8790
8791 VkPipelineCache pipeline_cache;
8792 {
8793 VkPipelineCacheCreateInfo create_info{};
8794 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8795
8796 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8797 ASSERT_VK_SUCCESS(err);
8798 }
8799
8800 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8801 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8802
8803 VkPipelineShaderStageCreateInfo stages[2]{{}};
8804 stages[0] = vs.GetStageCreateInfo();
8805 stages[1] = fs.GetStageCreateInfo();
8806
8807 // Test when stride is greater than VkPhysicalDeviceLimits::maxVertexInputBindingStride.
8808 VkVertexInputBindingDescription vertex_input_binding_description{};
8809 vertex_input_binding_description.stride = m_device->props.limits.maxVertexInputBindingStride + 1;
8810
8811 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8812 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8813 vertex_input_state.pNext = nullptr;
8814 vertex_input_state.vertexBindingDescriptionCount = 1;
8815 vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding_description;
8816 vertex_input_state.vertexAttributeDescriptionCount = 0;
8817 vertex_input_state.pVertexAttributeDescriptions = nullptr;
8818
8819 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8820 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8821 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8822
8823 VkViewport viewport{};
8824 VkPipelineViewportStateCreateInfo viewport_state{};
8825 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8826 viewport_state.scissorCount = 1;
8827 viewport_state.viewportCount = 1;
8828 viewport_state.pViewports = &viewport;
8829
8830 VkPipelineMultisampleStateCreateInfo multisample_state{};
8831 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8832 multisample_state.pNext = nullptr;
8833 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8834 multisample_state.sampleShadingEnable = 0;
8835 multisample_state.minSampleShading = 1.0;
8836 multisample_state.pSampleMask = nullptr;
8837
8838 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8839 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8840 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8841 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8842 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8843 rasterization_state.depthClampEnable = VK_FALSE;
8844 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8845 rasterization_state.depthBiasEnable = VK_FALSE;
8846
8847 VkPipelineLayout pipeline_layout;
8848 {
8849 VkPipelineLayoutCreateInfo create_info{};
8850 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8851 create_info.setLayoutCount = 0;
8852 create_info.pSetLayouts = nullptr;
8853
8854 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8855 ASSERT_VK_SUCCESS(err);
8856 }
8857
8858 {
8859 VkGraphicsPipelineCreateInfo create_info{};
8860 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8861 create_info.stageCount = 2;
8862 create_info.pStages = stages;
8863 create_info.pVertexInputState = &vertex_input_state;
8864 create_info.pInputAssemblyState = &input_assembly_state;
8865 create_info.pViewportState = &viewport_state;
8866 create_info.pMultisampleState = &multisample_state;
8867 create_info.pRasterizationState = &rasterization_state;
8868 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8869 create_info.layout = pipeline_layout;
8870 create_info.renderPass = renderPass();
8871
8872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01408);
8873 VkPipeline pipeline;
8874 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8875 m_errorMonitor->VerifyFound();
8876 }
8877
8878 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8879 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8880}
8881
Jeremy Hayes091e1ab2017-05-04 18:10:28 -06008882TEST_F(VkLayerTest, VALIDATION_ERROR_01410) {
8883 TEST_DESCRIPTION("Test VALIDATION_ERROR_01410: location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes");
8884
8885 ASSERT_NO_FATAL_FAILURE(Init());
8886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8887
8888 VkPipelineCache pipeline_cache;
8889 {
8890 VkPipelineCacheCreateInfo create_info{};
8891 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8892
8893 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8894 ASSERT_VK_SUCCESS(err);
8895 }
8896
8897 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8898 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8899
8900 VkPipelineShaderStageCreateInfo stages[2]{{}};
8901 stages[0] = vs.GetStageCreateInfo();
8902 stages[1] = fs.GetStageCreateInfo();
8903
8904 // Test when location is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes.
8905 VkVertexInputAttributeDescription vertex_input_attribute_description{};
8906 vertex_input_attribute_description.location = m_device->props.limits.maxVertexInputAttributes;
8907
8908 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
8909 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8910 vertex_input_state.pNext = nullptr;
8911 vertex_input_state.vertexBindingDescriptionCount = 0;
8912 vertex_input_state.pVertexBindingDescriptions = nullptr;
8913 vertex_input_state.vertexAttributeDescriptionCount = 1;
8914 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
8915
8916 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
8917 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8918 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8919
8920 VkViewport viewport{};
8921 VkPipelineViewportStateCreateInfo viewport_state{};
8922 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8923 viewport_state.scissorCount = 1;
8924 viewport_state.viewportCount = 1;
8925 viewport_state.pViewports = &viewport;
8926
8927 VkPipelineMultisampleStateCreateInfo multisample_state{};
8928 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8929 multisample_state.pNext = nullptr;
8930 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8931 multisample_state.sampleShadingEnable = 0;
8932 multisample_state.minSampleShading = 1.0;
8933 multisample_state.pSampleMask = nullptr;
8934
8935 VkPipelineRasterizationStateCreateInfo rasterization_state{};
8936 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8937 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
8938 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
8939 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8940 rasterization_state.depthClampEnable = VK_FALSE;
8941 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
8942 rasterization_state.depthBiasEnable = VK_FALSE;
8943
8944 VkPipelineLayout pipeline_layout;
8945 {
8946 VkPipelineLayoutCreateInfo create_info{};
8947 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8948 create_info.setLayoutCount = 0;
8949 create_info.pSetLayouts = nullptr;
8950
8951 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
8952 ASSERT_VK_SUCCESS(err);
8953 }
8954
8955 {
8956 VkGraphicsPipelineCreateInfo create_info{};
8957 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8958 create_info.stageCount = 2;
8959 create_info.pStages = stages;
8960 create_info.pVertexInputState = &vertex_input_state;
8961 create_info.pInputAssemblyState = &input_assembly_state;
8962 create_info.pViewportState = &viewport_state;
8963 create_info.pMultisampleState = &multisample_state;
8964 create_info.pRasterizationState = &rasterization_state;
8965 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8966 create_info.layout = pipeline_layout;
8967 create_info.renderPass = renderPass();
8968
8969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01410);
8970 VkPipeline pipeline;
8971 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
8972 m_errorMonitor->VerifyFound();
8973 }
8974
8975 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
8976 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
8977}
8978
8979TEST_F(VkLayerTest, VALIDATION_ERROR_01411) {
8980 TEST_DESCRIPTION("Test VALIDATION_ERROR_01411: binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings");
8981
8982 ASSERT_NO_FATAL_FAILURE(Init());
8983 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8984
8985 VkPipelineCache pipeline_cache;
8986 {
8987 VkPipelineCacheCreateInfo create_info{};
8988 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8989
8990 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
8991 ASSERT_VK_SUCCESS(err);
8992 }
8993
8994 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8995 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8996
8997 VkPipelineShaderStageCreateInfo stages[2]{{}};
8998 stages[0] = vs.GetStageCreateInfo();
8999 stages[1] = fs.GetStageCreateInfo();
9000
9001 // Test when binding is greater than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings.
9002 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9003 vertex_input_attribute_description.binding = m_device->props.limits.maxVertexInputBindings;
9004
9005 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9006 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9007 vertex_input_state.pNext = nullptr;
9008 vertex_input_state.vertexBindingDescriptionCount = 0;
9009 vertex_input_state.pVertexBindingDescriptions = nullptr;
9010 vertex_input_state.vertexAttributeDescriptionCount = 1;
9011 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9012
9013 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9014 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9015 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9016
9017 VkViewport viewport{};
9018 VkPipelineViewportStateCreateInfo viewport_state{};
9019 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9020 viewport_state.scissorCount = 1;
9021 viewport_state.viewportCount = 1;
9022 viewport_state.pViewports = &viewport;
9023
9024 VkPipelineMultisampleStateCreateInfo multisample_state{};
9025 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9026 multisample_state.pNext = nullptr;
9027 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9028 multisample_state.sampleShadingEnable = 0;
9029 multisample_state.minSampleShading = 1.0;
9030 multisample_state.pSampleMask = nullptr;
9031
9032 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9033 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9034 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9035 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9036 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9037 rasterization_state.depthClampEnable = VK_FALSE;
9038 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9039 rasterization_state.depthBiasEnable = VK_FALSE;
9040
9041 VkPipelineLayout pipeline_layout;
9042 {
9043 VkPipelineLayoutCreateInfo create_info{};
9044 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9045 create_info.setLayoutCount = 0;
9046 create_info.pSetLayouts = nullptr;
9047
9048 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9049 ASSERT_VK_SUCCESS(err);
9050 }
9051
9052 {
9053 VkGraphicsPipelineCreateInfo create_info{};
9054 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9055 create_info.stageCount = 2;
9056 create_info.pStages = stages;
9057 create_info.pVertexInputState = &vertex_input_state;
9058 create_info.pInputAssemblyState = &input_assembly_state;
9059 create_info.pViewportState = &viewport_state;
9060 create_info.pMultisampleState = &multisample_state;
9061 create_info.pRasterizationState = &rasterization_state;
9062 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9063 create_info.layout = pipeline_layout;
9064 create_info.renderPass = renderPass();
9065
9066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01411);
9067 VkPipeline pipeline;
9068 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9069 m_errorMonitor->VerifyFound();
9070 }
9071
9072 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9073 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9074}
9075
9076TEST_F(VkLayerTest, VALIDATION_ERROR_01412) {
9077 TEST_DESCRIPTION(
9078 "Test VALIDATION_ERROR_01412: offset must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributeOffset");
9079
9080 ASSERT_NO_FATAL_FAILURE(Init());
9081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9082
9083 VkPipelineCache pipeline_cache;
9084 {
9085 VkPipelineCacheCreateInfo create_info{};
9086 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
9087
9088 VkResult err = vkCreatePipelineCache(m_device->device(), &create_info, nullptr, &pipeline_cache);
9089 ASSERT_VK_SUCCESS(err);
9090 }
9091
9092 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
9093 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
9094
9095 VkPipelineShaderStageCreateInfo stages[2]{{}};
9096 stages[0] = vs.GetStageCreateInfo();
9097 stages[1] = fs.GetStageCreateInfo();
9098
9099 // Test when offset is greater than maximum.
9100 VkVertexInputAttributeDescription vertex_input_attribute_description{};
9101 vertex_input_attribute_description.offset = m_device->props.limits.maxVertexInputAttributeOffset + 1;
9102
9103 VkPipelineVertexInputStateCreateInfo vertex_input_state{};
9104 vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
9105 vertex_input_state.pNext = nullptr;
9106 vertex_input_state.vertexBindingDescriptionCount = 0;
9107 vertex_input_state.pVertexBindingDescriptions = nullptr;
9108 vertex_input_state.vertexAttributeDescriptionCount = 1;
9109 vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute_description;
9110
9111 VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
9112 input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
9113 input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
9114
9115 VkViewport viewport{};
9116 VkPipelineViewportStateCreateInfo viewport_state{};
9117 viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
9118 viewport_state.scissorCount = 1;
9119 viewport_state.viewportCount = 1;
9120 viewport_state.pViewports = &viewport;
9121
9122 VkPipelineMultisampleStateCreateInfo multisample_state{};
9123 multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
9124 multisample_state.pNext = nullptr;
9125 multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
9126 multisample_state.sampleShadingEnable = 0;
9127 multisample_state.minSampleShading = 1.0;
9128 multisample_state.pSampleMask = nullptr;
9129
9130 VkPipelineRasterizationStateCreateInfo rasterization_state{};
9131 rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
9132 rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;
9133 rasterization_state.cullMode = VK_CULL_MODE_BACK_BIT;
9134 rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
9135 rasterization_state.depthClampEnable = VK_FALSE;
9136 rasterization_state.rasterizerDiscardEnable = VK_FALSE;
9137 rasterization_state.depthBiasEnable = VK_FALSE;
9138
9139 VkPipelineLayout pipeline_layout;
9140 {
9141 VkPipelineLayoutCreateInfo create_info{};
9142 create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
9143 create_info.setLayoutCount = 0;
9144 create_info.pSetLayouts = nullptr;
9145
9146 VkResult err = vkCreatePipelineLayout(m_device->device(), &create_info, nullptr, &pipeline_layout);
9147 ASSERT_VK_SUCCESS(err);
9148 }
9149
9150 {
9151 VkGraphicsPipelineCreateInfo create_info{};
9152 create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
9153 create_info.stageCount = 2;
9154 create_info.pStages = stages;
9155 create_info.pVertexInputState = &vertex_input_state;
9156 create_info.pInputAssemblyState = &input_assembly_state;
9157 create_info.pViewportState = &viewport_state;
9158 create_info.pMultisampleState = &multisample_state;
9159 create_info.pRasterizationState = &rasterization_state;
9160 create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
9161 create_info.layout = pipeline_layout;
9162 create_info.renderPass = renderPass();
9163
9164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01412);
9165 VkPipeline pipeline;
9166 vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &create_info, nullptr, &pipeline);
9167 m_errorMonitor->VerifyFound();
9168 }
9169
9170 vkDestroyPipelineCache(m_device->device(), pipeline_cache, nullptr);
9171 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
9172}
9173
Karl Schultz6addd812016-02-02 17:17:23 -07009174TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009175 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07009177 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009178
Tony Barbour1fa09702017-03-16 12:09:08 -06009179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009181
Tony Barbour552f6c02016-12-21 14:34:07 -07009182 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07009183 // Don't care about RenderPass handle b/c error should be flagged before
9184 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009185 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009186
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009187 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06009188}
9189
Karl Schultz6addd812016-02-02 17:17:23 -07009190TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009191 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9193 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009194
Tony Barbour1fa09702017-03-16 12:09:08 -06009195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009197
Tony Barbour552f6c02016-12-21 14:34:07 -07009198 m_commandBuffer->BeginCommandBuffer();
9199 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07009200 // Just create a dummy Renderpass that's non-NULL so we can get to the
9201 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009202 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06009203
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009204 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06009205}
9206
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009207TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009208 TEST_DESCRIPTION(
9209 "Begin a renderPass where clearValueCount is less than"
9210 "the number of renderPass attachments that use loadOp"
9211 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009212
Tony Barbour1fa09702017-03-16 12:09:08 -06009213 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9215
9216 // Create a renderPass with a single attachment that uses loadOp CLEAR
9217 VkAttachmentReference attach = {};
9218 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9219 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009220 subpass.colorAttachmentCount = 1;
9221 subpass.pColorAttachments = &attach;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009222 VkRenderPassCreateInfo rpci = {};
9223 rpci.subpassCount = 1;
9224 rpci.pSubpasses = &subpass;
9225 rpci.attachmentCount = 1;
9226 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07009227 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009228 // Set loadOp to CLEAR
9229 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9230 rpci.pAttachments = &attach_desc;
9231 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9232 VkRenderPass rp;
9233 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9234
9235 VkCommandBufferInheritanceInfo hinfo = {};
9236 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
9237 hinfo.renderPass = VK_NULL_HANDLE;
9238 hinfo.subpass = 0;
9239 hinfo.framebuffer = VK_NULL_HANDLE;
9240 hinfo.occlusionQueryEnable = VK_FALSE;
9241 hinfo.queryFlags = 0;
9242 hinfo.pipelineStatistics = 0;
9243 VkCommandBufferBeginInfo info = {};
9244 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9245 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9246 info.pInheritanceInfo = &hinfo;
9247
9248 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9249 VkRenderPassBeginInfo rp_begin = {};
9250 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9251 rp_begin.pNext = NULL;
9252 rp_begin.renderPass = renderPass();
9253 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009254 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009255
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009257
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009258 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009259
9260 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06009261
9262 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06009263}
9264
Slawomir Cygan0808f392016-11-28 17:53:23 +01009265TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009266 TEST_DESCRIPTION(
9267 "Begin a renderPass where clearValueCount is greater than"
9268 "the number of renderPass attachments that use loadOp"
9269 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009270
Tony Barbour1fa09702017-03-16 12:09:08 -06009271 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01009272 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9273
9274 // Create a renderPass with a single attachment that uses loadOp CLEAR
9275 VkAttachmentReference attach = {};
9276 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
9277 VkSubpassDescription subpass = {};
Cort Stratton7547f772017-05-04 15:18:52 -07009278 subpass.colorAttachmentCount = 1;
9279 subpass.pColorAttachments = &attach;
Slawomir Cygan0808f392016-11-28 17:53:23 +01009280 VkRenderPassCreateInfo rpci = {};
9281 rpci.subpassCount = 1;
9282 rpci.pSubpasses = &subpass;
9283 rpci.attachmentCount = 1;
9284 VkAttachmentDescription attach_desc = {};
9285 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
9286 // Set loadOp to CLEAR
9287 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
9288 rpci.pAttachments = &attach_desc;
9289 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
9290 VkRenderPass rp;
9291 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
9292
9293 VkCommandBufferBeginInfo info = {};
9294 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
9295 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9296
9297 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
9298 VkRenderPassBeginInfo rp_begin = {};
9299 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
9300 rp_begin.pNext = NULL;
9301 rp_begin.renderPass = renderPass();
9302 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009303 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01009304
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
9306 " has a clearValueCount of"
9307 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01009308
9309 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
9310
9311 m_errorMonitor->VerifyFound();
9312
9313 vkDestroyRenderPass(m_device->device(), rp, NULL);
9314}
9315
Cody Northrop3bb4d962016-05-09 16:15:57 -06009316TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06009317 TEST_DESCRIPTION("End a command buffer with an active render pass");
9318
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9320 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06009321
Tony Barbour1fa09702017-03-16 12:09:08 -06009322 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009323 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9324
Tony Barbour552f6c02016-12-21 14:34:07 -07009325 m_commandBuffer->BeginCommandBuffer();
9326 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
9327 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06009328
9329 m_errorMonitor->VerifyFound();
9330
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009331 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
9332 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06009333}
9334
Karl Schultz6addd812016-02-02 17:17:23 -07009335TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009336 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9338 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009339
Tony Barbour1fa09702017-03-16 12:09:08 -06009340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009342
Tony Barbour552f6c02016-12-21 14:34:07 -07009343 m_commandBuffer->BeginCommandBuffer();
9344 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009345
9346 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009347 vk_testing::Buffer dstBuffer;
9348 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009349
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009350 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009351
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009352 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009353}
9354
Karl Schultz6addd812016-02-02 17:17:23 -07009355TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009356 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9358 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009359
Tony Barbour1fa09702017-03-16 12:09:08 -06009360 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009362
Tony Barbour552f6c02016-12-21 14:34:07 -07009363 m_commandBuffer->BeginCommandBuffer();
9364 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009365
9366 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009367 vk_testing::Buffer dstBuffer;
9368 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009369
Karl Schultz6addd812016-02-02 17:17:23 -07009370 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07009371 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
9372 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
9373 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009374
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009375 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009376}
9377
Karl Schultz6addd812016-02-02 17:17:23 -07009378TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009379 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9381 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009382
Tony Barbour1fa09702017-03-16 12:09:08 -06009383 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009384 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009385
Tony Barbour552f6c02016-12-21 14:34:07 -07009386 m_commandBuffer->BeginCommandBuffer();
9387 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009388
Michael Lentine0a369f62016-02-03 16:51:46 -06009389 VkClearColorValue clear_color;
9390 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07009391 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9392 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
9393 const int32_t tex_width = 32;
9394 const int32_t tex_height = 32;
9395 VkImageCreateInfo image_create_info = {};
9396 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9397 image_create_info.pNext = NULL;
9398 image_create_info.imageType = VK_IMAGE_TYPE_2D;
9399 image_create_info.format = tex_format;
9400 image_create_info.extent.width = tex_width;
9401 image_create_info.extent.height = tex_height;
9402 image_create_info.extent.depth = 1;
9403 image_create_info.mipLevels = 1;
9404 image_create_info.arrayLayers = 1;
9405 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
9406 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07009407 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009408
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009409 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009410 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009411
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009412 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009413
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009414 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009415
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009416 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009417}
9418
Karl Schultz6addd812016-02-02 17:17:23 -07009419TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009420 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9422 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009423
Tony Barbour1fa09702017-03-16 12:09:08 -06009424 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009426
Dave Houlton1d2022c2017-03-29 11:43:58 -06009427 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009428 if (!depth_format) {
9429 printf(" No Depth + Stencil format found. Skipped.\n");
9430 return;
9431 }
9432
Tony Barbour552f6c02016-12-21 14:34:07 -07009433 m_commandBuffer->BeginCommandBuffer();
9434 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009435
9436 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07009437 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009438 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
9439 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07009440 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07009441 image_create_info.extent.width = 64;
9442 image_create_info.extent.height = 64;
9443 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
9444 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009445
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009446 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009447 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009448
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009449 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009450
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009451 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9452 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009453
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009454 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009455}
9456
Karl Schultz6addd812016-02-02 17:17:23 -07009457TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009458 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009459 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009460
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9462 "vkCmdClearAttachments(): This call "
9463 "must be issued inside an active "
9464 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009465
Tony Barbour1fa09702017-03-16 12:09:08 -06009466 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009468
9469 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009470 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009471 ASSERT_VK_SUCCESS(err);
9472
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009473 VkClearAttachment color_attachment;
9474 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9475 color_attachment.clearValue.color.float32[0] = 0;
9476 color_attachment.clearValue.color.float32[1] = 0;
9477 color_attachment.clearValue.color.float32[2] = 0;
9478 color_attachment.clearValue.color.float32[3] = 0;
9479 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009480 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009481 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009482
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009483 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009484}
9485
Chris Forbes3b97e932016-09-07 11:29:24 +12009486TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009487 TEST_DESCRIPTION(
9488 "Test that an error is produced when CmdNextSubpass is "
9489 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009490
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9492 "vkCmdNextSubpass(): Attempted to advance "
9493 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009494
Tony Barbour1fa09702017-03-16 12:09:08 -06009495 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009496 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9497
Tony Barbour552f6c02016-12-21 14:34:07 -07009498 m_commandBuffer->BeginCommandBuffer();
9499 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009500
9501 // error here.
9502 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9503 m_errorMonitor->VerifyFound();
9504
Tony Barbour552f6c02016-12-21 14:34:07 -07009505 m_commandBuffer->EndRenderPass();
9506 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009507}
9508
Chris Forbes6d624702016-09-07 13:57:05 +12009509TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009510 TEST_DESCRIPTION(
9511 "Test that an error is produced when CmdEndRenderPass is "
9512 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009513
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9515 "vkCmdEndRenderPass(): Called before reaching "
9516 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009517
Tony Barbour1fa09702017-03-16 12:09:08 -06009518 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009519 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9520 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009521
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009522 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009523
9524 VkRenderPass rp;
9525 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9526 ASSERT_VK_SUCCESS(err);
9527
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009528 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009529
9530 VkFramebuffer fb;
9531 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9532 ASSERT_VK_SUCCESS(err);
9533
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009534 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009535
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009536 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 +12009537
9538 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9539
9540 // Error here.
9541 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9542 m_errorMonitor->VerifyFound();
9543
9544 // Clean up.
9545 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9546 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9547}
9548
Karl Schultz9e66a292016-04-21 15:57:51 -06009549TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9550 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9552 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009553
Tony Barbour1fa09702017-03-16 12:09:08 -06009554 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009555 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009556
9557 VkBufferMemoryBarrier buf_barrier = {};
9558 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9559 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9560 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9561 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9562 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9563 buf_barrier.buffer = VK_NULL_HANDLE;
9564 buf_barrier.offset = 0;
9565 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009566 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9567 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009568
9569 m_errorMonitor->VerifyFound();
9570}
9571
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009572TEST_F(VkLayerTest, InvalidBarriers) {
9573 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9574
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009576
Tony Barbour1fa09702017-03-16 12:09:08 -06009577 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009578 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009579 if (!depth_format) {
9580 printf(" No Depth + Stencil format found. Skipped.\n");
9581 return;
9582 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009583 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9584
9585 VkMemoryBarrier mem_barrier = {};
9586 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9587 mem_barrier.pNext = NULL;
9588 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9589 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009590 m_commandBuffer->BeginCommandBuffer();
9591 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009592 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009593 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009594 &mem_barrier, 0, nullptr, 0, nullptr);
9595 m_errorMonitor->VerifyFound();
9596
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009598 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009599 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009600 ASSERT_TRUE(image.initialized());
9601 VkImageMemoryBarrier img_barrier = {};
9602 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9603 img_barrier.pNext = NULL;
9604 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9605 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009606 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009607 // New layout can't be UNDEFINED
9608 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9609 img_barrier.image = image.handle();
9610 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9611 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9612 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9613 img_barrier.subresourceRange.baseArrayLayer = 0;
9614 img_barrier.subresourceRange.baseMipLevel = 0;
9615 img_barrier.subresourceRange.layerCount = 1;
9616 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009617 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9618 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009619 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009620
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009621 // Transition image to color attachment optimal
9622 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9623 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9624 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9625 nullptr, 0, nullptr, 1, &img_barrier);
9626 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009627
Mark Lobodzinski45daf6e2017-05-10 13:19:02 -06009628 // Try to change layout in a renderpass
9629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02080);
9630 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9631 nullptr, 0, nullptr, 1, &img_barrier);
9632 m_errorMonitor->VerifyFound();
9633
9634 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski95512b72017-05-10 12:21:30 -06009635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009636 // baseArrayLayer + layerCount must be <= image's arrayLayers
9637 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009638 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9639 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009640 m_errorMonitor->VerifyFound();
9641 img_barrier.subresourceRange.baseArrayLayer = 0;
9642
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009644 // baseMipLevel + levelCount must be <= image's mipLevels
9645 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009646 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9647 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009648 m_errorMonitor->VerifyFound();
9649 img_barrier.subresourceRange.baseMipLevel = 0;
9650
Mike Weiblen7053aa32017-01-25 15:21:10 -07009651 // levelCount must be non-zero.
9652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9653 img_barrier.subresourceRange.levelCount = 0;
9654 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9655 nullptr, 0, nullptr, 1, &img_barrier);
9656 m_errorMonitor->VerifyFound();
9657 img_barrier.subresourceRange.levelCount = 1;
9658
9659 // layerCount must be non-zero.
9660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9661 img_barrier.subresourceRange.layerCount = 0;
9662 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9663 nullptr, 0, nullptr, 1, &img_barrier);
9664 m_errorMonitor->VerifyFound();
9665 img_barrier.subresourceRange.layerCount = 1;
9666
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009667 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 -06009668 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009669 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9670 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009671 VkBufferMemoryBarrier buf_barrier = {};
9672 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9673 buf_barrier.pNext = NULL;
9674 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9675 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9676 buf_barrier.buffer = buffer.handle();
9677 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9678 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9679 buf_barrier.offset = 0;
9680 buf_barrier.size = VK_WHOLE_SIZE;
9681 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009682 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9683 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009684 m_errorMonitor->VerifyFound();
9685 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9686
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009688 buf_barrier.offset = 257;
9689 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009690 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9691 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009692 m_errorMonitor->VerifyFound();
9693 buf_barrier.offset = 0;
9694
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009696 buf_barrier.size = 257;
9697 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009698 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9699 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009700 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009701
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009702 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009705 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009706 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009707 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009708 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9709 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009710 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009711
9712 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009713 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009714 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9715 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009716 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009717
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009718 // Having only one of depth or stencil set for DS image is an error
9719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9720 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9721 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9722 nullptr, 0, nullptr, 1, &img_barrier);
9723 m_errorMonitor->VerifyFound();
9724
9725 // Having anything other than DEPTH and STENCIL is an error
9726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009727 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9728 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9729 nullptr, 0, nullptr, 1, &img_barrier);
9730 m_errorMonitor->VerifyFound();
9731
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009732 // Now test depth-only
9733 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009734 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9735 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009736 VkDepthStencilObj d_image(m_device);
9737 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9738 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009739 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009740 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009741 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009742
9743 // DEPTH bit must be set
9744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9745 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009746 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009747 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9748 0, nullptr, 0, nullptr, 1, &img_barrier);
9749 m_errorMonitor->VerifyFound();
9750
9751 // No bits other than DEPTH may be set
9752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9753 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9754 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009755 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9756 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009757 m_errorMonitor->VerifyFound();
9758 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009759
9760 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009761 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9762 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009763 VkDepthStencilObj s_image(m_device);
9764 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9765 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009766 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009767 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009768 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009769 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9771 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009772 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009773 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9774 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009775 m_errorMonitor->VerifyFound();
9776 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009777
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009778 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009779 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009780 c_image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009781 ASSERT_TRUE(c_image.initialized());
9782 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9783 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9784 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009785
9786 // COLOR bit must be set
9787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9788 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009789 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009790 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9791 nullptr, 0, nullptr, 1, &img_barrier);
9792 m_errorMonitor->VerifyFound();
9793
9794 // No bits other than COLOR may be set
9795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9796 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9797 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009798 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9799 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009800 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009801
Mike Weiblene6e01172017-03-07 22:18:40 -07009802 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9803 {
9804 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009805 img_color.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009806 ASSERT_TRUE(img_color.initialized());
9807
9808 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009809 img_ds.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009810 ASSERT_TRUE(img_ds.initialized());
9811
9812 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009813 img_xfer_src.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009814 ASSERT_TRUE(img_xfer_src.initialized());
9815
9816 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009817 img_xfer_dst.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009818 ASSERT_TRUE(img_xfer_dst.initialized());
9819
9820 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009821 img_sampled.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009822 ASSERT_TRUE(img_sampled.initialized());
9823
9824 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009825 img_input.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009826 ASSERT_TRUE(img_input.initialized());
9827
9828 const struct {
9829 VkImageObj &image_obj;
9830 VkImageLayout bad_layout;
9831 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9832 } bad_buffer_layouts[] = {
9833 // clang-format off
9834 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9835 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9836 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9837 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9838 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9839 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9840 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9841 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9842 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9843 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9844 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9845 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9846 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9847 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9848 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9849 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9850 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9851 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9852 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9853 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9854 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9855 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9856 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9857 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9858 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9859 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9860 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9861 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9862 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9863 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9864 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9865 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9866 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9867 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9868 // clang-format on
9869 };
9870 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9871
9872 for (uint32_t i = 0; i < layout_count; ++i) {
9873 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9874 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9875 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9876 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9877 : VK_IMAGE_ASPECT_COLOR_BIT;
9878
9879 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9880 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9882 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9883 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9884 m_errorMonitor->VerifyFound();
9885
9886 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9887 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9889 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9890 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9891 m_errorMonitor->VerifyFound();
9892 }
9893
9894 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9895 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9896 }
9897
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009898 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9899
9900 // Create command pool with incompatible queueflags
9901 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009902 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009903 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009904 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009905 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009906 }
9907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9908
9909 VkCommandPool command_pool;
9910 VkCommandPoolCreateInfo pool_create_info{};
9911 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9912 pool_create_info.queueFamilyIndex = queue_family_index;
9913 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9914 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9915
9916 // Allocate a command buffer
9917 VkCommandBuffer bad_command_buffer;
9918 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9919 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9920 command_buffer_allocate_info.commandPool = command_pool;
9921 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9922 command_buffer_allocate_info.commandBufferCount = 1;
9923 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9924
9925 VkCommandBufferBeginInfo cbbi = {};
9926 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9927 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9928 buf_barrier.offset = 0;
9929 buf_barrier.size = VK_WHOLE_SIZE;
9930 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9931 &buf_barrier, 0, nullptr);
9932 m_errorMonitor->VerifyFound();
9933
9934 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9935 vkEndCommandBuffer(bad_command_buffer);
9936 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009937 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009938 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009939 }
9940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9941 VkEvent event;
9942 VkEventCreateInfo event_create_info{};
9943 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9944 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9945 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9946 nullptr, 0, nullptr);
9947 m_errorMonitor->VerifyFound();
9948
9949 vkEndCommandBuffer(bad_command_buffer);
9950 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009951}
9952
Chris Forbes50223732017-05-01 09:43:35 -07009953TEST_F(VkPositiveLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9954 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ
9955 // in srcAccessMask.
Tony Barbour18ba25c2016-09-29 13:42:40 -06009956
Chris Forbes50223732017-05-01 09:43:35 -07009957 // The required behavior here was a bit unclear in earlier versions of the
9958 // spec, but there is no memory dependency required here, so this should
9959 // work without warnings.
9960
9961 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -06009962 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009963 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009964 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
Mike Weiblen62d08a32017-03-07 22:18:27 -07009965 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009966 ASSERT_TRUE(image.initialized());
9967
9968 VkImageMemoryBarrier barrier = {};
9969 VkImageSubresourceRange range;
9970 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009971 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
Chris Forbes50223732017-05-01 09:43:35 -07009972 barrier.dstAccessMask = 0;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009973 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9974 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9975 barrier.image = image.handle();
9976 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9977 range.baseMipLevel = 0;
9978 range.levelCount = 1;
9979 range.baseArrayLayer = 0;
9980 range.layerCount = 1;
9981 barrier.subresourceRange = range;
9982 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9983 cmdbuf.BeginCommandBuffer();
9984 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9985 &barrier);
9986 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9987 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9988 barrier.srcAccessMask = 0;
9989 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9990 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9991 &barrier);
9992
Chris Forbes50223732017-05-01 09:43:35 -07009993 m_errorMonitor->VerifyNotFound();
Tony Barbour18ba25c2016-09-29 13:42:40 -06009994}
9995
Karl Schultz6addd812016-02-02 17:17:23 -07009996TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009997 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009998 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010000
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010001 uint32_t const indices[] = {0};
10002 VkBufferCreateInfo buf_info = {};
10003 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10004 buf_info.size = 1024;
10005 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
10006 buf_info.queueFamilyIndexCount = 1;
10007 buf_info.pQueueFamilyIndices = indices;
10008
10009 VkBuffer buffer;
10010 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
10011 ASSERT_VK_SUCCESS(err);
10012
10013 VkMemoryRequirements requirements;
10014 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
10015
10016 VkMemoryAllocateInfo alloc_info{};
10017 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10018 alloc_info.pNext = NULL;
10019 alloc_info.memoryTypeIndex = 0;
10020 alloc_info.allocationSize = requirements.size;
10021 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
10022 ASSERT_TRUE(pass);
10023
10024 VkDeviceMemory memory;
10025 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
10026 ASSERT_VK_SUCCESS(err);
10027
10028 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010029 ASSERT_VK_SUCCESS(err);
10030
Tony Barbour552f6c02016-12-21 14:34:07 -070010031 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010032 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010033
Karl Schultz6addd812016-02-02 17:17:23 -070010034 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
10035 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010036 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
10038 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010039 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010040
Jeremy Hayes483d95d2017-03-08 11:03:01 -070010041 vkFreeMemory(m_device->device(), memory, NULL);
10042 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -060010043}
10044
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010045TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
10046 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -060010047 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10049 VkBufferCreateInfo buffCI = {};
10050 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10051 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010052 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010053 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010054 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010055 uint32_t qfi[2];
10056 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010057 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010058
10059 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010060 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010061
10062 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -070010063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Petr Kraus97291752017-05-11 01:05:16 +020010064 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (= 777) is not one of the queue "
10065 "families given via VkDeviceQueueCreateInfo structures when the device was created.");
Mark Lobodzinski1f9ebb72017-05-11 15:25:51 -060010066 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010067 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010068
10069 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -070010070 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
10072
10073 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
10074 buffCI.queueFamilyIndexCount = 2;
10075 qfi[0] = 1;
10076 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -070010077 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010078 VkDeviceMemory mem;
10079 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -070010080 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010081
10082 VkMemoryAllocateInfo alloc_info = {};
10083 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10084 alloc_info.allocationSize = 1024;
10085 bool pass = false;
10086 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
10087 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -070010088 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010089 return;
10090 }
10091 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -070010092 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010093
10094 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -070010095 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010096 m_commandBuffer->end();
10097 QueueCommandBuffer(false);
10098 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -070010099 vkDestroyBuffer(m_device->device(), ib2, NULL);
10100 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -070010101 }
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -070010102}
10103
Karl Schultz6addd812016-02-02 17:17:23 -070010104TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010105 TEST_DESCRIPTION(
10106 "Attempt vkCmdExecuteCommands with a primary command buffer"
10107 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010108
Tony Barbour1fa09702017-03-16 12:09:08 -060010109 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010111
Chris Forbesf29a84f2016-10-06 18:39:28 +130010112 // An empty primary command buffer
10113 VkCommandBufferObj cb(m_device, m_commandPool);
10114 cb.BeginCommandBuffer();
10115 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -060010116
Chris Forbesf29a84f2016-10-06 18:39:28 +130010117 m_commandBuffer->BeginCommandBuffer();
10118 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
10119 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010120
Chris Forbesf29a84f2016-10-06 18:39:28 +130010121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
10122 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010123 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070010124
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060010125 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -060010126}
10127
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010128TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010129 TEST_DESCRIPTION(
10130 "Attempt to update descriptor sets for images and buffers "
10131 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010132 VkResult err;
10133
Tony Barbour1fa09702017-03-16 12:09:08 -060010134 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010135 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10136 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10137 ds_type_count[i].type = VkDescriptorType(i);
10138 ds_type_count[i].descriptorCount = 1;
10139 }
10140 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10141 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10142 ds_pool_ci.pNext = NULL;
10143 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10144 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10145 ds_pool_ci.pPoolSizes = ds_type_count;
10146
10147 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010148 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010149 ASSERT_VK_SUCCESS(err);
10150
10151 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010152 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010153 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10154 dsl_binding[i].binding = 0;
10155 dsl_binding[i].descriptorType = VkDescriptorType(i);
10156 dsl_binding[i].descriptorCount = 1;
10157 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
10158 dsl_binding[i].pImmutableSamplers = NULL;
10159 }
10160
10161 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10162 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10163 ds_layout_ci.pNext = NULL;
10164 ds_layout_ci.bindingCount = 1;
10165 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
10166 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
10167 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010168 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010169 ASSERT_VK_SUCCESS(err);
10170 }
10171 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
10172 VkDescriptorSetAllocateInfo alloc_info = {};
10173 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10174 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
10175 alloc_info.descriptorPool = ds_pool;
10176 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010177 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010178 ASSERT_VK_SUCCESS(err);
10179
10180 // Create a buffer & bufferView to be used for invalid updates
10181 VkBufferCreateInfo buff_ci = {};
10182 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -070010183 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010184 buff_ci.size = 256;
10185 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -070010186 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010187 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10188 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -070010189
10190 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
10191 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
10192 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
10193 ASSERT_VK_SUCCESS(err);
10194
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010195 VkMemoryRequirements mem_reqs;
10196 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
10197 VkMemoryAllocateInfo mem_alloc_info = {};
10198 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10199 mem_alloc_info.pNext = NULL;
10200 mem_alloc_info.memoryTypeIndex = 0;
10201 mem_alloc_info.allocationSize = mem_reqs.size;
10202 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10203 if (!pass) {
10204 vkDestroyBuffer(m_device->device(), buffer, NULL);
10205 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10206 return;
10207 }
10208 VkDeviceMemory mem;
10209 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
10210 ASSERT_VK_SUCCESS(err);
10211 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10212 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010213
10214 VkBufferViewCreateInfo buff_view_ci = {};
10215 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
10216 buff_view_ci.buffer = buffer;
10217 buff_view_ci.format = VK_FORMAT_R8_UNORM;
10218 buff_view_ci.range = VK_WHOLE_SIZE;
10219 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010220 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010221 ASSERT_VK_SUCCESS(err);
10222
Tony Barbour415497c2017-01-24 10:06:09 -070010223 // Now get resources / view for storage_texel_buffer
10224 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
10225 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
10226 if (!pass) {
10227 vkDestroyBuffer(m_device->device(), buffer, NULL);
10228 vkDestroyBufferView(m_device->device(), buff_view, NULL);
10229 vkFreeMemory(m_device->device(), mem, NULL);
10230 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
10231 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10232 return;
10233 }
10234 VkDeviceMemory storage_texel_buffer_mem;
10235 VkBufferView storage_texel_buffer_view;
10236 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
10237 ASSERT_VK_SUCCESS(err);
10238 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
10239 ASSERT_VK_SUCCESS(err);
10240 buff_view_ci.buffer = storage_texel_buffer;
10241 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
10242 ASSERT_VK_SUCCESS(err);
10243
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010244 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -070010245 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010246 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -070010247 image_ci.format = VK_FORMAT_UNDEFINED;
10248 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
10249 VkFormat format = static_cast<VkFormat>(f);
10250 VkFormatProperties fProps = m_device->format_properties(format);
10251 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10252 image_ci.format = format;
10253 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
10254 break;
10255 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
10256 image_ci.format = format;
10257 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
10258 break;
10259 }
10260 }
10261 if (image_ci.format == VK_FORMAT_UNDEFINED) {
10262 return;
10263 }
10264
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010265 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10266 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010267 image_ci.extent.width = 64;
10268 image_ci.extent.height = 64;
10269 image_ci.extent.depth = 1;
10270 image_ci.mipLevels = 1;
10271 image_ci.arrayLayers = 1;
10272 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010273 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010274 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010275 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10276 VkImage image;
10277 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10278 ASSERT_VK_SUCCESS(err);
10279 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010280 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010281
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010282 VkMemoryAllocateInfo mem_alloc = {};
10283 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10284 mem_alloc.pNext = NULL;
10285 mem_alloc.allocationSize = 0;
10286 mem_alloc.memoryTypeIndex = 0;
10287 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10288 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010289 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010290 ASSERT_TRUE(pass);
10291 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10292 ASSERT_VK_SUCCESS(err);
10293 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10294 ASSERT_VK_SUCCESS(err);
10295 // Now create view for image
10296 VkImageViewCreateInfo image_view_ci = {};
10297 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10298 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -070010299 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010300 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10301 image_view_ci.subresourceRange.layerCount = 1;
10302 image_view_ci.subresourceRange.baseArrayLayer = 0;
10303 image_view_ci.subresourceRange.levelCount = 1;
10304 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
10305 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010306 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010307 ASSERT_VK_SUCCESS(err);
10308
10309 VkDescriptorBufferInfo buff_info = {};
10310 buff_info.buffer = buffer;
10311 VkDescriptorImageInfo img_info = {};
10312 img_info.imageView = image_view;
10313 VkWriteDescriptorSet descriptor_write = {};
10314 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10315 descriptor_write.dstBinding = 0;
10316 descriptor_write.descriptorCount = 1;
10317 descriptor_write.pTexelBufferView = &buff_view;
10318 descriptor_write.pBufferInfo = &buff_info;
10319 descriptor_write.pImageInfo = &img_info;
10320
10321 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010322 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010323 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
10324 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
10325 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
10326 VALIDATION_ERROR_00943, // STORAGE_IMAGE
10327 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
10328 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
10329 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
10330 VALIDATION_ERROR_00947, // STORAGE_BUFFER
10331 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
10332 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
10333 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010334 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010335 // Start loop at 1 as SAMPLER desc type has no usage bit error
10336 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -070010337 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10338 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
10339 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
10340 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010341 descriptor_write.descriptorType = VkDescriptorType(i);
10342 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010343 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010345 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010346
10347 m_errorMonitor->VerifyFound();
10348 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010349 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
10350 descriptor_write.pTexelBufferView = &buff_view;
10351 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010352 }
Tony Barbour415497c2017-01-24 10:06:09 -070010353
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010354 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
10355 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060010356 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010357 vkDestroyImageView(m_device->device(), image_view, NULL);
10358 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010359 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010360 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010361 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -070010362 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -070010363 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -060010364 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10365}
10366
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010367TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010368 TEST_DESCRIPTION(
10369 "Attempt to update buffer descriptor set that has incorrect "
10370 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010371 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010372 "2. range value of 0\n"
10373 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010374 VkResult err;
10375
Tony Barbour1fa09702017-03-16 12:09:08 -060010376 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010377 VkDescriptorPoolSize ds_type_count = {};
10378 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10379 ds_type_count.descriptorCount = 1;
10380
10381 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10382 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10383 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010384 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010385 ds_pool_ci.maxSets = 1;
10386 ds_pool_ci.poolSizeCount = 1;
10387 ds_pool_ci.pPoolSizes = &ds_type_count;
10388
10389 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010390 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010391 ASSERT_VK_SUCCESS(err);
10392
10393 // Create layout with single uniform buffer descriptor
10394 VkDescriptorSetLayoutBinding dsl_binding = {};
10395 dsl_binding.binding = 0;
10396 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10397 dsl_binding.descriptorCount = 1;
10398 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10399 dsl_binding.pImmutableSamplers = NULL;
10400
10401 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10402 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10403 ds_layout_ci.pNext = NULL;
10404 ds_layout_ci.bindingCount = 1;
10405 ds_layout_ci.pBindings = &dsl_binding;
10406 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010407 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010408 ASSERT_VK_SUCCESS(err);
10409
10410 VkDescriptorSet descriptor_set = {};
10411 VkDescriptorSetAllocateInfo alloc_info = {};
10412 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10413 alloc_info.descriptorSetCount = 1;
10414 alloc_info.descriptorPool = ds_pool;
10415 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010416 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010417 ASSERT_VK_SUCCESS(err);
10418
10419 // Create a buffer to be used for invalid updates
10420 VkBufferCreateInfo buff_ci = {};
10421 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10422 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010423 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010424 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10425 VkBuffer buffer;
10426 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
10427 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010428
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010429 // Have to bind memory to buffer before descriptor update
10430 VkMemoryAllocateInfo mem_alloc = {};
10431 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10432 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010433 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010434 mem_alloc.memoryTypeIndex = 0;
10435
10436 VkMemoryRequirements mem_reqs;
10437 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010438 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010439 if (!pass) {
10440 vkDestroyBuffer(m_device->device(), buffer, NULL);
10441 return;
10442 }
10443
10444 VkDeviceMemory mem;
10445 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
10446 ASSERT_VK_SUCCESS(err);
10447 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
10448 ASSERT_VK_SUCCESS(err);
10449
10450 VkDescriptorBufferInfo buff_info = {};
10451 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010452 // Cause error due to offset out of range
10453 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010454 buff_info.range = VK_WHOLE_SIZE;
10455 VkWriteDescriptorSet descriptor_write = {};
10456 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10457 descriptor_write.dstBinding = 0;
10458 descriptor_write.descriptorCount = 1;
10459 descriptor_write.pTexelBufferView = nullptr;
10460 descriptor_write.pBufferInfo = &buff_info;
10461 descriptor_write.pImageInfo = nullptr;
10462
10463 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10464 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010466
10467 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10468
10469 m_errorMonitor->VerifyFound();
10470 // Now cause error due to range of 0
10471 buff_info.offset = 0;
10472 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010474
10475 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10476
10477 m_errorMonitor->VerifyFound();
10478 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010479 buff_info.offset = 0;
10480 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010482
10483 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10484
10485 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010486 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010487 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10488 vkDestroyBuffer(m_device->device(), buffer, NULL);
10489 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10490 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10491}
10492
Tobin Ehlis845887e2017-02-02 19:01:44 -070010493TEST_F(VkLayerTest, DSBufferLimitErrors) {
10494 TEST_DESCRIPTION(
10495 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10496 "Test cases include:\n"
10497 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10498 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10499 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10500 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10501 VkResult err;
10502
Tony Barbour1fa09702017-03-16 12:09:08 -060010503 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010504 VkDescriptorPoolSize ds_type_count[2] = {};
10505 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10506 ds_type_count[0].descriptorCount = 1;
10507 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10508 ds_type_count[1].descriptorCount = 1;
10509
10510 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10511 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10512 ds_pool_ci.pNext = NULL;
10513 ds_pool_ci.maxSets = 1;
10514 ds_pool_ci.poolSizeCount = 2;
10515 ds_pool_ci.pPoolSizes = ds_type_count;
10516
10517 VkDescriptorPool ds_pool;
10518 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10519 ASSERT_VK_SUCCESS(err);
10520
10521 // Create layout with single uniform buffer & single storage buffer descriptor
10522 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10523 dsl_binding[0].binding = 0;
10524 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10525 dsl_binding[0].descriptorCount = 1;
10526 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10527 dsl_binding[0].pImmutableSamplers = NULL;
10528 dsl_binding[1].binding = 1;
10529 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10530 dsl_binding[1].descriptorCount = 1;
10531 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10532 dsl_binding[1].pImmutableSamplers = NULL;
10533
10534 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10535 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10536 ds_layout_ci.pNext = NULL;
10537 ds_layout_ci.bindingCount = 2;
10538 ds_layout_ci.pBindings = dsl_binding;
10539 VkDescriptorSetLayout ds_layout;
10540 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10541 ASSERT_VK_SUCCESS(err);
10542
10543 VkDescriptorSet descriptor_set = {};
10544 VkDescriptorSetAllocateInfo alloc_info = {};
10545 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10546 alloc_info.descriptorSetCount = 1;
10547 alloc_info.descriptorPool = ds_pool;
10548 alloc_info.pSetLayouts = &ds_layout;
10549 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10550 ASSERT_VK_SUCCESS(err);
10551
10552 // Create a buffer to be used for invalid updates
10553 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10554 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10555 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10556 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10557 VkBufferCreateInfo ub_ci = {};
10558 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10559 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10560 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10561 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10562 VkBuffer uniform_buffer;
10563 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10564 ASSERT_VK_SUCCESS(err);
10565 VkBufferCreateInfo sb_ci = {};
10566 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10567 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10568 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10569 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10570 VkBuffer storage_buffer;
10571 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10572 ASSERT_VK_SUCCESS(err);
10573 // Have to bind memory to buffer before descriptor update
10574 VkMemoryAllocateInfo mem_alloc = {};
10575 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10576 mem_alloc.pNext = NULL;
10577 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10578 mem_alloc.memoryTypeIndex = 0;
10579
Cort Stratton77a0d592017-02-17 13:14:13 -080010580 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10581 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10582 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10583 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10584 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010585 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010586 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010587 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010588 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10589 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010590 return;
10591 }
10592
10593 VkDeviceMemory mem;
10594 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010595 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010596 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010597 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10598 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10599 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10600 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10601 return;
10602 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010603 ASSERT_VK_SUCCESS(err);
10604 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10605 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010606 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010607 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10608 ASSERT_VK_SUCCESS(err);
10609
10610 VkDescriptorBufferInfo buff_info = {};
10611 buff_info.buffer = uniform_buffer;
10612 buff_info.range = ub_ci.size; // This will exceed limit
10613 VkWriteDescriptorSet descriptor_write = {};
10614 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10615 descriptor_write.dstBinding = 0;
10616 descriptor_write.descriptorCount = 1;
10617 descriptor_write.pTexelBufferView = nullptr;
10618 descriptor_write.pBufferInfo = &buff_info;
10619 descriptor_write.pImageInfo = nullptr;
10620
10621 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10622 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010623 if (max_ub_range != UINT32_MAX) {
10624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10625 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10626 m_errorMonitor->VerifyFound();
10627 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010628 // Reduce size of range to acceptable limit & cause offset error
10629 buff_info.range = max_ub_range;
10630 buff_info.offset = min_ub_align - 1;
10631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10632 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10633 m_errorMonitor->VerifyFound();
10634
10635 // Now break storage updates
10636 buff_info.buffer = storage_buffer;
10637 buff_info.range = sb_ci.size; // This will exceed limit
10638 buff_info.offset = 0; // Reset offset for this update
10639
10640 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10641 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010642 if (max_ub_range != UINT32_MAX) {
10643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10644 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10645 m_errorMonitor->VerifyFound();
10646 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010647
10648 // Reduce size of range to acceptable limit & cause offset error
10649 buff_info.range = max_sb_range;
10650 buff_info.offset = min_sb_align - 1;
10651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10652 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10653 m_errorMonitor->VerifyFound();
10654
10655 vkFreeMemory(m_device->device(), mem, NULL);
10656 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10657 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10658 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10659 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10660}
10661
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010662TEST_F(VkLayerTest, DSAspectBitsErrors) {
10663 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10664 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010665 TEST_DESCRIPTION(
10666 "Attempt to update descriptor sets for images "
10667 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010668 VkResult err;
10669
Tony Barbour1fa09702017-03-16 12:09:08 -060010670 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010671 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010672 if (!depth_format) {
10673 printf(" No Depth + Stencil format found. Skipped.\n");
10674 return;
10675 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010676 VkDescriptorPoolSize ds_type_count = {};
10677 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10678 ds_type_count.descriptorCount = 1;
10679
10680 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10681 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10682 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010683 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010684 ds_pool_ci.maxSets = 5;
10685 ds_pool_ci.poolSizeCount = 1;
10686 ds_pool_ci.pPoolSizes = &ds_type_count;
10687
10688 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010689 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010690 ASSERT_VK_SUCCESS(err);
10691
10692 VkDescriptorSetLayoutBinding dsl_binding = {};
10693 dsl_binding.binding = 0;
10694 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10695 dsl_binding.descriptorCount = 1;
10696 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10697 dsl_binding.pImmutableSamplers = NULL;
10698
10699 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10700 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10701 ds_layout_ci.pNext = NULL;
10702 ds_layout_ci.bindingCount = 1;
10703 ds_layout_ci.pBindings = &dsl_binding;
10704 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010705 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010706 ASSERT_VK_SUCCESS(err);
10707
10708 VkDescriptorSet descriptor_set = {};
10709 VkDescriptorSetAllocateInfo alloc_info = {};
10710 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10711 alloc_info.descriptorSetCount = 1;
10712 alloc_info.descriptorPool = ds_pool;
10713 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010714 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010715 ASSERT_VK_SUCCESS(err);
10716
10717 // Create an image to be used for invalid updates
10718 VkImageCreateInfo image_ci = {};
10719 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10720 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010721 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010722 image_ci.extent.width = 64;
10723 image_ci.extent.height = 64;
10724 image_ci.extent.depth = 1;
10725 image_ci.mipLevels = 1;
10726 image_ci.arrayLayers = 1;
10727 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010728 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010729 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10730 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10731 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10732 VkImage image;
10733 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10734 ASSERT_VK_SUCCESS(err);
10735 // Bind memory to image
10736 VkMemoryRequirements mem_reqs;
10737 VkDeviceMemory image_mem;
10738 bool pass;
10739 VkMemoryAllocateInfo mem_alloc = {};
10740 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10741 mem_alloc.pNext = NULL;
10742 mem_alloc.allocationSize = 0;
10743 mem_alloc.memoryTypeIndex = 0;
10744 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10745 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010746 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010747 ASSERT_TRUE(pass);
10748 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10749 ASSERT_VK_SUCCESS(err);
10750 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10751 ASSERT_VK_SUCCESS(err);
10752 // Now create view for image
10753 VkImageViewCreateInfo image_view_ci = {};
10754 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10755 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010756 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010757 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10758 image_view_ci.subresourceRange.layerCount = 1;
10759 image_view_ci.subresourceRange.baseArrayLayer = 0;
10760 image_view_ci.subresourceRange.levelCount = 1;
10761 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010762 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010763
10764 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010765 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010766 ASSERT_VK_SUCCESS(err);
10767
10768 VkDescriptorImageInfo img_info = {};
10769 img_info.imageView = image_view;
10770 VkWriteDescriptorSet descriptor_write = {};
10771 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10772 descriptor_write.dstBinding = 0;
10773 descriptor_write.descriptorCount = 1;
10774 descriptor_write.pTexelBufferView = NULL;
10775 descriptor_write.pBufferInfo = NULL;
10776 descriptor_write.pImageInfo = &img_info;
10777 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10778 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010779 const char *error_msg =
10780 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10781 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010783
10784 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10785
10786 m_errorMonitor->VerifyFound();
10787 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10788 vkDestroyImage(m_device->device(), image, NULL);
10789 vkFreeMemory(m_device->device(), image_mem, NULL);
10790 vkDestroyImageView(m_device->device(), image_view, NULL);
10791 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10792 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10793}
10794
Karl Schultz6addd812016-02-02 17:17:23 -070010795TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010796 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010797 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010798
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10800 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10801 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010802
Tony Barbour1fa09702017-03-16 12:09:08 -060010803 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010804 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010805 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010806 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10807 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010808
10809 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010810 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10811 ds_pool_ci.pNext = NULL;
10812 ds_pool_ci.maxSets = 1;
10813 ds_pool_ci.poolSizeCount = 1;
10814 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010815
Tobin Ehlis3b780662015-05-28 12:11:26 -060010816 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010817 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010818 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010819 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010820 dsl_binding.binding = 0;
10821 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10822 dsl_binding.descriptorCount = 1;
10823 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10824 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010825
Tony Barboureb254902015-07-15 12:50:33 -060010826 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010827 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10828 ds_layout_ci.pNext = NULL;
10829 ds_layout_ci.bindingCount = 1;
10830 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010831
Tobin Ehlis3b780662015-05-28 12:11:26 -060010832 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010833 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010834 ASSERT_VK_SUCCESS(err);
10835
10836 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010837 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010838 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010839 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010840 alloc_info.descriptorPool = ds_pool;
10841 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010842 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010843 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010844
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010845 VkSamplerCreateInfo sampler_ci = {};
10846 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10847 sampler_ci.pNext = NULL;
10848 sampler_ci.magFilter = VK_FILTER_NEAREST;
10849 sampler_ci.minFilter = VK_FILTER_NEAREST;
10850 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10851 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10852 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10853 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10854 sampler_ci.mipLodBias = 1.0;
10855 sampler_ci.anisotropyEnable = VK_FALSE;
10856 sampler_ci.maxAnisotropy = 1;
10857 sampler_ci.compareEnable = VK_FALSE;
10858 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10859 sampler_ci.minLod = 1.0;
10860 sampler_ci.maxLod = 1.0;
10861 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10862 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10863 VkSampler sampler;
10864 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10865 ASSERT_VK_SUCCESS(err);
10866
10867 VkDescriptorImageInfo info = {};
10868 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010869
10870 VkWriteDescriptorSet descriptor_write;
10871 memset(&descriptor_write, 0, sizeof(descriptor_write));
10872 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010873 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010874 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010875 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010876 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010877 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010878
10879 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10880
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010881 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010882
Chia-I Wuf7458c52015-10-26 21:10:41 +080010883 vkDestroySampler(m_device->device(), sampler, NULL);
10884 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10885 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010886}
10887
Karl Schultz6addd812016-02-02 17:17:23 -070010888TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010889 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010890 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010891
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010893
Tony Barbour1fa09702017-03-16 12:09:08 -060010894 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010895 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010896 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010897 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10898 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010899
10900 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010901 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10902 ds_pool_ci.pNext = NULL;
10903 ds_pool_ci.maxSets = 1;
10904 ds_pool_ci.poolSizeCount = 1;
10905 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010906
Tobin Ehlis3b780662015-05-28 12:11:26 -060010907 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010908 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010909 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010910
Tony Barboureb254902015-07-15 12:50:33 -060010911 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010912 dsl_binding.binding = 0;
10913 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10914 dsl_binding.descriptorCount = 1;
10915 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10916 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010917
10918 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010919 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10920 ds_layout_ci.pNext = NULL;
10921 ds_layout_ci.bindingCount = 1;
10922 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010923
Tobin Ehlis3b780662015-05-28 12:11:26 -060010924 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010925 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010926 ASSERT_VK_SUCCESS(err);
10927
10928 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010929 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010930 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010931 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010932 alloc_info.descriptorPool = ds_pool;
10933 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010934 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010935 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010936
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010937 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10938
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010939 // Correctly update descriptor to avoid "NOT_UPDATED" error
10940 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010941 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010942 buff_info.offset = 0;
10943 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010944
10945 VkWriteDescriptorSet descriptor_write;
10946 memset(&descriptor_write, 0, sizeof(descriptor_write));
10947 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010948 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010949 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010950 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010951 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10952 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010953
10954 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10955
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010956 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010957
Chia-I Wuf7458c52015-10-26 21:10:41 +080010958 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10959 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010960}
10961
Karl Schultz6addd812016-02-02 17:17:23 -070010962TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010963 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010964 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010965
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010967
Tony Barbour1fa09702017-03-16 12:09:08 -060010968 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010969 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010970 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010971 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10972 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010973
10974 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010975 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10976 ds_pool_ci.pNext = NULL;
10977 ds_pool_ci.maxSets = 1;
10978 ds_pool_ci.poolSizeCount = 1;
10979 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010980
Tobin Ehlis3b780662015-05-28 12:11:26 -060010981 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010982 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010983 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010984
Tony Barboureb254902015-07-15 12:50:33 -060010985 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010986 dsl_binding.binding = 0;
10987 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10988 dsl_binding.descriptorCount = 1;
10989 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10990 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010991
10992 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010993 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10994 ds_layout_ci.pNext = NULL;
10995 ds_layout_ci.bindingCount = 1;
10996 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010997 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010998 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010999 ASSERT_VK_SUCCESS(err);
11000
11001 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011002 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011003 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011004 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011005 alloc_info.descriptorPool = ds_pool;
11006 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011007 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011008 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011009
Tony Barboureb254902015-07-15 12:50:33 -060011010 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011011 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11012 sampler_ci.pNext = NULL;
11013 sampler_ci.magFilter = VK_FILTER_NEAREST;
11014 sampler_ci.minFilter = VK_FILTER_NEAREST;
11015 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11016 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11017 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11018 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11019 sampler_ci.mipLodBias = 1.0;
11020 sampler_ci.anisotropyEnable = VK_FALSE;
11021 sampler_ci.maxAnisotropy = 1;
11022 sampler_ci.compareEnable = VK_FALSE;
11023 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11024 sampler_ci.minLod = 1.0;
11025 sampler_ci.maxLod = 1.0;
11026 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11027 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060011028
Tobin Ehlis3b780662015-05-28 12:11:26 -060011029 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011030 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011031 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011032
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011033 VkDescriptorImageInfo info = {};
11034 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011035
11036 VkWriteDescriptorSet descriptor_write;
11037 memset(&descriptor_write, 0, sizeof(descriptor_write));
11038 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011039 descriptor_write.dstSet = descriptorSet;
11040 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011041 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011042 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011043 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011044 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011045
11046 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11047
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011048 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011049
Chia-I Wuf7458c52015-10-26 21:10:41 +080011050 vkDestroySampler(m_device->device(), sampler, NULL);
11051 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11052 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011053}
11054
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011055TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
11056 // Create layout w/ empty binding and attempt to update it
11057 VkResult err;
11058
Tony Barbour1fa09702017-03-16 12:09:08 -060011059 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011060
11061 VkDescriptorPoolSize ds_type_count = {};
11062 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11063 ds_type_count.descriptorCount = 1;
11064
11065 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11066 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11067 ds_pool_ci.pNext = NULL;
11068 ds_pool_ci.maxSets = 1;
11069 ds_pool_ci.poolSizeCount = 1;
11070 ds_pool_ci.pPoolSizes = &ds_type_count;
11071
11072 VkDescriptorPool ds_pool;
11073 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11074 ASSERT_VK_SUCCESS(err);
11075
11076 VkDescriptorSetLayoutBinding dsl_binding = {};
11077 dsl_binding.binding = 0;
11078 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11079 dsl_binding.descriptorCount = 0;
11080 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11081 dsl_binding.pImmutableSamplers = NULL;
11082
11083 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11084 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11085 ds_layout_ci.pNext = NULL;
11086 ds_layout_ci.bindingCount = 1;
11087 ds_layout_ci.pBindings = &dsl_binding;
11088 VkDescriptorSetLayout ds_layout;
11089 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11090 ASSERT_VK_SUCCESS(err);
11091
11092 VkDescriptorSet descriptor_set;
11093 VkDescriptorSetAllocateInfo alloc_info = {};
11094 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11095 alloc_info.descriptorSetCount = 1;
11096 alloc_info.descriptorPool = ds_pool;
11097 alloc_info.pSetLayouts = &ds_layout;
11098 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11099 ASSERT_VK_SUCCESS(err);
11100
11101 VkSamplerCreateInfo sampler_ci = {};
11102 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11103 sampler_ci.magFilter = VK_FILTER_NEAREST;
11104 sampler_ci.minFilter = VK_FILTER_NEAREST;
11105 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11106 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11107 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11108 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11109 sampler_ci.mipLodBias = 1.0;
11110 sampler_ci.maxAnisotropy = 1;
11111 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11112 sampler_ci.minLod = 1.0;
11113 sampler_ci.maxLod = 1.0;
11114 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11115
11116 VkSampler sampler;
11117 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
11118 ASSERT_VK_SUCCESS(err);
11119
11120 VkDescriptorImageInfo info = {};
11121 info.sampler = sampler;
11122
11123 VkWriteDescriptorSet descriptor_write;
11124 memset(&descriptor_write, 0, sizeof(descriptor_write));
11125 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
11126 descriptor_write.dstSet = descriptor_set;
11127 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011128 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070011129 // This is the wrong type, but empty binding error will be flagged first
11130 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11131 descriptor_write.pImageInfo = &info;
11132
11133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
11134 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11135 m_errorMonitor->VerifyFound();
11136
11137 vkDestroySampler(m_device->device(), sampler, NULL);
11138 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11139 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11140}
11141
Karl Schultz6addd812016-02-02 17:17:23 -070011142TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
11143 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
11144 // types
11145 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011146
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011147 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 -060011148
Tony Barbour1fa09702017-03-16 12:09:08 -060011149 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011150
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011151 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011152 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11153 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011154
11155 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011156 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11157 ds_pool_ci.pNext = NULL;
11158 ds_pool_ci.maxSets = 1;
11159 ds_pool_ci.poolSizeCount = 1;
11160 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011161
Tobin Ehlis3b780662015-05-28 12:11:26 -060011162 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011163 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011164 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060011165 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011166 dsl_binding.binding = 0;
11167 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11168 dsl_binding.descriptorCount = 1;
11169 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11170 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011171
Tony Barboureb254902015-07-15 12:50:33 -060011172 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011173 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11174 ds_layout_ci.pNext = NULL;
11175 ds_layout_ci.bindingCount = 1;
11176 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011177
Tobin Ehlis3b780662015-05-28 12:11:26 -060011178 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011179 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011180 ASSERT_VK_SUCCESS(err);
11181
11182 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011183 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011184 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011185 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011186 alloc_info.descriptorPool = ds_pool;
11187 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011188 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011189 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011190
Tony Barboureb254902015-07-15 12:50:33 -060011191 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011192 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11193 sampler_ci.pNext = NULL;
11194 sampler_ci.magFilter = VK_FILTER_NEAREST;
11195 sampler_ci.minFilter = VK_FILTER_NEAREST;
11196 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11197 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11198 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11199 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11200 sampler_ci.mipLodBias = 1.0;
11201 sampler_ci.anisotropyEnable = VK_FALSE;
11202 sampler_ci.maxAnisotropy = 1;
11203 sampler_ci.compareEnable = VK_FALSE;
11204 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11205 sampler_ci.minLod = 1.0;
11206 sampler_ci.maxLod = 1.0;
11207 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11208 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011209 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011210 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011211 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011212
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011213 VkDescriptorImageInfo info = {};
11214 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011215
11216 VkWriteDescriptorSet descriptor_write;
11217 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011218 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011219 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011220 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011221 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011222 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060011223 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080011224
11225 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11226
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011227 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011228
Chia-I Wuf7458c52015-10-26 21:10:41 +080011229 vkDestroySampler(m_device->device(), sampler, NULL);
11230 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11231 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011232}
11233
Karl Schultz6addd812016-02-02 17:17:23 -070011234TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011235 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070011236 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011237
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011239
Tony Barbour1fa09702017-03-16 12:09:08 -060011240 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011241 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
11242 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011243 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011244 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
11245 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011246
11247 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011248 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11249 ds_pool_ci.pNext = NULL;
11250 ds_pool_ci.maxSets = 1;
11251 ds_pool_ci.poolSizeCount = 1;
11252 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011253
11254 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011255 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011256 ASSERT_VK_SUCCESS(err);
11257
11258 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011259 dsl_binding.binding = 0;
11260 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11261 dsl_binding.descriptorCount = 1;
11262 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11263 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011264
11265 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011266 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11267 ds_layout_ci.pNext = NULL;
11268 ds_layout_ci.bindingCount = 1;
11269 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011270 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011271 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011272 ASSERT_VK_SUCCESS(err);
11273
11274 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011275 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011276 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011277 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011278 alloc_info.descriptorPool = ds_pool;
11279 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011280 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011281 ASSERT_VK_SUCCESS(err);
11282
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011283 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011284
11285 VkDescriptorImageInfo descriptor_info;
11286 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11287 descriptor_info.sampler = sampler;
11288
11289 VkWriteDescriptorSet descriptor_write;
11290 memset(&descriptor_write, 0, sizeof(descriptor_write));
11291 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011292 descriptor_write.dstSet = descriptorSet;
11293 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011294 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011295 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11296 descriptor_write.pImageInfo = &descriptor_info;
11297
11298 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11299
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011300 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011301
Chia-I Wuf7458c52015-10-26 21:10:41 +080011302 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11303 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011304}
11305
Karl Schultz6addd812016-02-02 17:17:23 -070011306TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
11307 // Create a single combined Image/Sampler descriptor and send it an invalid
11308 // imageView
11309 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011310
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011312
Tony Barbour1fa09702017-03-16 12:09:08 -060011313 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011314 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011315 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11316 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011317
11318 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011319 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11320 ds_pool_ci.pNext = NULL;
11321 ds_pool_ci.maxSets = 1;
11322 ds_pool_ci.poolSizeCount = 1;
11323 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011324
11325 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011326 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011327 ASSERT_VK_SUCCESS(err);
11328
11329 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011330 dsl_binding.binding = 0;
11331 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11332 dsl_binding.descriptorCount = 1;
11333 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11334 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011335
11336 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011337 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11338 ds_layout_ci.pNext = NULL;
11339 ds_layout_ci.bindingCount = 1;
11340 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011341 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011342 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011343 ASSERT_VK_SUCCESS(err);
11344
11345 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011346 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011347 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011348 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011349 alloc_info.descriptorPool = ds_pool;
11350 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011351 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011352 ASSERT_VK_SUCCESS(err);
11353
11354 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011355 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11356 sampler_ci.pNext = NULL;
11357 sampler_ci.magFilter = VK_FILTER_NEAREST;
11358 sampler_ci.minFilter = VK_FILTER_NEAREST;
11359 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11360 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11361 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11362 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11363 sampler_ci.mipLodBias = 1.0;
11364 sampler_ci.anisotropyEnable = VK_FALSE;
11365 sampler_ci.maxAnisotropy = 1;
11366 sampler_ci.compareEnable = VK_FALSE;
11367 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11368 sampler_ci.minLod = 1.0;
11369 sampler_ci.maxLod = 1.0;
11370 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11371 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011372
11373 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011374 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011375 ASSERT_VK_SUCCESS(err);
11376
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011377 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011378
11379 VkDescriptorImageInfo descriptor_info;
11380 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
11381 descriptor_info.sampler = sampler;
11382 descriptor_info.imageView = view;
11383
11384 VkWriteDescriptorSet descriptor_write;
11385 memset(&descriptor_write, 0, sizeof(descriptor_write));
11386 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011387 descriptor_write.dstSet = descriptorSet;
11388 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011389 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011390 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
11391 descriptor_write.pImageInfo = &descriptor_info;
11392
11393 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11394
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011395 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011396
Chia-I Wuf7458c52015-10-26 21:10:41 +080011397 vkDestroySampler(m_device->device(), sampler, NULL);
11398 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11399 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060011400}
11401
Karl Schultz6addd812016-02-02 17:17:23 -070011402TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
11403 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
11404 // into the other
11405 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011406
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11408 " binding #1 with type "
11409 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
11410 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011411
Tony Barbour1fa09702017-03-16 12:09:08 -060011412 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070011413 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011414 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011415 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11416 ds_type_count[0].descriptorCount = 1;
11417 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
11418 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011419
11420 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011421 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11422 ds_pool_ci.pNext = NULL;
11423 ds_pool_ci.maxSets = 1;
11424 ds_pool_ci.poolSizeCount = 2;
11425 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011426
11427 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011428 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011429 ASSERT_VK_SUCCESS(err);
11430 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011431 dsl_binding[0].binding = 0;
11432 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11433 dsl_binding[0].descriptorCount = 1;
11434 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
11435 dsl_binding[0].pImmutableSamplers = NULL;
11436 dsl_binding[1].binding = 1;
11437 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11438 dsl_binding[1].descriptorCount = 1;
11439 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
11440 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011441
11442 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011443 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11444 ds_layout_ci.pNext = NULL;
11445 ds_layout_ci.bindingCount = 2;
11446 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011447
11448 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011449 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011450 ASSERT_VK_SUCCESS(err);
11451
11452 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011453 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011454 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011455 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011456 alloc_info.descriptorPool = ds_pool;
11457 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011458 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011459 ASSERT_VK_SUCCESS(err);
11460
11461 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011462 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11463 sampler_ci.pNext = NULL;
11464 sampler_ci.magFilter = VK_FILTER_NEAREST;
11465 sampler_ci.minFilter = VK_FILTER_NEAREST;
11466 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11467 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11468 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11469 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11470 sampler_ci.mipLodBias = 1.0;
11471 sampler_ci.anisotropyEnable = VK_FALSE;
11472 sampler_ci.maxAnisotropy = 1;
11473 sampler_ci.compareEnable = VK_FALSE;
11474 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11475 sampler_ci.minLod = 1.0;
11476 sampler_ci.maxLod = 1.0;
11477 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11478 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011479
11480 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011481 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011482 ASSERT_VK_SUCCESS(err);
11483
11484 VkDescriptorImageInfo info = {};
11485 info.sampler = sampler;
11486
11487 VkWriteDescriptorSet descriptor_write;
11488 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11489 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011490 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011491 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011492 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011493 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11494 descriptor_write.pImageInfo = &info;
11495 // This write update should succeed
11496 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11497 // Now perform a copy update that fails due to type mismatch
11498 VkCopyDescriptorSet copy_ds_update;
11499 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11500 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11501 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011502 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011503 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011504 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11505 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011506 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11507
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011508 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011509 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011510 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 -060011511 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11512 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11513 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011514 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011515 copy_ds_update.dstSet = descriptorSet;
11516 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011517 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011518 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11519
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011520 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011521
Tobin Ehlis04356f92015-10-27 16:35:27 -060011522 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11524 " binding#1 with offset index of 1 plus "
11525 "update array offset of 0 and update of "
11526 "5 descriptors oversteps total number "
11527 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011528
Tobin Ehlis04356f92015-10-27 16:35:27 -060011529 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11530 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11531 copy_ds_update.srcSet = descriptorSet;
11532 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011533 copy_ds_update.dstSet = descriptorSet;
11534 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011535 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011536 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11537
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011538 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011539
Chia-I Wuf7458c52015-10-26 21:10:41 +080011540 vkDestroySampler(m_device->device(), sampler, NULL);
11541 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11542 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011543}
11544
Karl Schultz6addd812016-02-02 17:17:23 -070011545TEST_F(VkLayerTest, NumSamplesMismatch) {
11546 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11547 // sampleCount
11548 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011549
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011551
Tony Barbour1fa09702017-03-16 12:09:08 -060011552 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011554 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011555 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011556 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011557
11558 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011559 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11560 ds_pool_ci.pNext = NULL;
11561 ds_pool_ci.maxSets = 1;
11562 ds_pool_ci.poolSizeCount = 1;
11563 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011564
Tobin Ehlis3b780662015-05-28 12:11:26 -060011565 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011566 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011567 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011568
Tony Barboureb254902015-07-15 12:50:33 -060011569 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011570 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011571 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011572 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011573 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11574 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011575
Tony Barboureb254902015-07-15 12:50:33 -060011576 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11577 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11578 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011579 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011580 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011581
Tobin Ehlis3b780662015-05-28 12:11:26 -060011582 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011583 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011584 ASSERT_VK_SUCCESS(err);
11585
11586 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011587 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011588 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011589 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011590 alloc_info.descriptorPool = ds_pool;
11591 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011592 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011593 ASSERT_VK_SUCCESS(err);
11594
Tony Barboureb254902015-07-15 12:50:33 -060011595 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011596 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011597 pipe_ms_state_ci.pNext = NULL;
11598 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11599 pipe_ms_state_ci.sampleShadingEnable = 0;
11600 pipe_ms_state_ci.minSampleShading = 1.0;
11601 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011602
Tony Barboureb254902015-07-15 12:50:33 -060011603 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011604 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11605 pipeline_layout_ci.pNext = NULL;
11606 pipeline_layout_ci.setLayoutCount = 1;
11607 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011608
11609 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011610 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011611 ASSERT_VK_SUCCESS(err);
11612
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011613 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011614 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 -060011615 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011616 VkPipelineObj pipe(m_device);
11617 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011618 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011619 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011620 pipe.SetMSAA(&pipe_ms_state_ci);
11621 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011622
Tony Barbour552f6c02016-12-21 14:34:07 -070011623 m_commandBuffer->BeginCommandBuffer();
11624 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011625 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011626
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011627 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11628 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11629 VkRect2D scissor = {{0, 0}, {16, 16}};
11630 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11631
Mark Young29927482016-05-04 14:38:51 -060011632 // Render triangle (the error should trigger on the attempt to draw).
11633 Draw(3, 1, 0, 0);
11634
11635 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011636 m_commandBuffer->EndRenderPass();
11637 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011638
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011639 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011640
Chia-I Wuf7458c52015-10-26 21:10:41 +080011641 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11642 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11643 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011644}
Mark Young29927482016-05-04 14:38:51 -060011645
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011646TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011647 TEST_DESCRIPTION(
11648 "Hit RenderPass incompatible cases. "
11649 "Initial case is drawing with an active renderpass that's "
11650 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011651 VkResult err;
11652
Tony Barbour1fa09702017-03-16 12:09:08 -060011653 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11655
11656 VkDescriptorSetLayoutBinding dsl_binding = {};
11657 dsl_binding.binding = 0;
11658 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11659 dsl_binding.descriptorCount = 1;
11660 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11661 dsl_binding.pImmutableSamplers = NULL;
11662
11663 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11664 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11665 ds_layout_ci.pNext = NULL;
11666 ds_layout_ci.bindingCount = 1;
11667 ds_layout_ci.pBindings = &dsl_binding;
11668
11669 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011670 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011671 ASSERT_VK_SUCCESS(err);
11672
11673 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11674 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11675 pipeline_layout_ci.pNext = NULL;
11676 pipeline_layout_ci.setLayoutCount = 1;
11677 pipeline_layout_ci.pSetLayouts = &ds_layout;
11678
11679 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011680 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011681 ASSERT_VK_SUCCESS(err);
11682
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011683 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011684 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 -060011685 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011686 // Create a renderpass that will be incompatible with default renderpass
11687 VkAttachmentReference attach = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011688 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011689 VkAttachmentReference color_att = {};
Cort Stratton7547f772017-05-04 15:18:52 -070011690 color_att.layout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011691 VkSubpassDescription subpass = {};
11692 subpass.inputAttachmentCount = 1;
11693 subpass.pInputAttachments = &attach;
11694 subpass.colorAttachmentCount = 1;
11695 subpass.pColorAttachments = &color_att;
11696 VkRenderPassCreateInfo rpci = {};
11697 rpci.subpassCount = 1;
11698 rpci.pSubpasses = &subpass;
11699 rpci.attachmentCount = 1;
11700 VkAttachmentDescription attach_desc = {};
11701 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011702 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11703 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011704 rpci.pAttachments = &attach_desc;
11705 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11706 VkRenderPass rp;
11707 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11708 VkPipelineObj pipe(m_device);
11709 pipe.AddShader(&vs);
11710 pipe.AddShader(&fs);
11711 pipe.AddColorAttachment();
11712 VkViewport view_port = {};
11713 m_viewports.push_back(view_port);
11714 pipe.SetViewport(m_viewports);
11715 VkRect2D rect = {};
11716 m_scissors.push_back(rect);
11717 pipe.SetScissor(m_scissors);
11718 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11719
11720 VkCommandBufferInheritanceInfo cbii = {};
11721 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11722 cbii.renderPass = rp;
11723 cbii.subpass = 0;
11724 VkCommandBufferBeginInfo cbbi = {};
11725 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11726 cbbi.pInheritanceInfo = &cbii;
11727 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11728 VkRenderPassBeginInfo rpbi = {};
11729 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11730 rpbi.framebuffer = m_framebuffer;
11731 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011732 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11733 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011734
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011736 // Render triangle (the error should trigger on the attempt to draw).
11737 Draw(3, 1, 0, 0);
11738
11739 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011740 m_commandBuffer->EndRenderPass();
11741 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011742
11743 m_errorMonitor->VerifyFound();
11744
11745 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11746 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11747 vkDestroyRenderPass(m_device->device(), rp, NULL);
11748}
11749
Mark Youngc89c6312016-03-31 16:03:20 -060011750TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11751 // Create Pipeline where the number of blend attachments doesn't match the
11752 // number of color attachments. In this case, we don't add any color
11753 // blend attachments even though we have a color attachment.
11754 VkResult err;
11755
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011757
Tony Barbour1fa09702017-03-16 12:09:08 -060011758 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11760 VkDescriptorPoolSize ds_type_count = {};
11761 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11762 ds_type_count.descriptorCount = 1;
11763
11764 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11765 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11766 ds_pool_ci.pNext = NULL;
11767 ds_pool_ci.maxSets = 1;
11768 ds_pool_ci.poolSizeCount = 1;
11769 ds_pool_ci.pPoolSizes = &ds_type_count;
11770
11771 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011772 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011773 ASSERT_VK_SUCCESS(err);
11774
11775 VkDescriptorSetLayoutBinding dsl_binding = {};
11776 dsl_binding.binding = 0;
11777 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11778 dsl_binding.descriptorCount = 1;
11779 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11780 dsl_binding.pImmutableSamplers = NULL;
11781
11782 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11783 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11784 ds_layout_ci.pNext = NULL;
11785 ds_layout_ci.bindingCount = 1;
11786 ds_layout_ci.pBindings = &dsl_binding;
11787
11788 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011789 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011790 ASSERT_VK_SUCCESS(err);
11791
11792 VkDescriptorSet descriptorSet;
11793 VkDescriptorSetAllocateInfo alloc_info = {};
11794 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11795 alloc_info.descriptorSetCount = 1;
11796 alloc_info.descriptorPool = ds_pool;
11797 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011798 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011799 ASSERT_VK_SUCCESS(err);
11800
11801 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011802 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011803 pipe_ms_state_ci.pNext = NULL;
11804 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11805 pipe_ms_state_ci.sampleShadingEnable = 0;
11806 pipe_ms_state_ci.minSampleShading = 1.0;
11807 pipe_ms_state_ci.pSampleMask = NULL;
11808
11809 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11810 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11811 pipeline_layout_ci.pNext = NULL;
11812 pipeline_layout_ci.setLayoutCount = 1;
11813 pipeline_layout_ci.pSetLayouts = &ds_layout;
11814
11815 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011816 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011817 ASSERT_VK_SUCCESS(err);
11818
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011819 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011820 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 -060011821 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011822 VkPipelineObj pipe(m_device);
11823 pipe.AddShader(&vs);
11824 pipe.AddShader(&fs);
11825 pipe.SetMSAA(&pipe_ms_state_ci);
11826 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011827 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011828
11829 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11830 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11831 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11832}
Mark Young29927482016-05-04 14:38:51 -060011833
Mark Muellerd4914412016-06-13 17:52:06 -060011834TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011835 TEST_DESCRIPTION(
11836 "Points to a wrong colorAttachment index in a VkClearAttachment "
11837 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011838 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011840
11841 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11842 m_errorMonitor->VerifyFound();
11843}
11844
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011845TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011846 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11847 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011848
Tony Barbour1fa09702017-03-16 12:09:08 -060011849 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011850 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011851
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011852 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011853 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11854 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011855
11856 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011857 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11858 ds_pool_ci.pNext = NULL;
11859 ds_pool_ci.maxSets = 1;
11860 ds_pool_ci.poolSizeCount = 1;
11861 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011862
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011863 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011864 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011865 ASSERT_VK_SUCCESS(err);
11866
Tony Barboureb254902015-07-15 12:50:33 -060011867 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011868 dsl_binding.binding = 0;
11869 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11870 dsl_binding.descriptorCount = 1;
11871 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11872 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011873
Tony Barboureb254902015-07-15 12:50:33 -060011874 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011875 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11876 ds_layout_ci.pNext = NULL;
11877 ds_layout_ci.bindingCount = 1;
11878 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011879
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011880 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011881 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011882 ASSERT_VK_SUCCESS(err);
11883
11884 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011885 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011886 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011887 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011888 alloc_info.descriptorPool = ds_pool;
11889 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011890 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011891 ASSERT_VK_SUCCESS(err);
11892
Tony Barboureb254902015-07-15 12:50:33 -060011893 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011894 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011895 pipe_ms_state_ci.pNext = NULL;
11896 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11897 pipe_ms_state_ci.sampleShadingEnable = 0;
11898 pipe_ms_state_ci.minSampleShading = 1.0;
11899 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011900
Tony Barboureb254902015-07-15 12:50:33 -060011901 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011902 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11903 pipeline_layout_ci.pNext = NULL;
11904 pipeline_layout_ci.setLayoutCount = 1;
11905 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011906
11907 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011908 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011909 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011910
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011911 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011912 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011913 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011914 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011915
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011916 VkPipelineObj pipe(m_device);
11917 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011918 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011919 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011920 pipe.SetMSAA(&pipe_ms_state_ci);
11921 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011922
Tony Barbour552f6c02016-12-21 14:34:07 -070011923 m_commandBuffer->BeginCommandBuffer();
11924 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011925
Karl Schultz6addd812016-02-02 17:17:23 -070011926 // Main thing we care about for this test is that the VkImage obj we're
11927 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011928 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011929 VkClearAttachment color_attachment;
11930 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11931 color_attachment.clearValue.color.float32[0] = 1.0;
11932 color_attachment.clearValue.color.float32[1] = 1.0;
11933 color_attachment.clearValue.color.float32[2] = 1.0;
11934 color_attachment.clearValue.color.float32[3] = 1.0;
11935 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011936 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011937
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011938 // Call for full-sized FB Color attachment prior to issuing a Draw
11939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011940 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011941 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011942 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011943
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011944 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11945 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11947 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11948 m_errorMonitor->VerifyFound();
11949
11950 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11951 clear_rect.layerCount = 2;
11952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11953 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011954 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011955
Chia-I Wuf7458c52015-10-26 21:10:41 +080011956 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11957 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11958 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011959}
11960
Karl Schultz6addd812016-02-02 17:17:23 -070011961TEST_F(VkLayerTest, VtxBufferBadIndex) {
11962 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011963
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11965 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011966
Tony Barbour1fa09702017-03-16 12:09:08 -060011967 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011968 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011970
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011971 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011972 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11973 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011974
11975 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011976 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11977 ds_pool_ci.pNext = NULL;
11978 ds_pool_ci.maxSets = 1;
11979 ds_pool_ci.poolSizeCount = 1;
11980 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011981
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011982 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011983 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011984 ASSERT_VK_SUCCESS(err);
11985
Tony Barboureb254902015-07-15 12:50:33 -060011986 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011987 dsl_binding.binding = 0;
11988 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11989 dsl_binding.descriptorCount = 1;
11990 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11991 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011992
Tony Barboureb254902015-07-15 12:50:33 -060011993 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011994 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11995 ds_layout_ci.pNext = NULL;
11996 ds_layout_ci.bindingCount = 1;
11997 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011998
Tobin Ehlis502480b2015-06-24 15:53:07 -060011999 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012000 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012001 ASSERT_VK_SUCCESS(err);
12002
12003 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080012004 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080012005 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070012006 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060012007 alloc_info.descriptorPool = ds_pool;
12008 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012009 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012010 ASSERT_VK_SUCCESS(err);
12011
Tony Barboureb254902015-07-15 12:50:33 -060012012 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012013 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070012014 pipe_ms_state_ci.pNext = NULL;
12015 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12016 pipe_ms_state_ci.sampleShadingEnable = 0;
12017 pipe_ms_state_ci.minSampleShading = 1.0;
12018 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012019
Tony Barboureb254902015-07-15 12:50:33 -060012020 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070012021 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12022 pipeline_layout_ci.pNext = NULL;
12023 pipeline_layout_ci.setLayoutCount = 1;
12024 pipeline_layout_ci.pSetLayouts = &ds_layout;
12025 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060012026
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012027 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012028 ASSERT_VK_SUCCESS(err);
12029
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012030 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012031 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 -060012032 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012033 VkPipelineObj pipe(m_device);
12034 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060012035 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060012036 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012037 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060012038 pipe.SetViewport(m_viewports);
12039 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060012040 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060012041
Tony Barbour552f6c02016-12-21 14:34:07 -070012042 m_commandBuffer->BeginCommandBuffer();
12043 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012044 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060012045 // Don't care about actual data, just need to get to draw to flag error
12046 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012047 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012048 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060012049 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012050
Chris Forbes8f36a8a2016-04-07 13:21:07 +120012051 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060012052
Chia-I Wuf7458c52015-10-26 21:10:41 +080012053 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12054 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12055 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060012056}
Mark Muellerdfe37552016-07-07 14:47:42 -060012057
Mark Mueller2ee294f2016-08-04 12:59:48 -060012058TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012059 TEST_DESCRIPTION(
12060 "Use an invalid count in a vkEnumeratePhysicalDevices call."
12061 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060012062 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012063
Mark Mueller880fce52016-08-17 15:23:23 -060012064 // The following test fails with recent NVidia drivers.
12065 // By the time core_validation is reached, the NVidia
12066 // driver has sanitized the invalid condition and core_validation
12067 // is not introduced to the failure condition. This is not the case
12068 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012069 // uint32_t count = static_cast<uint32_t>(~0);
12070 // VkPhysicalDevice physical_device;
12071 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
12072 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012073
Mark Mueller2ee294f2016-08-04 12:59:48 -060012074 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012075 VkDeviceQueueCreateInfo queue_create_info = {};
12076 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12077 queue_create_info.queueCount = 1;
12078 queue_create_info.pQueuePriorities = &queue_priority;
12079 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
12080
12081 VkPhysicalDeviceFeatures features = m_device->phy().features();
12082 VkDevice testDevice;
12083 VkDeviceCreateInfo device_create_info = {};
12084 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12085 device_create_info.queueCreateInfoCount = 1;
12086 device_create_info.pQueueCreateInfos = &queue_create_info;
12087 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012088
Petr Kraus56ed9192017-05-08 23:45:36 +020012089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00054);
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012090 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
12091 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12092 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012093 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12094 m_errorMonitor->VerifyFound();
12095
12096 queue_create_info.queueFamilyIndex = 1;
12097
12098 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
12099 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
12100 for (unsigned i = 0; i < feature_count; i++) {
12101 if (VK_FALSE == feature_array[i]) {
12102 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012103 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12105 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060012106 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
12107 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
12108 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070012109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12110 "You requested features that are unavailable on this device. You should first "
12111 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012112 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
12113 m_errorMonitor->VerifyFound();
12114 break;
12115 }
12116 }
12117}
12118
Tobin Ehlis16edf082016-11-21 12:33:49 -070012119TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
12120 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
12121
Tony Barbour1fa09702017-03-16 12:09:08 -060012122 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070012123
12124 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
12125 std::vector<VkDeviceQueueCreateInfo> queue_info;
12126 queue_info.reserve(queue_props.size());
12127 std::vector<std::vector<float>> queue_priorities;
12128 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
12129 VkDeviceQueueCreateInfo qi{};
12130 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
12131 qi.queueFamilyIndex = i;
12132 qi.queueCount = queue_props[i].queueCount;
12133 queue_priorities.emplace_back(qi.queueCount, 0.0f);
12134 qi.pQueuePriorities = queue_priorities[i].data();
12135 queue_info.push_back(qi);
12136 }
12137
12138 std::vector<const char *> device_extension_names;
12139
12140 VkDevice local_device;
12141 VkDeviceCreateInfo device_create_info = {};
12142 auto features = m_device->phy().features();
12143 // Intentionally disable pipeline stats
12144 features.pipelineStatisticsQuery = VK_FALSE;
12145 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12146 device_create_info.pNext = NULL;
12147 device_create_info.queueCreateInfoCount = queue_info.size();
12148 device_create_info.pQueueCreateInfos = queue_info.data();
12149 device_create_info.enabledLayerCount = 0;
12150 device_create_info.ppEnabledLayerNames = NULL;
12151 device_create_info.pEnabledFeatures = &features;
12152 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
12153 ASSERT_VK_SUCCESS(err);
12154
12155 VkQueryPoolCreateInfo qpci{};
12156 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12157 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
12158 qpci.queryCount = 1;
12159 VkQueryPool query_pool;
12160
12161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
12162 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
12163 m_errorMonitor->VerifyFound();
12164
12165 vkDestroyDevice(local_device, nullptr);
12166}
12167
Mark Mueller2ee294f2016-08-04 12:59:48 -060012168TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012169 TEST_DESCRIPTION(
12170 "Use an invalid queue index in a vkCmdWaitEvents call."
12171 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060012172
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012173 const char *invalid_queue_index =
12174 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
12175 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
12176 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012177
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012178 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060012179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012181
Tony Barbour1fa09702017-03-16 12:09:08 -060012182 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060012183
12184 VkEvent event;
12185 VkEventCreateInfo event_create_info{};
12186 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12187 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12188
Mark Mueller2ee294f2016-08-04 12:59:48 -060012189 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012190 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012191
Tony Barbour552f6c02016-12-21 14:34:07 -070012192 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060012193
12194 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012195 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012196 ASSERT_TRUE(image.initialized());
12197 VkImageMemoryBarrier img_barrier = {};
12198 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12199 img_barrier.pNext = NULL;
12200 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
12201 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
12202 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12203 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
12204 img_barrier.image = image.handle();
12205 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060012206
12207 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
12208 // that layer validation catches the case when it is not.
12209 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060012210 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12211 img_barrier.subresourceRange.baseArrayLayer = 0;
12212 img_barrier.subresourceRange.baseMipLevel = 0;
12213 img_barrier.subresourceRange.layerCount = 1;
12214 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012215 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
12216 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012217 m_errorMonitor->VerifyFound();
12218
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012220
12221 VkQueryPool query_pool;
12222 VkQueryPoolCreateInfo query_pool_create_info = {};
12223 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12224 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
12225 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012226 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012227
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012228 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060012229 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
12230
12231 vkEndCommandBuffer(m_commandBuffer->handle());
12232 m_errorMonitor->VerifyFound();
12233
12234 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
12235 vkDestroyEvent(m_device->device(), event, nullptr);
12236}
12237
Mark Muellerdfe37552016-07-07 14:47:42 -060012238TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012239 TEST_DESCRIPTION(
12240 "Submit a command buffer using deleted vertex buffer, "
12241 "delete a buffer twice, use an invalid offset for each "
12242 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060012243
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012244 const char *deleted_buffer_in_command_buffer =
12245 "Cannot submit cmd buffer "
12246 "using deleted buffer ";
12247 const char *invalid_offset_message =
12248 "vkBindBufferMemory(): "
12249 "memoryOffset is 0x";
12250 const char *invalid_storage_buffer_offset_message =
12251 "vkBindBufferMemory(): "
12252 "storage memoryOffset "
12253 "is 0x";
12254 const char *invalid_texel_buffer_offset_message =
12255 "vkBindBufferMemory(): "
12256 "texel memoryOffset "
12257 "is 0x";
12258 const char *invalid_uniform_buffer_offset_message =
12259 "vkBindBufferMemory(): "
12260 "uniform memoryOffset "
12261 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060012262
Tony Barbour1fa09702017-03-16 12:09:08 -060012263 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060012264 ASSERT_NO_FATAL_FAILURE(InitViewport());
12265 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12266
12267 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012268 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060012269 pipe_ms_state_ci.pNext = NULL;
12270 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
12271 pipe_ms_state_ci.sampleShadingEnable = 0;
12272 pipe_ms_state_ci.minSampleShading = 1.0;
12273 pipe_ms_state_ci.pSampleMask = nullptr;
12274
12275 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12276 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12277 VkPipelineLayout pipeline_layout;
12278
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012279 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060012280 ASSERT_VK_SUCCESS(err);
12281
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012282 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12283 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060012284 VkPipelineObj pipe(m_device);
12285 pipe.AddShader(&vs);
12286 pipe.AddShader(&fs);
12287 pipe.AddColorAttachment();
12288 pipe.SetMSAA(&pipe_ms_state_ci);
12289 pipe.SetViewport(m_viewports);
12290 pipe.SetScissor(m_scissors);
12291 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12292
Tony Barbour552f6c02016-12-21 14:34:07 -070012293 m_commandBuffer->BeginCommandBuffer();
12294 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012295 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060012296
12297 {
12298 // Create and bind a vertex buffer in a reduced scope, which will cause
12299 // it to be deleted upon leaving this scope
12300 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012301 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060012302 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
12303 draw_verticies.AddVertexInputToPipe(pipe);
12304 }
12305
12306 Draw(1, 0, 0, 0);
12307
Tony Barbour552f6c02016-12-21 14:34:07 -070012308 m_commandBuffer->EndRenderPass();
12309 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060012310
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060012312 QueueCommandBuffer(false);
12313 m_errorMonitor->VerifyFound();
12314
12315 {
12316 // Create and bind a vertex buffer in a reduced scope, and delete it
12317 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012318 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060012320 buffer_test.TestDoubleDestroy();
12321 }
12322 m_errorMonitor->VerifyFound();
12323
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012324 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012325 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012326 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012328 m_errorMonitor->SetUnexpectedError(
12329 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
12330 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012331 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
12332 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012333 m_errorMonitor->VerifyFound();
12334 }
12335
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012336 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
12337 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012338 // Create and bind a memory buffer with an invalid offset again,
12339 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012341 m_errorMonitor->SetUnexpectedError(
12342 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12343 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012344 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12345 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012346 m_errorMonitor->VerifyFound();
12347 }
12348
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012349 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012350 // Create and bind a memory buffer with an invalid offset again, but
12351 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012353 m_errorMonitor->SetUnexpectedError(
12354 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12355 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012356 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12357 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012358 m_errorMonitor->VerifyFound();
12359 }
12360
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012361 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060012362 // Create and bind a memory buffer with an invalid offset again, but
12363 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012365 m_errorMonitor->SetUnexpectedError(
12366 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
12367 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012368 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
12369 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012370 m_errorMonitor->VerifyFound();
12371 }
12372
12373 {
12374 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012376 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
12377 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012378 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
12379 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012380 m_errorMonitor->VerifyFound();
12381 }
12382
12383 {
12384 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070012385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012386 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
12387 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060012388 }
12389 m_errorMonitor->VerifyFound();
12390
12391 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12392}
12393
Tony Barbourff1351e2017-05-10 11:14:03 -060012394TEST_F(VkLayerTest, BadVertexBufferOffset) {
12395 TEST_DESCRIPTION("Submit an offset past the end of a vertex buffer");
12396
12397 ASSERT_NO_FATAL_FAILURE(Init());
12398 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12399 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Tony Barboure94224e2017-05-11 15:22:43 -060012400 VkConstantBufferObj vbo(m_device, 3, sizeof(float), (const void *)&vbo_data);
Tony Barbourff1351e2017-05-10 11:14:03 -060012401 m_commandBuffer->BeginCommandBuffer();
12402 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
12403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01417);
Tony Barboure94224e2017-05-11 15:22:43 -060012404 BindVertexBuffer(&vbo, (VkDeviceSize)(3 * sizeof(float)), 1); // Offset at the end of the buffer
Tony Barbourff1351e2017-05-10 11:14:03 -060012405 m_errorMonitor->VerifyFound();
12406}
12407
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012408// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
12409TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012410 TEST_DESCRIPTION(
12411 "Hit all possible validation checks associated with the "
12412 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
12413 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012414 // 3 in ValidateCmdBufImageLayouts
12415 // * -1 Attempt to submit cmd buf w/ deleted image
12416 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
12417 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012418
Tony Barbour1fa09702017-03-16 12:09:08 -060012419 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060012420 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070012421 if (!depth_format) {
12422 printf(" No Depth + Stencil format found. Skipped.\n");
12423 return;
12424 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012425 // Create src & dst images to use for copy operations
12426 VkImage src_image;
12427 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080012428 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012429
12430 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
12431 const int32_t tex_width = 32;
12432 const int32_t tex_height = 32;
12433
12434 VkImageCreateInfo image_create_info = {};
12435 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
12436 image_create_info.pNext = NULL;
12437 image_create_info.imageType = VK_IMAGE_TYPE_2D;
12438 image_create_info.format = tex_format;
12439 image_create_info.extent.width = tex_width;
12440 image_create_info.extent.height = tex_height;
12441 image_create_info.extent.depth = 1;
12442 image_create_info.mipLevels = 1;
12443 image_create_info.arrayLayers = 4;
12444 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
12445 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
12446 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080012447 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012448 image_create_info.flags = 0;
12449
12450 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
12451 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012452 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012453 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
12454 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080012455 image_create_info.format = VK_FORMAT_D32_SFLOAT;
12456 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
12457 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
12458 ASSERT_VK_SUCCESS(err);
12459
12460 // Allocate memory
12461 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080012462 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080012463 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080012464 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12465 mem_alloc.pNext = NULL;
12466 mem_alloc.allocationSize = 0;
12467 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080012468
12469 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012470 mem_alloc.allocationSize = img_mem_reqs.size;
12471 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012472 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080012473 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080012474 ASSERT_VK_SUCCESS(err);
12475
12476 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012477 mem_alloc.allocationSize = img_mem_reqs.size;
12478 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012479 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012480 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012481 ASSERT_VK_SUCCESS(err);
12482
12483 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012484 mem_alloc.allocationSize = img_mem_reqs.size;
12485 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012486 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012487 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012488 ASSERT_VK_SUCCESS(err);
12489
12490 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12491 ASSERT_VK_SUCCESS(err);
12492 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12493 ASSERT_VK_SUCCESS(err);
12494 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12495 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012496
Tony Barbour552f6c02016-12-21 14:34:07 -070012497 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012498 VkImageCopy copy_region;
12499 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12500 copy_region.srcSubresource.mipLevel = 0;
12501 copy_region.srcSubresource.baseArrayLayer = 0;
12502 copy_region.srcSubresource.layerCount = 1;
12503 copy_region.srcOffset.x = 0;
12504 copy_region.srcOffset.y = 0;
12505 copy_region.srcOffset.z = 0;
12506 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12507 copy_region.dstSubresource.mipLevel = 0;
12508 copy_region.dstSubresource.baseArrayLayer = 0;
12509 copy_region.dstSubresource.layerCount = 1;
12510 copy_region.dstOffset.x = 0;
12511 copy_region.dstOffset.y = 0;
12512 copy_region.dstOffset.z = 0;
12513 copy_region.extent.width = 1;
12514 copy_region.extent.height = 1;
12515 copy_region.extent.depth = 1;
12516
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12518 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12519 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012520
Cort530cf382016-12-08 09:59:47 -080012521 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 -060012522 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012523 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12524 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012525 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12526 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012527 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 -060012528 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012530 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12531 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Mark Lobodzinskic61e1da2017-05-15 16:18:13 -060012532 m_errorMonitor->SetUnexpectedError("is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT");
Cort530cf382016-12-08 09:59:47 -080012533 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 -060012534 m_errorMonitor->VerifyFound();
12535 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012537 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012538 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012539 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012540 "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 -080012541 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 -060012542 m_errorMonitor->VerifyFound();
12543 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12545 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12546 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012547 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 -060012548 m_errorMonitor->VerifyFound();
12549 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012551 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012552 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012553 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012554 "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 -080012555 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 -060012556 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012558 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12559 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012560 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012561 "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 -080012562 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 -060012563 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012564
Cort3b021012016-12-07 12:00:57 -080012565 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12566 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12567 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12568 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12569 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12570 transfer_dst_image_barrier[0].srcAccessMask = 0;
12571 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12572 transfer_dst_image_barrier[0].image = dst_image;
12573 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12574 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12575 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12576 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12577 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12578 transfer_dst_image_barrier[0].image = depth_image;
12579 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12580 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12581 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12582
12583 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012584 VkClearColorValue color_clear_value = {};
12585 VkImageSubresourceRange clear_range;
12586 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12587 clear_range.baseMipLevel = 0;
12588 clear_range.baseArrayLayer = 0;
12589 clear_range.layerCount = 1;
12590 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012591
Cort3b021012016-12-07 12:00:57 -080012592 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12593 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012596 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012597 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012598 // Fail due to provided layout not matching actual current layout for color clear.
12599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012600 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012601 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012602
Cort530cf382016-12-08 09:59:47 -080012603 VkClearDepthStencilValue depth_clear_value = {};
12604 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012605
12606 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12607 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012610 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012611 m_errorMonitor->VerifyFound();
12612 // Fail due to provided layout not matching actual current layout for depth clear.
12613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012614 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012615 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012616
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012617 // Now cause error due to bad image layout transition in PipelineBarrier
12618 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012619 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012620 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012621 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012622 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012623 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12624 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012625 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012627 "you cannot transition the layout of aspect 1 from "
12628 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12629 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012631 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12632 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012633 m_errorMonitor->VerifyFound();
12634
12635 // Finally some layout errors at RenderPass create time
12636 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12637 VkAttachmentReference attach = {};
12638 // perf warning for GENERAL layout w/ non-DS input attachment
12639 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12640 VkSubpassDescription subpass = {};
12641 subpass.inputAttachmentCount = 1;
12642 subpass.pInputAttachments = &attach;
12643 VkRenderPassCreateInfo rpci = {};
12644 rpci.subpassCount = 1;
12645 rpci.pSubpasses = &subpass;
12646 rpci.attachmentCount = 1;
12647 VkAttachmentDescription attach_desc = {};
12648 attach_desc.format = VK_FORMAT_UNDEFINED;
12649 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012650 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012651 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12653 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012654 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12655 m_errorMonitor->VerifyFound();
12656 // error w/ non-general layout
12657 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12658
12659 m_errorMonitor->SetDesiredFailureMsg(
12660 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12661 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12662 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12663 m_errorMonitor->VerifyFound();
12664 subpass.inputAttachmentCount = 0;
12665 subpass.colorAttachmentCount = 1;
12666 subpass.pColorAttachments = &attach;
12667 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12668 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12670 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012671 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12672 m_errorMonitor->VerifyFound();
12673 // error w/ non-color opt or GENERAL layout for color attachment
12674 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12675 m_errorMonitor->SetDesiredFailureMsg(
12676 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12677 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12678 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12679 m_errorMonitor->VerifyFound();
12680 subpass.colorAttachmentCount = 0;
12681 subpass.pDepthStencilAttachment = &attach;
12682 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12683 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12685 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012686 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12687 m_errorMonitor->VerifyFound();
12688 // error w/ non-ds opt or GENERAL layout for color attachment
12689 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12691 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12692 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012693 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12694 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012695 // For this error we need a valid renderpass so create default one
12696 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12697 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012698 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012699 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12700 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12701 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12702 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12703 // Can't do a CLEAR load on READ_ONLY initialLayout
12704 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12705 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12706 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012708 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012709 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12710 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012711
Cort3b021012016-12-07 12:00:57 -080012712 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12713 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12714 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012715 vkDestroyImage(m_device->device(), src_image, NULL);
12716 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012717 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012718}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012719
Tobin Ehlise0936662016-10-11 08:10:51 -060012720TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12721 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12722 VkResult err;
12723
Tony Barbour1fa09702017-03-16 12:09:08 -060012724 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012725
12726 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12727 VkImageTiling tiling;
12728 VkFormatProperties format_properties;
12729 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12730 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12731 tiling = VK_IMAGE_TILING_LINEAR;
12732 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12733 tiling = VK_IMAGE_TILING_OPTIMAL;
12734 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012735 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012736 return;
12737 }
12738
12739 VkDescriptorPoolSize ds_type = {};
12740 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12741 ds_type.descriptorCount = 1;
12742
12743 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12744 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12745 ds_pool_ci.maxSets = 1;
12746 ds_pool_ci.poolSizeCount = 1;
12747 ds_pool_ci.pPoolSizes = &ds_type;
12748 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12749
12750 VkDescriptorPool ds_pool;
12751 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12752 ASSERT_VK_SUCCESS(err);
12753
12754 VkDescriptorSetLayoutBinding dsl_binding = {};
12755 dsl_binding.binding = 0;
12756 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12757 dsl_binding.descriptorCount = 1;
12758 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12759 dsl_binding.pImmutableSamplers = NULL;
12760
12761 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12762 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12763 ds_layout_ci.pNext = NULL;
12764 ds_layout_ci.bindingCount = 1;
12765 ds_layout_ci.pBindings = &dsl_binding;
12766
12767 VkDescriptorSetLayout ds_layout;
12768 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12769 ASSERT_VK_SUCCESS(err);
12770
12771 VkDescriptorSetAllocateInfo alloc_info = {};
12772 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12773 alloc_info.descriptorSetCount = 1;
12774 alloc_info.descriptorPool = ds_pool;
12775 alloc_info.pSetLayouts = &ds_layout;
12776 VkDescriptorSet descriptor_set;
12777 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12778 ASSERT_VK_SUCCESS(err);
12779
12780 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12781 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12782 pipeline_layout_ci.pNext = NULL;
12783 pipeline_layout_ci.setLayoutCount = 1;
12784 pipeline_layout_ci.pSetLayouts = &ds_layout;
12785 VkPipelineLayout pipeline_layout;
12786 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12787 ASSERT_VK_SUCCESS(err);
12788
12789 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012790 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012791 ASSERT_TRUE(image.initialized());
12792 VkImageView view = image.targetView(tex_format);
12793
12794 VkDescriptorImageInfo image_info = {};
12795 image_info.imageView = view;
12796 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12797
12798 VkWriteDescriptorSet descriptor_write = {};
12799 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12800 descriptor_write.dstSet = descriptor_set;
12801 descriptor_write.dstBinding = 0;
12802 descriptor_write.descriptorCount = 1;
12803 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12804 descriptor_write.pImageInfo = &image_info;
12805
12806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12807 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12808 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12809 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12810 m_errorMonitor->VerifyFound();
12811
12812 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12813 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12814 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12815 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12816}
12817
Mark Mueller93b938f2016-08-18 10:27:40 -060012818TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012819 TEST_DESCRIPTION(
12820 "Use vkCmdExecuteCommands with invalid state "
12821 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012822
Tony Barbour1fa09702017-03-16 12:09:08 -060012823 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12825
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012826 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012827 const char *simultaneous_use_message2 =
12828 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12829 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012830
12831 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012832 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012833 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012834 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12835 command_buffer_allocate_info.commandBufferCount = 1;
12836
12837 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012838 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012839 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12840 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012841 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012842 command_buffer_inheritance_info.renderPass = m_renderPass;
12843 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012844
Mark Mueller93b938f2016-08-18 10:27:40 -060012845 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012846 command_buffer_begin_info.flags =
12847 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012848 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12849
12850 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12851 vkEndCommandBuffer(secondary_command_buffer);
12852
Mark Mueller93b938f2016-08-18 10:27:40 -060012853 VkSubmitInfo submit_info = {};
12854 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12855 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012856 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012857
Mark Mueller4042b652016-09-05 22:52:21 -060012858 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012859 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12861 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012862 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012863 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012864 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12865 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012866
Dave Houltonfbf52152017-01-06 12:55:29 -070012867 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012868 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012869 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012870
Mark Mueller4042b652016-09-05 22:52:21 -060012871 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012872 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012873 m_errorMonitor->SetUnexpectedError(
12874 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12875 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012876 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012877 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012878
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12880 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012881 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012882 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12883 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012884
12885 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012886
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012887 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012888}
12889
Tony Barbour626994c2017-02-08 15:29:37 -070012890TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12891 TEST_DESCRIPTION(
12892 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12893 "errors");
12894 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12895 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 -060012896 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012897
12898 VkCommandBuffer cmd_bufs[2];
12899 VkCommandBufferAllocateInfo alloc_info;
12900 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12901 alloc_info.pNext = NULL;
12902 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012903 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012904 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12905 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12906
12907 VkCommandBufferBeginInfo cb_binfo;
12908 cb_binfo.pNext = NULL;
12909 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12910 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12911 cb_binfo.flags = 0;
12912 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12913 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12914 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12915 vkEndCommandBuffer(cmd_bufs[0]);
12916 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12917
12918 VkSubmitInfo submit_info = {};
12919 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12920 submit_info.commandBufferCount = 2;
12921 submit_info.pCommandBuffers = duplicates;
12922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12923 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12924 m_errorMonitor->VerifyFound();
12925 vkQueueWaitIdle(m_device->m_queue);
12926
12927 // Set one time use and now look for one time submit
12928 duplicates[0] = duplicates[1] = cmd_bufs[1];
12929 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12930 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12931 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12932 vkEndCommandBuffer(cmd_bufs[1]);
12933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12934 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12935 m_errorMonitor->VerifyFound();
12936 vkQueueWaitIdle(m_device->m_queue);
12937}
12938
Tobin Ehlisb093da82017-01-19 12:05:27 -070012939TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012940 TEST_DESCRIPTION(
12941 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12942 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012943
Tony Barbour1fa09702017-03-16 12:09:08 -060012944 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12946
12947 std::vector<const char *> device_extension_names;
12948 auto features = m_device->phy().features();
12949 // Make sure gs & ts are disabled
12950 features.geometryShader = false;
12951 features.tessellationShader = false;
12952 // The sacrificial device object
12953 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12954
12955 VkCommandPoolCreateInfo pool_create_info{};
12956 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12957 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12958
12959 VkCommandPool command_pool;
12960 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12961
12962 VkCommandBufferAllocateInfo cmd = {};
12963 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12964 cmd.pNext = NULL;
12965 cmd.commandPool = command_pool;
12966 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12967 cmd.commandBufferCount = 1;
12968
12969 VkCommandBuffer cmd_buffer;
12970 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12971 ASSERT_VK_SUCCESS(err);
12972
12973 VkEvent event;
12974 VkEventCreateInfo evci = {};
12975 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12976 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12977 ASSERT_VK_SUCCESS(result);
12978
12979 VkCommandBufferBeginInfo cbbi = {};
12980 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12981 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12983 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12984 m_errorMonitor->VerifyFound();
12985
12986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12987 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12988 m_errorMonitor->VerifyFound();
12989
12990 vkDestroyEvent(test_device.handle(), event, NULL);
12991 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12992}
12993
Chris Forbesd70103a2017-04-13 11:34:09 -070012994TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012995 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012996 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12997
Tony Barbour552f6c02016-12-21 14:34:07 -070012998 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012999
13000 VkEvent event;
13001 VkEventCreateInfo event_create_info = {};
13002 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13003 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013004 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013005
Tony Barbour552f6c02016-12-21 14:34:07 -070013006 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013007 vkDestroyEvent(m_device->device(), event, nullptr);
13008
13009 VkSubmitInfo submit_info = {};
13010 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13011 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013012 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070013013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013014 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13015 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070013016}
Mark Muellerc8d441e2016-08-23 17:36:00 -060013017
Chris Forbesd70103a2017-04-13 11:34:09 -070013018TEST_F(VkLayerTest, InUseDestroyedSignaled) {
13019 TEST_DESCRIPTION(
13020 "Use vkCmdExecuteCommands with invalid state "
13021 "in primary and secondary command buffers. "
13022 "Delete objects that are inuse. Call VkQueueSubmit "
13023 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060013024
Chris Forbesd70103a2017-04-13 11:34:09 -070013025 ASSERT_NO_FATAL_FAILURE(Init());
13026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13027
13028 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060013029
Mark Mueller917f6bc2016-08-30 10:57:19 -060013030 VkSemaphoreCreateInfo semaphore_create_info = {};
13031 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13032 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013033 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013034 VkFenceCreateInfo fence_create_info = {};
13035 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13036 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013037 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013038
13039 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013040 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013041 descriptor_pool_type_count.descriptorCount = 1;
13042
13043 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13044 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13045 descriptor_pool_create_info.maxSets = 1;
13046 descriptor_pool_create_info.poolSizeCount = 1;
13047 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013048 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013049
13050 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013051 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013052
13053 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060013054 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013055 descriptorset_layout_binding.descriptorCount = 1;
13056 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
13057
13058 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013059 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013060 descriptorset_layout_create_info.bindingCount = 1;
13061 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13062
13063 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013064 ASSERT_VK_SUCCESS(
13065 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013066
13067 VkDescriptorSet descriptorset;
13068 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013069 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013070 descriptorset_allocate_info.descriptorSetCount = 1;
13071 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13072 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013073 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013074
Mark Mueller4042b652016-09-05 22:52:21 -060013075 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13076
13077 VkDescriptorBufferInfo buffer_info = {};
13078 buffer_info.buffer = buffer_test.GetBuffer();
13079 buffer_info.offset = 0;
13080 buffer_info.range = 1024;
13081
13082 VkWriteDescriptorSet write_descriptor_set = {};
13083 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13084 write_descriptor_set.dstSet = descriptorset;
13085 write_descriptor_set.descriptorCount = 1;
13086 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13087 write_descriptor_set.pBufferInfo = &buffer_info;
13088
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013089 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060013090
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013091 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13092 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013093
13094 VkPipelineObj pipe(m_device);
13095 pipe.AddColorAttachment();
13096 pipe.AddShader(&vs);
13097 pipe.AddShader(&fs);
13098
13099 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013100 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060013101 pipeline_layout_create_info.setLayoutCount = 1;
13102 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13103
13104 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013105 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060013106
13107 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
13108
Chris Forbesd70103a2017-04-13 11:34:09 -070013109 VkEvent event;
13110 VkEventCreateInfo event_create_info = {};
13111 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13112 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
13113
Tony Barbour552f6c02016-12-21 14:34:07 -070013114 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070013115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013116 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060013117
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013118 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13119 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13120 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013121
Tony Barbour552f6c02016-12-21 14:34:07 -070013122 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013123
Chris Forbesd70103a2017-04-13 11:34:09 -070013124 VkSubmitInfo submit_info = {};
13125 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13126 submit_info.commandBufferCount = 1;
13127 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060013128 submit_info.signalSemaphoreCount = 1;
13129 submit_info.pSignalSemaphores = &semaphore;
13130 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013131 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060013132
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013134 vkDestroyEvent(m_device->device(), event, nullptr);
13135 m_errorMonitor->VerifyFound();
13136
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013138 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13139 m_errorMonitor->VerifyFound();
13140
Jeremy Hayes08369882017-02-02 10:31:06 -070013141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013142 vkDestroyFence(m_device->device(), fence, nullptr);
13143 m_errorMonitor->VerifyFound();
13144
Tobin Ehlis122207b2016-09-01 08:50:06 -070013145 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013146 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
13147 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013148 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013149 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
13150 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013151 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013152 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
13153 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060013154 vkDestroyEvent(m_device->device(), event, nullptr);
13155 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013156 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060013157 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13158}
13159
Tobin Ehlis2adda372016-09-01 08:51:06 -070013160TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
13161 TEST_DESCRIPTION("Delete in-use query pool.");
13162
Tony Barbour1fa09702017-03-16 12:09:08 -060013163 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070013164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13165
13166 VkQueryPool query_pool;
13167 VkQueryPoolCreateInfo query_pool_ci{};
13168 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
13169 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
13170 query_pool_ci.queryCount = 1;
13171 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070013172 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013173 // Reset query pool to create binding with cmd buffer
13174 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
13175
Tony Barbour552f6c02016-12-21 14:34:07 -070013176 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070013177
13178 VkSubmitInfo submit_info = {};
13179 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13180 submit_info.commandBufferCount = 1;
13181 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13182 // Submit cmd buffer and then destroy query pool while in-flight
13183 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13184
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070013186 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13187 m_errorMonitor->VerifyFound();
13188
13189 vkQueueWaitIdle(m_device->m_queue);
13190 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013191 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013192 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070013193 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
13194}
13195
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013196TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
13197 TEST_DESCRIPTION("Delete in-use pipeline.");
13198
Tony Barbour1fa09702017-03-16 12:09:08 -060013199 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13201
13202 // Empty pipeline layout used for binding PSO
13203 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13204 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13205 pipeline_layout_ci.setLayoutCount = 0;
13206 pipeline_layout_ci.pSetLayouts = NULL;
13207
13208 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013209 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013210 ASSERT_VK_SUCCESS(err);
13211
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013213 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013214 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13215 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013216 // Store pipeline handle so we can actually delete it before test finishes
13217 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013218 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013219 VkPipelineObj pipe(m_device);
13220 pipe.AddShader(&vs);
13221 pipe.AddShader(&fs);
13222 pipe.AddColorAttachment();
13223 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13224 delete_this_pipeline = pipe.handle();
13225
Tony Barbour552f6c02016-12-21 14:34:07 -070013226 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013227 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013228 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013229
Tony Barbour552f6c02016-12-21 14:34:07 -070013230 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013231
13232 VkSubmitInfo submit_info = {};
13233 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13234 submit_info.commandBufferCount = 1;
13235 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13236 // Submit cmd buffer and then pipeline destroyed while in-flight
13237 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013238 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013239 m_errorMonitor->VerifyFound();
13240 // Make sure queue finished and then actually delete pipeline
13241 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013242 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
13243 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060013244 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
13245 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
13246}
13247
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013248TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
13249 TEST_DESCRIPTION("Delete in-use imageView.");
13250
Tony Barbour1fa09702017-03-16 12:09:08 -060013251 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13253
13254 VkDescriptorPoolSize ds_type_count;
13255 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13256 ds_type_count.descriptorCount = 1;
13257
13258 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13259 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13260 ds_pool_ci.maxSets = 1;
13261 ds_pool_ci.poolSizeCount = 1;
13262 ds_pool_ci.pPoolSizes = &ds_type_count;
13263
13264 VkDescriptorPool ds_pool;
13265 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13266 ASSERT_VK_SUCCESS(err);
13267
13268 VkSamplerCreateInfo sampler_ci = {};
13269 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13270 sampler_ci.pNext = NULL;
13271 sampler_ci.magFilter = VK_FILTER_NEAREST;
13272 sampler_ci.minFilter = VK_FILTER_NEAREST;
13273 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13274 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13275 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13276 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13277 sampler_ci.mipLodBias = 1.0;
13278 sampler_ci.anisotropyEnable = VK_FALSE;
13279 sampler_ci.maxAnisotropy = 1;
13280 sampler_ci.compareEnable = VK_FALSE;
13281 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13282 sampler_ci.minLod = 1.0;
13283 sampler_ci.maxLod = 1.0;
13284 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13285 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13286 VkSampler sampler;
13287
13288 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13289 ASSERT_VK_SUCCESS(err);
13290
13291 VkDescriptorSetLayoutBinding layout_binding;
13292 layout_binding.binding = 0;
13293 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13294 layout_binding.descriptorCount = 1;
13295 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13296 layout_binding.pImmutableSamplers = NULL;
13297
13298 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13299 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13300 ds_layout_ci.bindingCount = 1;
13301 ds_layout_ci.pBindings = &layout_binding;
13302 VkDescriptorSetLayout ds_layout;
13303 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13304 ASSERT_VK_SUCCESS(err);
13305
13306 VkDescriptorSetAllocateInfo alloc_info = {};
13307 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13308 alloc_info.descriptorSetCount = 1;
13309 alloc_info.descriptorPool = ds_pool;
13310 alloc_info.pSetLayouts = &ds_layout;
13311 VkDescriptorSet descriptor_set;
13312 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13313 ASSERT_VK_SUCCESS(err);
13314
13315 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13316 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13317 pipeline_layout_ci.pNext = NULL;
13318 pipeline_layout_ci.setLayoutCount = 1;
13319 pipeline_layout_ci.pSetLayouts = &ds_layout;
13320
13321 VkPipelineLayout pipeline_layout;
13322 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13323 ASSERT_VK_SUCCESS(err);
13324
13325 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013326 image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013327 ASSERT_TRUE(image.initialized());
13328
13329 VkImageView view;
13330 VkImageViewCreateInfo ivci = {};
13331 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13332 ivci.image = image.handle();
13333 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13334 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13335 ivci.subresourceRange.layerCount = 1;
13336 ivci.subresourceRange.baseMipLevel = 0;
13337 ivci.subresourceRange.levelCount = 1;
13338 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13339
13340 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13341 ASSERT_VK_SUCCESS(err);
13342
13343 VkDescriptorImageInfo image_info{};
13344 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13345 image_info.imageView = view;
13346 image_info.sampler = sampler;
13347
13348 VkWriteDescriptorSet descriptor_write = {};
13349 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13350 descriptor_write.dstSet = descriptor_set;
13351 descriptor_write.dstBinding = 0;
13352 descriptor_write.descriptorCount = 1;
13353 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13354 descriptor_write.pImageInfo = &image_info;
13355
13356 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13357
13358 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013359 char const *vsSource =
13360 "#version 450\n"
13361 "\n"
13362 "out gl_PerVertex { \n"
13363 " vec4 gl_Position;\n"
13364 "};\n"
13365 "void main(){\n"
13366 " gl_Position = vec4(1);\n"
13367 "}\n";
13368 char const *fsSource =
13369 "#version 450\n"
13370 "\n"
13371 "layout(set=0, binding=0) uniform sampler2D s;\n"
13372 "layout(location=0) out vec4 x;\n"
13373 "void main(){\n"
13374 " x = texture(s, vec2(1));\n"
13375 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013376 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13377 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13378 VkPipelineObj pipe(m_device);
13379 pipe.AddShader(&vs);
13380 pipe.AddShader(&fs);
13381 pipe.AddColorAttachment();
13382 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13383
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013385
Tony Barbour552f6c02016-12-21 14:34:07 -070013386 m_commandBuffer->BeginCommandBuffer();
13387 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013388 // Bind pipeline to cmd buffer
13389 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13390 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13391 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070013392
13393 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13394 VkRect2D scissor = {{0, 0}, {16, 16}};
13395 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13396 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13397
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013398 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013399 m_commandBuffer->EndRenderPass();
13400 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013401 // Submit cmd buffer then destroy sampler
13402 VkSubmitInfo submit_info = {};
13403 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13404 submit_info.commandBufferCount = 1;
13405 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13406 // Submit cmd buffer and then destroy imageView while in-flight
13407 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13408
13409 vkDestroyImageView(m_device->device(), view, nullptr);
13410 m_errorMonitor->VerifyFound();
13411 vkQueueWaitIdle(m_device->m_queue);
13412 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013413 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013414 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060013415 vkDestroyImageView(m_device->device(), view, NULL);
13416 vkDestroySampler(m_device->device(), sampler, nullptr);
13417 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13420}
13421
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013422TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
13423 TEST_DESCRIPTION("Delete in-use bufferView.");
13424
Tony Barbour1fa09702017-03-16 12:09:08 -060013425 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013426 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13427
13428 VkDescriptorPoolSize ds_type_count;
13429 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13430 ds_type_count.descriptorCount = 1;
13431
13432 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13433 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13434 ds_pool_ci.maxSets = 1;
13435 ds_pool_ci.poolSizeCount = 1;
13436 ds_pool_ci.pPoolSizes = &ds_type_count;
13437
13438 VkDescriptorPool ds_pool;
13439 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
13440 ASSERT_VK_SUCCESS(err);
13441
13442 VkDescriptorSetLayoutBinding layout_binding;
13443 layout_binding.binding = 0;
13444 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13445 layout_binding.descriptorCount = 1;
13446 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13447 layout_binding.pImmutableSamplers = NULL;
13448
13449 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13450 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13451 ds_layout_ci.bindingCount = 1;
13452 ds_layout_ci.pBindings = &layout_binding;
13453 VkDescriptorSetLayout ds_layout;
13454 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
13455 ASSERT_VK_SUCCESS(err);
13456
13457 VkDescriptorSetAllocateInfo alloc_info = {};
13458 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13459 alloc_info.descriptorSetCount = 1;
13460 alloc_info.descriptorPool = ds_pool;
13461 alloc_info.pSetLayouts = &ds_layout;
13462 VkDescriptorSet descriptor_set;
13463 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
13464 ASSERT_VK_SUCCESS(err);
13465
13466 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13467 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13468 pipeline_layout_ci.pNext = NULL;
13469 pipeline_layout_ci.setLayoutCount = 1;
13470 pipeline_layout_ci.pSetLayouts = &ds_layout;
13471
13472 VkPipelineLayout pipeline_layout;
13473 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13474 ASSERT_VK_SUCCESS(err);
13475
13476 VkBuffer buffer;
13477 uint32_t queue_family_index = 0;
13478 VkBufferCreateInfo buffer_create_info = {};
13479 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13480 buffer_create_info.size = 1024;
13481 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13482 buffer_create_info.queueFamilyIndexCount = 1;
13483 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13484
13485 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13486 ASSERT_VK_SUCCESS(err);
13487
13488 VkMemoryRequirements memory_reqs;
13489 VkDeviceMemory buffer_memory;
13490
13491 VkMemoryAllocateInfo memory_info = {};
13492 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13493 memory_info.allocationSize = 0;
13494 memory_info.memoryTypeIndex = 0;
13495
13496 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13497 memory_info.allocationSize = memory_reqs.size;
13498 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13499 ASSERT_TRUE(pass);
13500
13501 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13502 ASSERT_VK_SUCCESS(err);
13503 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13504 ASSERT_VK_SUCCESS(err);
13505
13506 VkBufferView view;
13507 VkBufferViewCreateInfo bvci = {};
13508 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13509 bvci.buffer = buffer;
13510 bvci.format = VK_FORMAT_R8_UNORM;
13511 bvci.range = VK_WHOLE_SIZE;
13512
13513 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13514 ASSERT_VK_SUCCESS(err);
13515
13516 VkWriteDescriptorSet descriptor_write = {};
13517 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13518 descriptor_write.dstSet = descriptor_set;
13519 descriptor_write.dstBinding = 0;
13520 descriptor_write.descriptorCount = 1;
13521 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13522 descriptor_write.pTexelBufferView = &view;
13523
13524 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13525
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013526 char const *vsSource =
13527 "#version 450\n"
13528 "\n"
13529 "out gl_PerVertex { \n"
13530 " vec4 gl_Position;\n"
13531 "};\n"
13532 "void main(){\n"
13533 " gl_Position = vec4(1);\n"
13534 "}\n";
13535 char const *fsSource =
13536 "#version 450\n"
13537 "\n"
13538 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13539 "layout(location=0) out vec4 x;\n"
13540 "void main(){\n"
13541 " x = imageLoad(s, 0);\n"
13542 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013543 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13544 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13545 VkPipelineObj pipe(m_device);
13546 pipe.AddShader(&vs);
13547 pipe.AddShader(&fs);
13548 pipe.AddColorAttachment();
13549 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13550
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013552
Tony Barbour552f6c02016-12-21 14:34:07 -070013553 m_commandBuffer->BeginCommandBuffer();
13554 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013555 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13556 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13557 VkRect2D scissor = {{0, 0}, {16, 16}};
13558 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13559 // Bind pipeline to cmd buffer
13560 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13561 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13562 &descriptor_set, 0, nullptr);
13563 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013564 m_commandBuffer->EndRenderPass();
13565 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013566
13567 VkSubmitInfo submit_info = {};
13568 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13569 submit_info.commandBufferCount = 1;
13570 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13571 // Submit cmd buffer and then destroy bufferView while in-flight
13572 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13573
13574 vkDestroyBufferView(m_device->device(), view, nullptr);
13575 m_errorMonitor->VerifyFound();
13576 vkQueueWaitIdle(m_device->m_queue);
13577 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013578 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013579 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013580 vkDestroyBufferView(m_device->device(), view, NULL);
13581 vkDestroyBuffer(m_device->device(), buffer, NULL);
13582 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13583 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13584 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13585 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13586}
13587
Tobin Ehlis209532e2016-09-07 13:52:18 -060013588TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13589 TEST_DESCRIPTION("Delete in-use sampler.");
13590
Tony Barbour1fa09702017-03-16 12:09:08 -060013591 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13593
13594 VkDescriptorPoolSize ds_type_count;
13595 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13596 ds_type_count.descriptorCount = 1;
13597
13598 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13599 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13600 ds_pool_ci.maxSets = 1;
13601 ds_pool_ci.poolSizeCount = 1;
13602 ds_pool_ci.pPoolSizes = &ds_type_count;
13603
13604 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013605 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013606 ASSERT_VK_SUCCESS(err);
13607
13608 VkSamplerCreateInfo sampler_ci = {};
13609 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13610 sampler_ci.pNext = NULL;
13611 sampler_ci.magFilter = VK_FILTER_NEAREST;
13612 sampler_ci.minFilter = VK_FILTER_NEAREST;
13613 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13614 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13615 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13616 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13617 sampler_ci.mipLodBias = 1.0;
13618 sampler_ci.anisotropyEnable = VK_FALSE;
13619 sampler_ci.maxAnisotropy = 1;
13620 sampler_ci.compareEnable = VK_FALSE;
13621 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13622 sampler_ci.minLod = 1.0;
13623 sampler_ci.maxLod = 1.0;
13624 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13625 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13626 VkSampler sampler;
13627
13628 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13629 ASSERT_VK_SUCCESS(err);
13630
13631 VkDescriptorSetLayoutBinding layout_binding;
13632 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013633 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013634 layout_binding.descriptorCount = 1;
13635 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13636 layout_binding.pImmutableSamplers = NULL;
13637
13638 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13639 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13640 ds_layout_ci.bindingCount = 1;
13641 ds_layout_ci.pBindings = &layout_binding;
13642 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013643 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013644 ASSERT_VK_SUCCESS(err);
13645
13646 VkDescriptorSetAllocateInfo alloc_info = {};
13647 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13648 alloc_info.descriptorSetCount = 1;
13649 alloc_info.descriptorPool = ds_pool;
13650 alloc_info.pSetLayouts = &ds_layout;
13651 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013652 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013653 ASSERT_VK_SUCCESS(err);
13654
13655 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13656 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13657 pipeline_layout_ci.pNext = NULL;
13658 pipeline_layout_ci.setLayoutCount = 1;
13659 pipeline_layout_ci.pSetLayouts = &ds_layout;
13660
13661 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013662 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013663 ASSERT_VK_SUCCESS(err);
13664
13665 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013666 image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013667 ASSERT_TRUE(image.initialized());
13668
13669 VkImageView view;
13670 VkImageViewCreateInfo ivci = {};
13671 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13672 ivci.image = image.handle();
13673 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13674 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13675 ivci.subresourceRange.layerCount = 1;
13676 ivci.subresourceRange.baseMipLevel = 0;
13677 ivci.subresourceRange.levelCount = 1;
13678 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13679
13680 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13681 ASSERT_VK_SUCCESS(err);
13682
13683 VkDescriptorImageInfo image_info{};
13684 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13685 image_info.imageView = view;
13686 image_info.sampler = sampler;
13687
13688 VkWriteDescriptorSet descriptor_write = {};
13689 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13690 descriptor_write.dstSet = descriptor_set;
13691 descriptor_write.dstBinding = 0;
13692 descriptor_write.descriptorCount = 1;
13693 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13694 descriptor_write.pImageInfo = &image_info;
13695
13696 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13697
13698 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013699 char const *vsSource =
13700 "#version 450\n"
13701 "\n"
13702 "out gl_PerVertex { \n"
13703 " vec4 gl_Position;\n"
13704 "};\n"
13705 "void main(){\n"
13706 " gl_Position = vec4(1);\n"
13707 "}\n";
13708 char const *fsSource =
13709 "#version 450\n"
13710 "\n"
13711 "layout(set=0, binding=0) uniform sampler2D s;\n"
13712 "layout(location=0) out vec4 x;\n"
13713 "void main(){\n"
13714 " x = texture(s, vec2(1));\n"
13715 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013716 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13717 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13718 VkPipelineObj pipe(m_device);
13719 pipe.AddShader(&vs);
13720 pipe.AddShader(&fs);
13721 pipe.AddColorAttachment();
13722 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13723
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013725
Tony Barbour552f6c02016-12-21 14:34:07 -070013726 m_commandBuffer->BeginCommandBuffer();
13727 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013728 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013729 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13730 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13731 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013732
13733 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13734 VkRect2D scissor = {{0, 0}, {16, 16}};
13735 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13736 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13737
Tobin Ehlis209532e2016-09-07 13:52:18 -060013738 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013739 m_commandBuffer->EndRenderPass();
13740 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013741 // Submit cmd buffer then destroy sampler
13742 VkSubmitInfo submit_info = {};
13743 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13744 submit_info.commandBufferCount = 1;
13745 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13746 // Submit cmd buffer and then destroy sampler while in-flight
13747 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13748
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013749 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013750 m_errorMonitor->VerifyFound();
13751 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013752
Tobin Ehlis209532e2016-09-07 13:52:18 -060013753 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013754 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13755 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013756 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013757 vkDestroyImageView(m_device->device(), view, NULL);
13758 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13759 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13760 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13761}
13762
Mark Mueller1cd9f412016-08-25 13:23:52 -060013763TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013764 TEST_DESCRIPTION(
13765 "Call VkQueueSubmit with a semaphore that is already "
13766 "signaled but not waited on by the queue. Wait on a "
13767 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013768
Tony Barbour1fa09702017-03-16 12:09:08 -060013769 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013770 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13771
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013772 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 -070013773 const char *invalid_fence_wait_message =
13774 " which has not been submitted on a Queue or during "
13775 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013776
Chris Forbese98aec12017-05-18 12:50:14 -070013777 VkCommandBufferObj cb1(m_device, m_commandPool);
13778 cb1.begin();
13779 cb1.end();
Mark Mueller96a56d52016-08-24 10:28:05 -060013780
13781 VkSemaphoreCreateInfo semaphore_create_info = {};
13782 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13783 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013784 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013785 VkSubmitInfo submit_info = {};
13786 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13787 submit_info.commandBufferCount = 1;
Chris Forbese98aec12017-05-18 12:50:14 -070013788 submit_info.pCommandBuffers = &cb1.handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013789 submit_info.signalSemaphoreCount = 1;
13790 submit_info.pSignalSemaphores = &semaphore;
13791 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Chris Forbese98aec12017-05-18 12:50:14 -070013792
Tony Barbour552f6c02016-12-21 14:34:07 -070013793 m_commandBuffer->BeginCommandBuffer();
13794 m_commandBuffer->EndCommandBuffer();
Chris Forbese98aec12017-05-18 12:50:14 -070013795 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013797 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13798 m_errorMonitor->VerifyFound();
13799
Mark Mueller1cd9f412016-08-25 13:23:52 -060013800 VkFenceCreateInfo fence_create_info = {};
13801 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13802 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013803 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013804
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013806 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13807 m_errorMonitor->VerifyFound();
13808
Mark Mueller4042b652016-09-05 22:52:21 -060013809 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013810 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013811 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13812}
13813
Tobin Ehlis4af23302016-07-19 10:50:30 -060013814TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013815 TEST_DESCRIPTION(
13816 "Bind a secondary command buffer with with a framebuffer "
13817 "that does not match the framebuffer for the active "
13818 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013819 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13821
13822 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013823 VkAttachmentDescription attachment = {0,
13824 VK_FORMAT_B8G8R8A8_UNORM,
13825 VK_SAMPLE_COUNT_1_BIT,
13826 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13827 VK_ATTACHMENT_STORE_OP_STORE,
13828 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13829 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13830 VK_IMAGE_LAYOUT_UNDEFINED,
13831 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013832
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013833 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013834
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013835 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013836
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013837 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013838
13839 VkRenderPass rp;
13840 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13841 ASSERT_VK_SUCCESS(err);
13842
13843 // A compatible framebuffer.
13844 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013845 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013846 ASSERT_TRUE(image.initialized());
13847
13848 VkImageViewCreateInfo ivci = {
13849 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13850 nullptr,
13851 0,
13852 image.handle(),
13853 VK_IMAGE_VIEW_TYPE_2D,
13854 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013855 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13856 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013857 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13858 };
13859 VkImageView view;
13860 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13861 ASSERT_VK_SUCCESS(err);
13862
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013863 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013864 VkFramebuffer fb;
13865 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13866 ASSERT_VK_SUCCESS(err);
13867
13868 VkCommandBufferAllocateInfo cbai = {};
13869 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013870 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013871 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13872 cbai.commandBufferCount = 1;
13873
13874 VkCommandBuffer sec_cb;
13875 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13876 ASSERT_VK_SUCCESS(err);
13877 VkCommandBufferBeginInfo cbbi = {};
13878 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013879 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013880 cbii.renderPass = renderPass();
13881 cbii.framebuffer = fb;
13882 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13883 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013884 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 -060013885 cbbi.pInheritanceInfo = &cbii;
13886 vkBeginCommandBuffer(sec_cb, &cbbi);
13887 vkEndCommandBuffer(sec_cb);
13888
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013889 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013890 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13891 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013892
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013894 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013895 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13896 m_errorMonitor->VerifyFound();
13897 // Cleanup
13898 vkDestroyImageView(m_device->device(), view, NULL);
13899 vkDestroyRenderPass(m_device->device(), rp, NULL);
13900 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13901}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013902
13903TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013904 TEST_DESCRIPTION(
13905 "If logicOp is available on the device, set it to an "
13906 "invalid value. If logicOp is not available, attempt to "
13907 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013908 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013909 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13910
13911 auto features = m_device->phy().features();
13912 // Set the expected error depending on whether or not logicOp available
13913 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13915 "If logic operations feature not "
13916 "enabled, logicOpEnable must be "
13917 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013918 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013920 }
13921 // Create a pipeline using logicOp
13922 VkResult err;
13923
13924 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13925 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13926
13927 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013928 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013929 ASSERT_VK_SUCCESS(err);
13930
13931 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13932 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13933 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013934 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013935 vp_state_ci.pViewports = &vp;
13936 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013937 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013938 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013939
13940 VkPipelineShaderStageCreateInfo shaderStages[2];
13941 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13942
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013943 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13944 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013945 shaderStages[0] = vs.GetStageCreateInfo();
13946 shaderStages[1] = fs.GetStageCreateInfo();
13947
13948 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13949 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13950
13951 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13952 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13953 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13954
13955 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13956 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013957 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013958
13959 VkPipelineColorBlendAttachmentState att = {};
13960 att.blendEnable = VK_FALSE;
13961 att.colorWriteMask = 0xf;
13962
13963 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13964 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13965 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13966 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013967 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013968 cb_ci.attachmentCount = 1;
13969 cb_ci.pAttachments = &att;
13970
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013971 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13972 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13973 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13974
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013975 VkGraphicsPipelineCreateInfo gp_ci = {};
13976 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13977 gp_ci.stageCount = 2;
13978 gp_ci.pStages = shaderStages;
13979 gp_ci.pVertexInputState = &vi_ci;
13980 gp_ci.pInputAssemblyState = &ia_ci;
13981 gp_ci.pViewportState = &vp_state_ci;
13982 gp_ci.pRasterizationState = &rs_ci;
13983 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013984 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013985 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13986 gp_ci.layout = pipeline_layout;
13987 gp_ci.renderPass = renderPass();
13988
13989 VkPipelineCacheCreateInfo pc_ci = {};
13990 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13991
13992 VkPipeline pipeline;
13993 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013994 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013995 ASSERT_VK_SUCCESS(err);
13996
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013997 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013998 m_errorMonitor->VerifyFound();
13999 if (VK_SUCCESS == err) {
14000 vkDestroyPipeline(m_device->device(), pipeline, NULL);
14001 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060014002 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
14003 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
14004}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014005
Mike Stroyanaccf7692015-05-12 16:00:45 -060014006#if GTEST_IS_THREADSAFE
14007struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014008 VkCommandBuffer commandBuffer;
Mike Stroyanca855662017-05-02 11:06:27 -060014009 VkDevice device;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014010 VkEvent event;
14011 bool bailout;
14012};
14013
Karl Schultz6addd812016-02-02 17:17:23 -070014014extern "C" void *AddToCommandBuffer(void *arg) {
14015 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014016
Mike Stroyana6d14942016-07-13 15:10:05 -060014017 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014018 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014019 if (data->bailout) {
14020 break;
14021 }
14022 }
14023 return NULL;
14024}
14025
Karl Schultz6addd812016-02-02 17:17:23 -070014026TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014027 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014028
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014030
Tony Barbour1fa09702017-03-16 12:09:08 -060014031 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060014032 ASSERT_NO_FATAL_FAILURE(InitViewport());
14033 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14034
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014035 // Calls AllocateCommandBuffers
14036 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014037
14038 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014039 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014040
14041 VkEventCreateInfo event_info;
14042 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060014043 VkResult err;
14044
14045 memset(&event_info, 0, sizeof(event_info));
14046 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
14047
Chia-I Wuf7458c52015-10-26 21:10:41 +080014048 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014049 ASSERT_VK_SUCCESS(err);
14050
Mike Stroyanaccf7692015-05-12 16:00:45 -060014051 err = vkResetEvent(device(), event);
14052 ASSERT_VK_SUCCESS(err);
14053
14054 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014055 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014056 data.event = event;
14057 data.bailout = false;
14058 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060014059
14060 // First do some correct operations using multiple threads.
14061 // Add many entries to command buffer from another thread.
14062 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
14063 // Make non-conflicting calls from this thread at the same time.
14064 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060014065 uint32_t count;
14066 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060014067 }
14068 test_platform_thread_join(thread, NULL);
14069
14070 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060014071 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014072 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014073 // Add many entries to command buffer from this thread at the same time.
14074 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060014075
Mike Stroyan4268d1f2015-07-13 14:45:35 -060014076 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014077 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014078
Mike Stroyan10b8cb72016-01-22 15:22:03 -070014079 m_errorMonitor->SetBailout(NULL);
14080
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014081 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060014082
Chia-I Wuf7458c52015-10-26 21:10:41 +080014083 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060014084}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014085#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060014086
Karl Schultz6addd812016-02-02 17:17:23 -070014087TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014088 TEST_DESCRIPTION("Test that errors are produced for a spirv modules with invalid code sizes");
Chris Forbes1cc79542016-07-20 11:13:44 +120014089
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014091
Tony Barbour1fa09702017-03-16 12:09:08 -060014092 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014093 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14094
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014095 VkShaderModule module;
14096 VkShaderModuleCreateInfo moduleCreateInfo;
14097 struct icd_spv_header spv;
14098
14099 spv.magic = ICD_SPV_MAGIC;
14100 spv.version = ICD_SPV_VERSION;
14101 spv.gen_magic = 0;
14102
14103 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14104 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014105 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014106 moduleCreateInfo.codeSize = 4;
14107 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014108 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014109
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014110 m_errorMonitor->VerifyFound();
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014111
14112 char const *vsSource =
14113 "#version 450\n"
14114 "\n"
14115 "layout(location=0) out float x;\n"
14116 "out gl_PerVertex {\n"
14117 " vec4 gl_Position;\n"
14118 "};\n"
14119 "void main(){\n"
14120 " gl_Position = vec4(1);\n"
14121 " x = 0;\n"
14122 "}\n";
14123
14124 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02816);
14125 std::vector<unsigned int> shader;
14126 VkShaderModuleCreateInfo module_create_info;
14127 VkShaderModule shader_module;
14128 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14129 module_create_info.pNext = NULL;
14130 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, shader);
14131 module_create_info.pCode = shader.data();
14132 // Introduce failure by making codeSize a non-multiple of 4
14133 module_create_info.codeSize = shader.size() * sizeof(unsigned int) - 1;
14134 module_create_info.flags = 0;
14135 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
14136
14137 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014138}
14139
Karl Schultz6addd812016-02-02 17:17:23 -070014140TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014141 TEST_DESCRIPTION(
14142 "Test that an error is produced for a spirv module "
14143 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120014144
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014146
Tony Barbour1fa09702017-03-16 12:09:08 -060014147 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14149
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014150 VkShaderModule module;
14151 VkShaderModuleCreateInfo moduleCreateInfo;
14152 struct icd_spv_header spv;
14153
14154 spv.magic = ~ICD_SPV_MAGIC;
14155 spv.version = ICD_SPV_VERSION;
14156 spv.gen_magic = 0;
14157
14158 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14159 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070014160 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Mark Lobodzinskid742b312017-05-09 16:26:27 -060014161 moduleCreateInfo.codeSize = sizeof(spv) + 16;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014162 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014163 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014164
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014165 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014166}
14167
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014168#if 0
14169// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070014170TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070014171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014172 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014173
Tony Barbour1fa09702017-03-16 12:09:08 -060014174 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014175 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14176
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014177 VkShaderModule module;
14178 VkShaderModuleCreateInfo moduleCreateInfo;
14179 struct icd_spv_header spv;
14180
14181 spv.magic = ICD_SPV_MAGIC;
14182 spv.version = ~ICD_SPV_VERSION;
14183 spv.gen_magic = 0;
14184
14185 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14186 moduleCreateInfo.pNext = NULL;
14187
Karl Schultz6addd812016-02-02 17:17:23 -070014188 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014189 moduleCreateInfo.codeSize = sizeof(spv) + 10;
14190 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080014191 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014192
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014193 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014194}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120014195#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060014196
Karl Schultz6addd812016-02-02 17:17:23 -070014197TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014198 TEST_DESCRIPTION(
14199 "Test that a warning is produced for a vertex output that "
14200 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014202
Tony Barbour1fa09702017-03-16 12:09:08 -060014203 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014204 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014205
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014206 char const *vsSource =
14207 "#version 450\n"
14208 "\n"
14209 "layout(location=0) out float x;\n"
14210 "out gl_PerVertex {\n"
14211 " vec4 gl_Position;\n"
14212 "};\n"
14213 "void main(){\n"
14214 " gl_Position = vec4(1);\n"
14215 " x = 0;\n"
14216 "}\n";
14217 char const *fsSource =
14218 "#version 450\n"
14219 "\n"
14220 "layout(location=0) out vec4 color;\n"
14221 "void main(){\n"
14222 " color = vec4(1);\n"
14223 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120014224
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014225 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14226 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014227
14228 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014229 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014230 pipe.AddShader(&vs);
14231 pipe.AddShader(&fs);
14232
Chris Forbes9f7ff632015-05-25 11:13:08 +120014233 VkDescriptorSetObj descriptorSet(m_device);
14234 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014235 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120014236
Tony Barbour5781e8f2015-08-04 16:23:11 -060014237 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120014238
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014239 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120014240}
Chris Forbes9f7ff632015-05-25 11:13:08 +120014241
Mark Mueller098c9cb2016-09-08 09:01:57 -060014242TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
14243 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14244
Tony Barbour1fa09702017-03-16 12:09:08 -060014245 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14247
14248 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014249 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014250
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014251 char const *vsSource =
14252 "#version 450\n"
14253 "\n"
14254 "out gl_PerVertex {\n"
14255 " vec4 gl_Position;\n"
14256 "};\n"
14257 "void main(){\n"
14258 " gl_Position = vec4(1);\n"
14259 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014260
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014261 char const *fsSource =
14262 "#version 450\n"
14263 "\n"
14264 "layout (constant_id = 0) const float r = 0.0f;\n"
14265 "layout(location = 0) out vec4 uFragColor;\n"
14266 "void main(){\n"
14267 " uFragColor = vec4(r,1,0,1);\n"
14268 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014269
14270 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14271 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14272
14273 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14274 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14275
14276 VkPipelineLayout pipeline_layout;
14277 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14278
14279 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
14280 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
14281 vp_state_create_info.viewportCount = 1;
14282 VkViewport viewport = {};
14283 vp_state_create_info.pViewports = &viewport;
14284 vp_state_create_info.scissorCount = 1;
14285 VkRect2D scissors = {};
14286 vp_state_create_info.pScissors = &scissors;
14287
14288 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
14289
14290 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
14291 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
14292 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
14293 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
14294
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014295 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060014296
14297 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
14298 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
14299
14300 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
14301 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
14302 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
14303
14304 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
14305 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
14306 rasterization_state_create_info.pNext = nullptr;
14307 rasterization_state_create_info.lineWidth = 1.0f;
14308 rasterization_state_create_info.rasterizerDiscardEnable = true;
14309
14310 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
14311 color_blend_attachment_state.blendEnable = VK_FALSE;
14312 color_blend_attachment_state.colorWriteMask = 0xf;
14313
14314 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
14315 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
14316 color_blend_state_create_info.attachmentCount = 1;
14317 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
14318
14319 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
14320 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
14321 graphicspipe_create_info.stageCount = 2;
14322 graphicspipe_create_info.pStages = shader_stage_create_info;
14323 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
14324 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
14325 graphicspipe_create_info.pViewportState = &vp_state_create_info;
14326 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
14327 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
14328 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
14329 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
14330 graphicspipe_create_info.layout = pipeline_layout;
14331 graphicspipe_create_info.renderPass = renderPass();
14332
14333 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
14334 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
14335
14336 VkPipelineCache pipelineCache;
14337 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
14338
14339 // This structure maps constant ids to data locations.
14340 const VkSpecializationMapEntry entry =
14341 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014342 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014343
14344 uint32_t data = 1;
14345
14346 // Set up the info describing spec map and data
14347 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014348 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060014349 };
14350 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
14351
14352 VkPipeline pipeline;
14353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
14354 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
14355 m_errorMonitor->VerifyFound();
14356
14357 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
14358 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14359}
14360
14361TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
14362 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
14363
Tony Barbour1fa09702017-03-16 12:09:08 -060014364 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14366
14367 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
14368
14369 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
14370 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14371 descriptor_pool_type_count[0].descriptorCount = 1;
14372 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14373 descriptor_pool_type_count[1].descriptorCount = 1;
14374
14375 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14376 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14377 descriptor_pool_create_info.maxSets = 1;
14378 descriptor_pool_create_info.poolSizeCount = 2;
14379 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
14380 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14381
14382 VkDescriptorPool descriptorset_pool;
14383 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14384
14385 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14386 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
14387 descriptorset_layout_binding.descriptorCount = 1;
14388 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070014389 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014390
14391 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14392 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14393 descriptorset_layout_create_info.bindingCount = 1;
14394 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14395
14396 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014397 ASSERT_VK_SUCCESS(
14398 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014399
14400 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14401 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14402 descriptorset_allocate_info.descriptorSetCount = 1;
14403 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14404 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14405 VkDescriptorSet descriptorset;
14406 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14407
14408 // Challenge core_validation with a non uniform buffer type.
14409 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
14410
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014411 char const *vsSource =
14412 "#version 450\n"
14413 "\n"
14414 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14415 " mat4 mvp;\n"
14416 "} ubuf;\n"
14417 "out gl_PerVertex {\n"
14418 " vec4 gl_Position;\n"
14419 "};\n"
14420 "void main(){\n"
14421 " gl_Position = ubuf.mvp * vec4(1);\n"
14422 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014423
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014424 char const *fsSource =
14425 "#version 450\n"
14426 "\n"
14427 "layout(location = 0) out vec4 uFragColor;\n"
14428 "void main(){\n"
14429 " uFragColor = vec4(0,1,0,1);\n"
14430 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014431
14432 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14433 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14434
14435 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14436 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14437 pipeline_layout_create_info.setLayoutCount = 1;
14438 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14439
14440 VkPipelineLayout pipeline_layout;
14441 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14442
14443 VkPipelineObj pipe(m_device);
14444 pipe.AddColorAttachment();
14445 pipe.AddShader(&vs);
14446 pipe.AddShader(&fs);
14447
14448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
14449 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14450 m_errorMonitor->VerifyFound();
14451
14452 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14453 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14454 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14455}
14456
14457TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
14458 TEST_DESCRIPTION(
14459 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
14460
Tony Barbour1fa09702017-03-16 12:09:08 -060014461 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014462 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14463
14464 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
14465
14466 VkDescriptorPoolSize descriptor_pool_type_count = {};
14467 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14468 descriptor_pool_type_count.descriptorCount = 1;
14469
14470 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
14471 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
14472 descriptor_pool_create_info.maxSets = 1;
14473 descriptor_pool_create_info.poolSizeCount = 1;
14474 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
14475 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
14476
14477 VkDescriptorPool descriptorset_pool;
14478 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
14479
14480 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
14481 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
14482 descriptorset_layout_binding.descriptorCount = 1;
14483 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
14484 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070014485 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014486
14487 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
14488 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
14489 descriptorset_layout_create_info.bindingCount = 1;
14490 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
14491
14492 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014493 ASSERT_VK_SUCCESS(
14494 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014495
14496 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14497 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14498 descriptorset_allocate_info.descriptorSetCount = 1;
14499 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14500 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14501 VkDescriptorSet descriptorset;
14502 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14503
14504 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14505
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014506 char const *vsSource =
14507 "#version 450\n"
14508 "\n"
14509 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14510 " mat4 mvp;\n"
14511 "} ubuf;\n"
14512 "out gl_PerVertex {\n"
14513 " vec4 gl_Position;\n"
14514 "};\n"
14515 "void main(){\n"
14516 " gl_Position = ubuf.mvp * vec4(1);\n"
14517 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014518
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014519 char const *fsSource =
14520 "#version 450\n"
14521 "\n"
14522 "layout(location = 0) out vec4 uFragColor;\n"
14523 "void main(){\n"
14524 " uFragColor = vec4(0,1,0,1);\n"
14525 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014526
14527 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14528 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14529
14530 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14531 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14532 pipeline_layout_create_info.setLayoutCount = 1;
14533 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14534
14535 VkPipelineLayout pipeline_layout;
14536 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14537
14538 VkPipelineObj pipe(m_device);
14539 pipe.AddColorAttachment();
14540 pipe.AddShader(&vs);
14541 pipe.AddShader(&fs);
14542
14543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14544 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14545 m_errorMonitor->VerifyFound();
14546
14547 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14548 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14549 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14550}
14551
14552TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014553 TEST_DESCRIPTION(
14554 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14555 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014556
Tony Barbour1fa09702017-03-16 12:09:08 -060014557 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14559
14560 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014561 "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 -060014562
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014563 char const *vsSource =
14564 "#version 450\n"
14565 "\n"
14566 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14567 "out gl_PerVertex {\n"
14568 " vec4 gl_Position;\n"
14569 "};\n"
14570 "void main(){\n"
14571 " gl_Position = vec4(consts.x);\n"
14572 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014573
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014574 char const *fsSource =
14575 "#version 450\n"
14576 "\n"
14577 "layout(location = 0) out vec4 uFragColor;\n"
14578 "void main(){\n"
14579 " uFragColor = vec4(0,1,0,1);\n"
14580 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014581
14582 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14583 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14584
14585 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14586 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14587
14588 // Set up a push constant range
14589 VkPushConstantRange push_constant_ranges = {};
14590 // Set to the wrong stage to challenge core_validation
14591 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14592 push_constant_ranges.size = 4;
14593
14594 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14595 pipeline_layout_create_info.pushConstantRangeCount = 1;
14596
14597 VkPipelineLayout pipeline_layout;
14598 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14599
14600 VkPipelineObj pipe(m_device);
14601 pipe.AddColorAttachment();
14602 pipe.AddShader(&vs);
14603 pipe.AddShader(&fs);
14604
14605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14606 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14607 m_errorMonitor->VerifyFound();
14608
14609 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14610}
14611
14612TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14613 TEST_DESCRIPTION(
14614 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14615
Tony Barbour1fa09702017-03-16 12:09:08 -060014616 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014617 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14618
14619 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014620 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014621
14622 // Some awkward steps are required to test with custom device features.
14623 std::vector<const char *> device_extension_names;
14624 auto features = m_device->phy().features();
14625 // Disable support for 64 bit floats
14626 features.shaderFloat64 = false;
14627 // The sacrificial device object
14628 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14629
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014630 char const *vsSource =
14631 "#version 450\n"
14632 "\n"
14633 "out gl_PerVertex {\n"
14634 " vec4 gl_Position;\n"
14635 "};\n"
14636 "void main(){\n"
14637 " gl_Position = vec4(1);\n"
14638 "}\n";
14639 char const *fsSource =
14640 "#version 450\n"
14641 "\n"
14642 "layout(location=0) out vec4 color;\n"
14643 "void main(){\n"
14644 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14645 " color = vec4(green);\n"
14646 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014647
14648 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14649 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14650
14651 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014652
14653 VkPipelineObj pipe(&test_device);
14654 pipe.AddColorAttachment();
14655 pipe.AddShader(&vs);
14656 pipe.AddShader(&fs);
14657
14658 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14659 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14660 VkPipelineLayout pipeline_layout;
14661 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14662
14663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14664 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14665 m_errorMonitor->VerifyFound();
14666
14667 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14668}
14669
Mark Lobodzinski20832822017-03-24 14:49:45 -060014670TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14671 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14672 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014673
Tony Barbour1fa09702017-03-16 12:09:08 -060014674 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014675 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14676
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014677 char const *vsSource =
14678 "#version 450\n"
14679 "\n"
14680 "out gl_PerVertex {\n"
14681 " vec4 gl_Position;\n"
14682 "};\n"
14683 "layout(xfb_buffer = 1) out;"
14684 "void main(){\n"
14685 " gl_Position = vec4(1);\n"
14686 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014687
Mark Lobodzinski20832822017-03-24 14:49:45 -060014688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014689
Mark Lobodzinski20832822017-03-24 14:49:45 -060014690 std::vector<unsigned int> spv;
14691 VkShaderModuleCreateInfo module_create_info;
14692 VkShaderModule shader_module;
14693 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14694 module_create_info.pNext = NULL;
14695 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14696 module_create_info.pCode = spv.data();
14697 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14698 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014699
Mark Lobodzinski20832822017-03-24 14:49:45 -060014700 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014701
Mark Lobodzinski20832822017-03-24 14:49:45 -060014702 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014703}
14704
Karl Schultz6addd812016-02-02 17:17:23 -070014705TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014706 TEST_DESCRIPTION(
14707 "Test that an error is produced for a fragment shader input "
14708 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014709
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014711
Tony Barbour1fa09702017-03-16 12:09:08 -060014712 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014713 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014714
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014715 char const *vsSource =
14716 "#version 450\n"
14717 "\n"
14718 "out gl_PerVertex {\n"
14719 " vec4 gl_Position;\n"
14720 "};\n"
14721 "void main(){\n"
14722 " gl_Position = vec4(1);\n"
14723 "}\n";
14724 char const *fsSource =
14725 "#version 450\n"
14726 "\n"
14727 "layout(location=0) in float x;\n"
14728 "layout(location=0) out vec4 color;\n"
14729 "void main(){\n"
14730 " color = vec4(x);\n"
14731 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014732
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014733 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14734 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014735
14736 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014737 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014738 pipe.AddShader(&vs);
14739 pipe.AddShader(&fs);
14740
Chris Forbes59cb88d2015-05-25 11:13:13 +120014741 VkDescriptorSetObj descriptorSet(m_device);
14742 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014743 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014744
Tony Barbour5781e8f2015-08-04 16:23:11 -060014745 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014746
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014747 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014748}
14749
Karl Schultz6addd812016-02-02 17:17:23 -070014750TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014751 TEST_DESCRIPTION(
14752 "Test that an error is produced for a fragment shader input "
14753 "within an interace block, which is not present in the outputs "
14754 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014756
Tony Barbour1fa09702017-03-16 12:09:08 -060014757 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14759
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014760 char const *vsSource =
14761 "#version 450\n"
14762 "\n"
14763 "out gl_PerVertex {\n"
14764 " vec4 gl_Position;\n"
14765 "};\n"
14766 "void main(){\n"
14767 " gl_Position = vec4(1);\n"
14768 "}\n";
14769 char const *fsSource =
14770 "#version 450\n"
14771 "\n"
14772 "in block { layout(location=0) float x; } ins;\n"
14773 "layout(location=0) out vec4 color;\n"
14774 "void main(){\n"
14775 " color = vec4(ins.x);\n"
14776 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014777
14778 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14779 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14780
14781 VkPipelineObj pipe(m_device);
14782 pipe.AddColorAttachment();
14783 pipe.AddShader(&vs);
14784 pipe.AddShader(&fs);
14785
14786 VkDescriptorSetObj descriptorSet(m_device);
14787 descriptorSet.AppendDummy();
14788 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14789
14790 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14791
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014792 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014793}
14794
Karl Schultz6addd812016-02-02 17:17:23 -070014795TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014796 TEST_DESCRIPTION(
14797 "Test that an error is produced for mismatched array sizes "
14798 "across the vertex->fragment shader interface");
14799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14800 "Type mismatch on location 0.0: 'ptr to "
14801 "output arr[2] of float32' vs 'ptr to "
14802 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014803
Tony Barbour1fa09702017-03-16 12:09:08 -060014804 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014805 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14806
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014807 char const *vsSource =
14808 "#version 450\n"
14809 "\n"
14810 "layout(location=0) out float x[2];\n"
14811 "out gl_PerVertex {\n"
14812 " vec4 gl_Position;\n"
14813 "};\n"
14814 "void main(){\n"
14815 " x[0] = 0; x[1] = 0;\n"
14816 " gl_Position = vec4(1);\n"
14817 "}\n";
14818 char const *fsSource =
14819 "#version 450\n"
14820 "\n"
14821 "layout(location=0) in float x[1];\n"
14822 "layout(location=0) out vec4 color;\n"
14823 "void main(){\n"
14824 " color = vec4(x[0]);\n"
14825 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014826
14827 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14828 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14829
14830 VkPipelineObj pipe(m_device);
14831 pipe.AddColorAttachment();
14832 pipe.AddShader(&vs);
14833 pipe.AddShader(&fs);
14834
14835 VkDescriptorSetObj descriptorSet(m_device);
14836 descriptorSet.AppendDummy();
14837 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14838
14839 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14840
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014841 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014842}
14843
Karl Schultz6addd812016-02-02 17:17:23 -070014844TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014845 TEST_DESCRIPTION(
14846 "Test that an error is produced for mismatched types across "
14847 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014849
Tony Barbour1fa09702017-03-16 12:09:08 -060014850 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014852
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014853 char const *vsSource =
14854 "#version 450\n"
14855 "\n"
14856 "layout(location=0) out int x;\n"
14857 "out gl_PerVertex {\n"
14858 " vec4 gl_Position;\n"
14859 "};\n"
14860 "void main(){\n"
14861 " x = 0;\n"
14862 " gl_Position = vec4(1);\n"
14863 "}\n";
14864 char const *fsSource =
14865 "#version 450\n"
14866 "\n"
14867 "layout(location=0) in float x;\n" /* VS writes int */
14868 "layout(location=0) out vec4 color;\n"
14869 "void main(){\n"
14870 " color = vec4(x);\n"
14871 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014872
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014873 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14874 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014875
14876 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014877 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014878 pipe.AddShader(&vs);
14879 pipe.AddShader(&fs);
14880
Chris Forbesb56af562015-05-25 11:13:17 +120014881 VkDescriptorSetObj descriptorSet(m_device);
14882 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014883 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014884
Tony Barbour5781e8f2015-08-04 16:23:11 -060014885 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014886
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014887 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014888}
14889
Karl Schultz6addd812016-02-02 17:17:23 -070014890TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014891 TEST_DESCRIPTION(
14892 "Test that an error is produced for mismatched types across "
14893 "the vertex->fragment shader interface, when the variable is contained within "
14894 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014896
Tony Barbour1fa09702017-03-16 12:09:08 -060014897 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014898 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14899
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014900 char const *vsSource =
14901 "#version 450\n"
14902 "\n"
14903 "out block { layout(location=0) int x; } outs;\n"
14904 "out gl_PerVertex {\n"
14905 " vec4 gl_Position;\n"
14906 "};\n"
14907 "void main(){\n"
14908 " outs.x = 0;\n"
14909 " gl_Position = vec4(1);\n"
14910 "}\n";
14911 char const *fsSource =
14912 "#version 450\n"
14913 "\n"
14914 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14915 "layout(location=0) out vec4 color;\n"
14916 "void main(){\n"
14917 " color = vec4(ins.x);\n"
14918 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014919
14920 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14921 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14922
14923 VkPipelineObj pipe(m_device);
14924 pipe.AddColorAttachment();
14925 pipe.AddShader(&vs);
14926 pipe.AddShader(&fs);
14927
14928 VkDescriptorSetObj descriptorSet(m_device);
14929 descriptorSet.AppendDummy();
14930 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14931
14932 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14933
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014934 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014935}
14936
14937TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014938 TEST_DESCRIPTION(
14939 "Test that an error is produced for location mismatches across "
14940 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14941 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014942 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 +130014943
Tony Barbour1fa09702017-03-16 12:09:08 -060014944 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014945 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14946
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014947 char const *vsSource =
14948 "#version 450\n"
14949 "\n"
14950 "out block { layout(location=1) float x; } outs;\n"
14951 "out gl_PerVertex {\n"
14952 " vec4 gl_Position;\n"
14953 "};\n"
14954 "void main(){\n"
14955 " outs.x = 0;\n"
14956 " gl_Position = vec4(1);\n"
14957 "}\n";
14958 char const *fsSource =
14959 "#version 450\n"
14960 "\n"
14961 "in block { layout(location=0) float x; } ins;\n"
14962 "layout(location=0) out vec4 color;\n"
14963 "void main(){\n"
14964 " color = vec4(ins.x);\n"
14965 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014966
14967 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14968 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14969
14970 VkPipelineObj pipe(m_device);
14971 pipe.AddColorAttachment();
14972 pipe.AddShader(&vs);
14973 pipe.AddShader(&fs);
14974
14975 VkDescriptorSetObj descriptorSet(m_device);
14976 descriptorSet.AppendDummy();
14977 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14978
14979 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14980
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014981 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014982}
14983
14984TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014985 TEST_DESCRIPTION(
14986 "Test that an error is produced for component mismatches across the "
14987 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14988 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014989 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 +130014990
Tony Barbour1fa09702017-03-16 12:09:08 -060014991 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014992 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14993
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014994 char const *vsSource =
14995 "#version 450\n"
14996 "\n"
14997 "out block { layout(location=0, component=0) float x; } outs;\n"
14998 "out gl_PerVertex {\n"
14999 " vec4 gl_Position;\n"
15000 "};\n"
15001 "void main(){\n"
15002 " outs.x = 0;\n"
15003 " gl_Position = vec4(1);\n"
15004 "}\n";
15005 char const *fsSource =
15006 "#version 450\n"
15007 "\n"
15008 "in block { layout(location=0, component=1) float x; } ins;\n"
15009 "layout(location=0) out vec4 color;\n"
15010 "void main(){\n"
15011 " color = vec4(ins.x);\n"
15012 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130015013
15014 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15015 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15016
15017 VkPipelineObj pipe(m_device);
15018 pipe.AddColorAttachment();
15019 pipe.AddShader(&vs);
15020 pipe.AddShader(&fs);
15021
15022 VkDescriptorSetObj descriptorSet(m_device);
15023 descriptorSet.AppendDummy();
15024 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15025
15026 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15027
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015028 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130015029}
15030
Chris Forbes1f3b0152016-11-30 12:48:40 +130015031TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
15032 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15033
Tony Barbour1fa09702017-03-16 12:09:08 -060015034 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130015035 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15036
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015037 char const *vsSource =
15038 "#version 450\n"
15039 "layout(location=0) out mediump float x;\n"
15040 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15041 char const *fsSource =
15042 "#version 450\n"
15043 "layout(location=0) in highp float x;\n"
15044 "layout(location=0) out vec4 color;\n"
15045 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130015046
15047 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15048 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15049
15050 VkPipelineObj pipe(m_device);
15051 pipe.AddColorAttachment();
15052 pipe.AddShader(&vs);
15053 pipe.AddShader(&fs);
15054
15055 VkDescriptorSetObj descriptorSet(m_device);
15056 descriptorSet.AppendDummy();
15057 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15058
15059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15060
15061 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15062
15063 m_errorMonitor->VerifyFound();
15064}
15065
Chris Forbes870a39e2016-11-30 12:55:56 +130015066TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
15067 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
15068
Tony Barbour1fa09702017-03-16 12:09:08 -060015069 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130015070 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15071
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015072 char const *vsSource =
15073 "#version 450\n"
15074 "out block { layout(location=0) mediump float x; };\n"
15075 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
15076 char const *fsSource =
15077 "#version 450\n"
15078 "in block { layout(location=0) highp float x; };\n"
15079 "layout(location=0) out vec4 color;\n"
15080 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130015081
15082 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15083 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15084
15085 VkPipelineObj pipe(m_device);
15086 pipe.AddColorAttachment();
15087 pipe.AddShader(&vs);
15088 pipe.AddShader(&fs);
15089
15090 VkDescriptorSetObj descriptorSet(m_device);
15091 descriptorSet.AppendDummy();
15092 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15093
15094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
15095
15096 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15097
15098 m_errorMonitor->VerifyFound();
15099}
15100
Karl Schultz6addd812016-02-02 17:17:23 -070015101TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015102 TEST_DESCRIPTION(
15103 "Test that a warning is produced for a vertex attribute which is "
15104 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015106
Tony Barbour1fa09702017-03-16 12:09:08 -060015107 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015108 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120015109
15110 VkVertexInputBindingDescription input_binding;
15111 memset(&input_binding, 0, sizeof(input_binding));
15112
15113 VkVertexInputAttributeDescription input_attrib;
15114 memset(&input_attrib, 0, sizeof(input_attrib));
15115 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15116
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015117 char const *vsSource =
15118 "#version 450\n"
15119 "\n"
15120 "out gl_PerVertex {\n"
15121 " vec4 gl_Position;\n"
15122 "};\n"
15123 "void main(){\n"
15124 " gl_Position = vec4(1);\n"
15125 "}\n";
15126 char const *fsSource =
15127 "#version 450\n"
15128 "\n"
15129 "layout(location=0) out vec4 color;\n"
15130 "void main(){\n"
15131 " color = vec4(1);\n"
15132 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120015133
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015134 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15135 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120015136
15137 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015138 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120015139 pipe.AddShader(&vs);
15140 pipe.AddShader(&fs);
15141
15142 pipe.AddVertexInputBindings(&input_binding, 1);
15143 pipe.AddVertexInputAttribs(&input_attrib, 1);
15144
Chris Forbesde136e02015-05-25 11:13:28 +120015145 VkDescriptorSetObj descriptorSet(m_device);
15146 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015147 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120015148
Tony Barbour5781e8f2015-08-04 16:23:11 -060015149 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120015150
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015151 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120015152}
15153
Karl Schultz6addd812016-02-02 17:17:23 -070015154TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015155 TEST_DESCRIPTION(
15156 "Test that a warning is produced for a location mismatch on "
15157 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015159
Tony Barbour1fa09702017-03-16 12:09:08 -060015160 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130015161 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15162
15163 VkVertexInputBindingDescription input_binding;
15164 memset(&input_binding, 0, sizeof(input_binding));
15165
15166 VkVertexInputAttributeDescription input_attrib;
15167 memset(&input_attrib, 0, sizeof(input_attrib));
15168 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15169
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015170 char const *vsSource =
15171 "#version 450\n"
15172 "\n"
15173 "layout(location=1) in float x;\n"
15174 "out gl_PerVertex {\n"
15175 " vec4 gl_Position;\n"
15176 "};\n"
15177 "void main(){\n"
15178 " gl_Position = vec4(x);\n"
15179 "}\n";
15180 char const *fsSource =
15181 "#version 450\n"
15182 "\n"
15183 "layout(location=0) out vec4 color;\n"
15184 "void main(){\n"
15185 " color = vec4(1);\n"
15186 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130015187
15188 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15189 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15190
15191 VkPipelineObj pipe(m_device);
15192 pipe.AddColorAttachment();
15193 pipe.AddShader(&vs);
15194 pipe.AddShader(&fs);
15195
15196 pipe.AddVertexInputBindings(&input_binding, 1);
15197 pipe.AddVertexInputAttribs(&input_attrib, 1);
15198
15199 VkDescriptorSetObj descriptorSet(m_device);
15200 descriptorSet.AppendDummy();
15201 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015203 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130015204 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15205
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015206 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130015207}
15208
Karl Schultz6addd812016-02-02 17:17:23 -070015209TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015210 TEST_DESCRIPTION(
15211 "Test that an error is produced for a vertex shader input which is not "
15212 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15214 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015215
Tony Barbour1fa09702017-03-16 12:09:08 -060015216 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015217 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120015218
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015219 char const *vsSource =
15220 "#version 450\n"
15221 "\n"
15222 "layout(location=0) in vec4 x;\n" /* not provided */
15223 "out gl_PerVertex {\n"
15224 " vec4 gl_Position;\n"
15225 "};\n"
15226 "void main(){\n"
15227 " gl_Position = x;\n"
15228 "}\n";
15229 char const *fsSource =
15230 "#version 450\n"
15231 "\n"
15232 "layout(location=0) out vec4 color;\n"
15233 "void main(){\n"
15234 " color = vec4(1);\n"
15235 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120015236
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015237 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15238 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120015239
15240 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015241 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120015242 pipe.AddShader(&vs);
15243 pipe.AddShader(&fs);
15244
Chris Forbes62e8e502015-05-25 11:13:29 +120015245 VkDescriptorSetObj descriptorSet(m_device);
15246 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015247 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120015248
Tony Barbour5781e8f2015-08-04 16:23:11 -060015249 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120015250
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015251 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120015252}
15253
Karl Schultz6addd812016-02-02 17:17:23 -070015254TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015255 TEST_DESCRIPTION(
15256 "Test that an error is produced for a mismatch between the "
15257 "fundamental type (float/int/uint) of an attribute and the "
15258 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060015259 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 -060015260
Tony Barbour1fa09702017-03-16 12:09:08 -060015261 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015263
15264 VkVertexInputBindingDescription input_binding;
15265 memset(&input_binding, 0, sizeof(input_binding));
15266
15267 VkVertexInputAttributeDescription input_attrib;
15268 memset(&input_attrib, 0, sizeof(input_attrib));
15269 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15270
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015271 char const *vsSource =
15272 "#version 450\n"
15273 "\n"
15274 "layout(location=0) in int x;\n" /* attrib provided float */
15275 "out gl_PerVertex {\n"
15276 " vec4 gl_Position;\n"
15277 "};\n"
15278 "void main(){\n"
15279 " gl_Position = vec4(x);\n"
15280 "}\n";
15281 char const *fsSource =
15282 "#version 450\n"
15283 "\n"
15284 "layout(location=0) out vec4 color;\n"
15285 "void main(){\n"
15286 " color = vec4(1);\n"
15287 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120015288
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015289 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15290 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015291
15292 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015293 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015294 pipe.AddShader(&vs);
15295 pipe.AddShader(&fs);
15296
15297 pipe.AddVertexInputBindings(&input_binding, 1);
15298 pipe.AddVertexInputAttribs(&input_attrib, 1);
15299
Chris Forbesc97d98e2015-05-25 11:13:31 +120015300 VkDescriptorSetObj descriptorSet(m_device);
15301 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015302 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120015303
Tony Barbour5781e8f2015-08-04 16:23:11 -060015304 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120015305
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015306 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120015307}
15308
Chris Forbesc68b43c2016-04-06 11:18:47 +120015309TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015310 TEST_DESCRIPTION(
15311 "Test that an error is produced for a pipeline containing multiple "
15312 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15314 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120015315
Tony Barbour1fa09702017-03-16 12:09:08 -060015316 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120015317 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015319 char const *vsSource =
15320 "#version 450\n"
15321 "\n"
15322 "out gl_PerVertex {\n"
15323 " vec4 gl_Position;\n"
15324 "};\n"
15325 "void main(){\n"
15326 " gl_Position = vec4(1);\n"
15327 "}\n";
15328 char const *fsSource =
15329 "#version 450\n"
15330 "\n"
15331 "layout(location=0) out vec4 color;\n"
15332 "void main(){\n"
15333 " color = vec4(1);\n"
15334 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120015335
15336 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15337 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15338
15339 VkPipelineObj pipe(m_device);
15340 pipe.AddColorAttachment();
15341 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015342 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120015343 pipe.AddShader(&fs);
15344
15345 VkDescriptorSetObj descriptorSet(m_device);
15346 descriptorSet.AppendDummy();
15347 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15348
15349 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15350
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015351 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120015352}
15353
Chris Forbes82ff92a2016-09-09 10:50:24 +120015354TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120015356
Tony Barbour1fa09702017-03-16 12:09:08 -060015357 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120015358 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15359
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015360 char const *vsSource =
15361 "#version 450\n"
15362 "out gl_PerVertex {\n"
15363 " vec4 gl_Position;\n"
15364 "};\n"
15365 "void main(){\n"
15366 " gl_Position = vec4(0);\n"
15367 "}\n";
15368 char const *fsSource =
15369 "#version 450\n"
15370 "\n"
15371 "layout(location=0) out vec4 color;\n"
15372 "void main(){\n"
15373 " color = vec4(1);\n"
15374 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120015375
15376 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15377 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
15378
15379 VkPipelineObj pipe(m_device);
15380 pipe.AddColorAttachment();
15381 pipe.AddShader(&vs);
15382 pipe.AddShader(&fs);
15383
15384 VkDescriptorSetObj descriptorSet(m_device);
15385 descriptorSet.AppendDummy();
15386 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15387
15388 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15389
15390 m_errorMonitor->VerifyFound();
15391}
15392
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015393TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15395 "pDepthStencilState is NULL when rasterization is enabled and subpass "
15396 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015397
Tony Barbour1fa09702017-03-16 12:09:08 -060015398 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15400
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015401 char const *vsSource =
15402 "#version 450\n"
15403 "void main(){ gl_Position = vec4(0); }\n";
15404 char const *fsSource =
15405 "#version 450\n"
15406 "\n"
15407 "layout(location=0) out vec4 color;\n"
15408 "void main(){\n"
15409 " color = vec4(1);\n"
15410 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015411
15412 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15413 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15414
15415 VkPipelineObj pipe(m_device);
15416 pipe.AddColorAttachment();
15417 pipe.AddShader(&vs);
15418 pipe.AddShader(&fs);
15419
15420 VkDescriptorSetObj descriptorSet(m_device);
15421 descriptorSet.AppendDummy();
15422 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15423
15424 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015425 {
15426 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15427 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15428 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015429 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015430 {
15431 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
15432 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
15433 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015434 },
15435 };
15436 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015437 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015438 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070015439 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
15440 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120015441 VkRenderPass rp;
15442 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15443 ASSERT_VK_SUCCESS(err);
15444
15445 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
15446
15447 m_errorMonitor->VerifyFound();
15448
15449 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15450}
15451
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015452TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015453 TEST_DESCRIPTION(
15454 "Test that an error is produced for a variable output from "
15455 "the TCS without the patch decoration, but consumed in the TES "
15456 "with the decoration.");
15457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15458 "is per-vertex in tessellation control shader stage "
15459 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120015460
Tony Barbour1fa09702017-03-16 12:09:08 -060015461 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120015462 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15463
Chris Forbesc1e852d2016-04-04 19:26:42 +120015464 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070015465 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120015466 return;
15467 }
15468
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015469 char const *vsSource =
15470 "#version 450\n"
15471 "void main(){}\n";
15472 char const *tcsSource =
15473 "#version 450\n"
15474 "layout(location=0) out int x[];\n"
15475 "layout(vertices=3) out;\n"
15476 "void main(){\n"
15477 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15478 " gl_TessLevelInner[0] = 1;\n"
15479 " x[gl_InvocationID] = gl_InvocationID;\n"
15480 "}\n";
15481 char const *tesSource =
15482 "#version 450\n"
15483 "layout(triangles, equal_spacing, cw) in;\n"
15484 "layout(location=0) patch in int x;\n"
15485 "out gl_PerVertex { vec4 gl_Position; };\n"
15486 "void main(){\n"
15487 " gl_Position.xyz = gl_TessCoord;\n"
15488 " gl_Position.w = x;\n"
15489 "}\n";
15490 char const *fsSource =
15491 "#version 450\n"
15492 "layout(location=0) out vec4 color;\n"
15493 "void main(){\n"
15494 " color = vec4(1);\n"
15495 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015496
15497 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15498 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15499 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15500 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15501
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015502 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15503 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015504
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015505 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015506
15507 VkPipelineObj pipe(m_device);
15508 pipe.SetInputAssembly(&iasci);
15509 pipe.SetTessellation(&tsci);
15510 pipe.AddColorAttachment();
15511 pipe.AddShader(&vs);
15512 pipe.AddShader(&tcs);
15513 pipe.AddShader(&tes);
15514 pipe.AddShader(&fs);
15515
15516 VkDescriptorSetObj descriptorSet(m_device);
15517 descriptorSet.AppendDummy();
15518 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15519
15520 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15521
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015522 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015523}
15524
Cort Stratton2bcca1b2017-05-05 16:02:35 -070015525TEST_F(VkLayerTest, CreatePipelineTessErrors) {
15526 TEST_DESCRIPTION("Test various errors when creating a graphics pipeline with tessellation stages active.");
15527
15528 ASSERT_NO_FATAL_FAILURE(Init());
15529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15530
15531 if (!m_device->phy().features().tessellationShader) {
15532 printf(" Device does not support tessellation shaders; skipped.\n");
15533 return;
15534 }
15535
15536 char const *vsSource =
15537 "#version 450\n"
15538 "void main(){}\n";
15539 char const *tcsSource =
15540 "#version 450\n"
15541 "layout(vertices=3) out;\n"
15542 "void main(){\n"
15543 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
15544 " gl_TessLevelInner[0] = 1;\n"
15545 "}\n";
15546 char const *tesSource =
15547 "#version 450\n"
15548 "layout(triangles, equal_spacing, cw) in;\n"
15549 "out gl_PerVertex { vec4 gl_Position; };\n"
15550 "void main(){\n"
15551 " gl_Position.xyz = gl_TessCoord;\n"
15552 " gl_Position.w = 0;\n"
15553 "}\n";
15554 char const *fsSource =
15555 "#version 450\n"
15556 "layout(location=0) out vec4 color;\n"
15557 "void main(){\n"
15558 " color = vec4(1);\n"
15559 "}\n";
15560
15561 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15562 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15563 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15564 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15565
15566 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15567 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
15568
15569 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
15570
15571 VkDescriptorSetObj descriptorSet(m_device);
15572 descriptorSet.AppendDummy();
15573 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15574
15575 {
15576 VkPipelineObj pipe(m_device);
15577 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15578 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15579 pipe.SetInputAssembly(&iasci_bad);
15580 pipe.AddColorAttachment();
15581 pipe.AddShader(&vs);
15582 pipe.AddShader(&fs);
15583
15584 // Pass a tess control shader without a tess eval shader
15585 pipe.AddShader(&tcs);
15586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00534);
15587 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15588 m_errorMonitor->VerifyFound();
15589 }
15590
15591 {
15592 VkPipelineObj pipe(m_device);
15593 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15594 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; // otherwise we get a failure about invalid topology
15595 pipe.SetInputAssembly(&iasci_bad);
15596 pipe.AddColorAttachment();
15597 pipe.AddShader(&vs);
15598 pipe.AddShader(&fs);
15599
15600 // Pass a tess eval shader without a tess control shader
15601 pipe.AddShader(&tes);
15602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00535);
15603 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15604 m_errorMonitor->VerifyFound();
15605 }
15606
15607 {
15608 VkPipelineObj pipe(m_device);
15609 pipe.SetInputAssembly(&iasci);
15610 pipe.AddColorAttachment();
15611 pipe.AddShader(&vs);
15612 pipe.AddShader(&fs);
15613
15614 // Pass patch topology without tessellation shaders
15615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02100);
15616 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15617 m_errorMonitor->VerifyFound();
15618
15619 pipe.AddShader(&tcs);
15620 pipe.AddShader(&tes);
15621 // Pass a NULL pTessellationState (with active tessellation shader stages)
15622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00536);
15623 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15624 m_errorMonitor->VerifyFound();
15625
15626 // Pass an invalid pTessellationState (bad sType)
15627 VkPipelineTessellationStateCreateInfo tsci_bad = tsci;
15628 tsci_bad.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
15629 pipe.SetTessellation(&tsci_bad);
15630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01427);
15631 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15632 m_errorMonitor->VerifyFound();
15633 // Pass out-of-range patchControlPoints
15634 tsci_bad = tsci;
15635 tsci_bad.patchControlPoints = 0;
15636 pipe.SetTessellation(&tsci);
15637 pipe.SetTessellation(&tsci_bad);
15638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15639 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15640 m_errorMonitor->VerifyFound();
15641 tsci_bad.patchControlPoints = m_device->props.limits.maxTessellationPatchSize + 1;
15642 pipe.SetTessellation(&tsci_bad);
15643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01426);
15644 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15645 m_errorMonitor->VerifyFound();
15646 pipe.SetTessellation(&tsci);
15647
15648 // Pass an invalid primitive topology
15649 VkPipelineInputAssemblyStateCreateInfo iasci_bad = iasci;
15650 iasci_bad.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
15651 pipe.SetInputAssembly(&iasci_bad);
15652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02099);
15653 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15654 m_errorMonitor->VerifyFound();
15655 pipe.SetInputAssembly(&iasci);
15656 }
15657}
15658
Karl Schultz6addd812016-02-02 17:17:23 -070015659TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015660 TEST_DESCRIPTION(
15661 "Test that an error is produced for a vertex attribute setup where multiple "
15662 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15664 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015665
Tony Barbour1fa09702017-03-16 12:09:08 -060015666 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015667 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015668
15669 /* Two binding descriptions for binding 0 */
15670 VkVertexInputBindingDescription input_bindings[2];
15671 memset(input_bindings, 0, sizeof(input_bindings));
15672
15673 VkVertexInputAttributeDescription input_attrib;
15674 memset(&input_attrib, 0, sizeof(input_attrib));
15675 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15676
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015677 char const *vsSource =
15678 "#version 450\n"
15679 "\n"
15680 "layout(location=0) in float x;\n" /* attrib provided float */
15681 "out gl_PerVertex {\n"
15682 " vec4 gl_Position;\n"
15683 "};\n"
15684 "void main(){\n"
15685 " gl_Position = vec4(x);\n"
15686 "}\n";
15687 char const *fsSource =
15688 "#version 450\n"
15689 "\n"
15690 "layout(location=0) out vec4 color;\n"
15691 "void main(){\n"
15692 " color = vec4(1);\n"
15693 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015694
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015695 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15696 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015697
15698 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015699 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015700 pipe.AddShader(&vs);
15701 pipe.AddShader(&fs);
15702
15703 pipe.AddVertexInputBindings(input_bindings, 2);
15704 pipe.AddVertexInputAttribs(&input_attrib, 1);
15705
Chris Forbes280ba2c2015-06-12 11:16:41 +120015706 VkDescriptorSetObj descriptorSet(m_device);
15707 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015708 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015709
Tony Barbour5781e8f2015-08-04 16:23:11 -060015710 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015711
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015712 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015713}
Chris Forbes8f68b562015-05-25 11:13:32 +120015714
Karl Schultz6addd812016-02-02 17:17:23 -070015715TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015716 TEST_DESCRIPTION(
15717 "Test that an error is produced for a fragment shader which does not "
15718 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015720
Tony Barbour1fa09702017-03-16 12:09:08 -060015721 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015722
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015723 char const *vsSource =
15724 "#version 450\n"
15725 "\n"
15726 "out gl_PerVertex {\n"
15727 " vec4 gl_Position;\n"
15728 "};\n"
15729 "void main(){\n"
15730 " gl_Position = vec4(1);\n"
15731 "}\n";
15732 char const *fsSource =
15733 "#version 450\n"
15734 "\n"
15735 "void main(){\n"
15736 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015737
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015738 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15739 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015740
15741 VkPipelineObj pipe(m_device);
15742 pipe.AddShader(&vs);
15743 pipe.AddShader(&fs);
15744
Chia-I Wu08accc62015-07-07 11:50:03 +080015745 /* set up CB 0, not written */
15746 pipe.AddColorAttachment();
15747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015748
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015749 VkDescriptorSetObj descriptorSet(m_device);
15750 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015751 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015752
Tony Barbour5781e8f2015-08-04 16:23:11 -060015753 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015754
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015755 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015756}
15757
Karl Schultz6addd812016-02-02 17:17:23 -070015758TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015759 TEST_DESCRIPTION(
15760 "Test that a warning is produced for a fragment shader which provides a spurious "
15761 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015763 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015764
Tony Barbour1fa09702017-03-16 12:09:08 -060015765 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015766
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015767 char const *vsSource =
15768 "#version 450\n"
15769 "\n"
15770 "out gl_PerVertex {\n"
15771 " vec4 gl_Position;\n"
15772 "};\n"
15773 "void main(){\n"
15774 " gl_Position = vec4(1);\n"
15775 "}\n";
15776 char const *fsSource =
15777 "#version 450\n"
15778 "\n"
15779 "layout(location=0) out vec4 x;\n"
15780 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15781 "void main(){\n"
15782 " x = vec4(1);\n"
15783 " y = vec4(1);\n"
15784 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015785
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015786 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15787 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015788
15789 VkPipelineObj pipe(m_device);
15790 pipe.AddShader(&vs);
15791 pipe.AddShader(&fs);
15792
Chia-I Wu08accc62015-07-07 11:50:03 +080015793 /* set up CB 0, not written */
15794 pipe.AddColorAttachment();
15795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015796 /* FS writes CB 1, but we don't configure it */
15797
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015798 VkDescriptorSetObj descriptorSet(m_device);
15799 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015800 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015801
Tony Barbour5781e8f2015-08-04 16:23:11 -060015802 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015803
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015804 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015805}
15806
Karl Schultz6addd812016-02-02 17:17:23 -070015807TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015808 TEST_DESCRIPTION(
15809 "Test that an error is produced for a mismatch between the fundamental "
15810 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015812
Tony Barbour1fa09702017-03-16 12:09:08 -060015813 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015814
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015815 char const *vsSource =
15816 "#version 450\n"
15817 "\n"
15818 "out gl_PerVertex {\n"
15819 " vec4 gl_Position;\n"
15820 "};\n"
15821 "void main(){\n"
15822 " gl_Position = vec4(1);\n"
15823 "}\n";
15824 char const *fsSource =
15825 "#version 450\n"
15826 "\n"
15827 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15828 "void main(){\n"
15829 " x = ivec4(1);\n"
15830 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015831
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015832 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15833 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015834
15835 VkPipelineObj pipe(m_device);
15836 pipe.AddShader(&vs);
15837 pipe.AddShader(&fs);
15838
Chia-I Wu08accc62015-07-07 11:50:03 +080015839 /* set up CB 0; type is UNORM by default */
15840 pipe.AddColorAttachment();
15841 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015842
Chris Forbesa36d69e2015-05-25 11:13:44 +120015843 VkDescriptorSetObj descriptorSet(m_device);
15844 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015845 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015846
Tony Barbour5781e8f2015-08-04 16:23:11 -060015847 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015848
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015849 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015850}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015851
Karl Schultz6addd812016-02-02 17:17:23 -070015852TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015853 TEST_DESCRIPTION(
15854 "Test that an error is produced for a shader consuming a uniform "
15855 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015857
Tony Barbour1fa09702017-03-16 12:09:08 -060015858 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015859
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015860 char const *vsSource =
15861 "#version 450\n"
15862 "\n"
15863 "out gl_PerVertex {\n"
15864 " vec4 gl_Position;\n"
15865 "};\n"
15866 "void main(){\n"
15867 " gl_Position = vec4(1);\n"
15868 "}\n";
15869 char const *fsSource =
15870 "#version 450\n"
15871 "\n"
15872 "layout(location=0) out vec4 x;\n"
15873 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15874 "void main(){\n"
15875 " x = vec4(bar.y);\n"
15876 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015877
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015878 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15879 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015880
Chris Forbes556c76c2015-08-14 12:04:59 +120015881 VkPipelineObj pipe(m_device);
15882 pipe.AddShader(&vs);
15883 pipe.AddShader(&fs);
15884
15885 /* set up CB 0; type is UNORM by default */
15886 pipe.AddColorAttachment();
15887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15888
15889 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015890 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015891
15892 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15893
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015894 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015895}
15896
Chris Forbes5c59e902016-02-26 16:56:09 +130015897TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015898 TEST_DESCRIPTION(
15899 "Test that an error is produced for a shader consuming push constants "
15900 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015902
Tony Barbour1fa09702017-03-16 12:09:08 -060015903 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015904
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015905 char const *vsSource =
15906 "#version 450\n"
15907 "\n"
15908 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15909 "out gl_PerVertex {\n"
15910 " vec4 gl_Position;\n"
15911 "};\n"
15912 "void main(){\n"
15913 " gl_Position = vec4(consts.x);\n"
15914 "}\n";
15915 char const *fsSource =
15916 "#version 450\n"
15917 "\n"
15918 "layout(location=0) out vec4 x;\n"
15919 "void main(){\n"
15920 " x = vec4(1);\n"
15921 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015922
15923 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15924 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15925
15926 VkPipelineObj pipe(m_device);
15927 pipe.AddShader(&vs);
15928 pipe.AddShader(&fs);
15929
15930 /* set up CB 0; type is UNORM by default */
15931 pipe.AddColorAttachment();
15932 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15933
15934 VkDescriptorSetObj descriptorSet(m_device);
15935 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15936
15937 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15938
15939 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015940 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015941}
15942
Chris Forbes3fb17902016-08-22 14:57:55 +120015943TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015944 TEST_DESCRIPTION(
15945 "Test that an error is produced for a shader consuming an input attachment "
15946 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15948 "consumes input attachment index 0 but not provided in subpass");
15949
Tony Barbour1fa09702017-03-16 12:09:08 -060015950 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015951
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015952 char const *vsSource =
15953 "#version 450\n"
15954 "\n"
15955 "out gl_PerVertex {\n"
15956 " vec4 gl_Position;\n"
15957 "};\n"
15958 "void main(){\n"
15959 " gl_Position = vec4(1);\n"
15960 "}\n";
15961 char const *fsSource =
15962 "#version 450\n"
15963 "\n"
15964 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15965 "layout(location=0) out vec4 color;\n"
15966 "void main() {\n"
15967 " color = subpassLoad(x);\n"
15968 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015969
15970 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15971 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15972
15973 VkPipelineObj pipe(m_device);
15974 pipe.AddShader(&vs);
15975 pipe.AddShader(&fs);
15976 pipe.AddColorAttachment();
15977 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15978
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015979 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15980 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015981 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015982 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015983 ASSERT_VK_SUCCESS(err);
15984
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015985 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015986 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015987 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015988 ASSERT_VK_SUCCESS(err);
15989
15990 // error here.
15991 pipe.CreateVKPipeline(pl, renderPass());
15992
15993 m_errorMonitor->VerifyFound();
15994
15995 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15996 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15997}
15998
Chris Forbes5a9a0472016-08-22 16:02:09 +120015999TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016000 TEST_DESCRIPTION(
16001 "Test that an error is produced for a shader consuming an input attachment "
16002 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120016003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16004 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
16005
Tony Barbour1fa09702017-03-16 12:09:08 -060016006 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120016007
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016008 char const *vsSource =
16009 "#version 450\n"
16010 "\n"
16011 "out gl_PerVertex {\n"
16012 " vec4 gl_Position;\n"
16013 "};\n"
16014 "void main(){\n"
16015 " gl_Position = vec4(1);\n"
16016 "}\n";
16017 char const *fsSource =
16018 "#version 450\n"
16019 "\n"
16020 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
16021 "layout(location=0) out vec4 color;\n"
16022 "void main() {\n"
16023 " color = subpassLoad(x);\n"
16024 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120016025
16026 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16027 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16028
16029 VkPipelineObj pipe(m_device);
16030 pipe.AddShader(&vs);
16031 pipe.AddShader(&fs);
16032 pipe.AddColorAttachment();
16033 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16034
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016035 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16036 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016037 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016038 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016039 ASSERT_VK_SUCCESS(err);
16040
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016041 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016042 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016043 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120016044 ASSERT_VK_SUCCESS(err);
16045
16046 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016047 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16048 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16049 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
16050 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
16051 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 +120016052 };
16053 VkAttachmentReference color = {
16054 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
16055 };
16056 VkAttachmentReference input = {
16057 1, VK_IMAGE_LAYOUT_GENERAL,
16058 };
16059
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016060 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016061
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016062 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120016063 VkRenderPass rp;
16064 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
16065 ASSERT_VK_SUCCESS(err);
16066
16067 // error here.
16068 pipe.CreateVKPipeline(pl, rp);
16069
16070 m_errorMonitor->VerifyFound();
16071
16072 vkDestroyRenderPass(m_device->device(), rp, nullptr);
16073 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16074 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16075}
16076
Chris Forbes541f7b02016-08-22 15:30:27 +120016077TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016078 TEST_DESCRIPTION(
16079 "Test that an error is produced for a shader consuming an input attachment "
16080 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120016081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070016082 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120016083
Tony Barbour1fa09702017-03-16 12:09:08 -060016084 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120016085
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016086 char const *vsSource =
16087 "#version 450\n"
16088 "\n"
16089 "out gl_PerVertex {\n"
16090 " vec4 gl_Position;\n"
16091 "};\n"
16092 "void main(){\n"
16093 " gl_Position = vec4(1);\n"
16094 "}\n";
16095 char const *fsSource =
16096 "#version 450\n"
16097 "\n"
16098 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
16099 "layout(location=0) out vec4 color;\n"
16100 "void main() {\n"
16101 " color = subpassLoad(xs[0]);\n"
16102 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120016103
16104 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16105 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16106
16107 VkPipelineObj pipe(m_device);
16108 pipe.AddShader(&vs);
16109 pipe.AddShader(&fs);
16110 pipe.AddColorAttachment();
16111 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16112
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016113 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
16114 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120016115 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016116 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016117 ASSERT_VK_SUCCESS(err);
16118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016119 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120016120 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016121 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120016122 ASSERT_VK_SUCCESS(err);
16123
16124 // error here.
16125 pipe.CreateVKPipeline(pl, renderPass());
16126
16127 m_errorMonitor->VerifyFound();
16128
16129 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16130 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16131}
16132
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016133TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016134 TEST_DESCRIPTION(
16135 "Test that an error is produced for a compute pipeline consuming a "
16136 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016138
Tony Barbour1fa09702017-03-16 12:09:08 -060016139 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016140
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016141 char const *csSource =
16142 "#version 450\n"
16143 "\n"
16144 "layout(local_size_x=1) in;\n"
16145 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16146 "void main(){\n"
16147 " x = vec4(1);\n"
16148 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016149
16150 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16151
16152 VkDescriptorSetObj descriptorSet(m_device);
16153 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16154
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016155 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16156 nullptr,
16157 0,
16158 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16159 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16160 descriptorSet.GetPipelineLayout(),
16161 VK_NULL_HANDLE,
16162 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016163
16164 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016165 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120016166
16167 m_errorMonitor->VerifyFound();
16168
16169 if (err == VK_SUCCESS) {
16170 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16171 }
16172}
16173
Chris Forbes22a9b092016-07-19 14:34:05 +120016174TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016175 TEST_DESCRIPTION(
16176 "Test that an error is produced for a pipeline consuming a "
16177 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16179 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120016180
Tony Barbour1fa09702017-03-16 12:09:08 -060016181 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120016182
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016183 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
16184 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120016185 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016186 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016187 ASSERT_VK_SUCCESS(err);
16188
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016189 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120016190 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016191 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120016192 ASSERT_VK_SUCCESS(err);
16193
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016194 char const *csSource =
16195 "#version 450\n"
16196 "\n"
16197 "layout(local_size_x=1) in;\n"
16198 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
16199 "void main() {\n"
16200 " x.x = 1.0f;\n"
16201 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120016202 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
16203
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016204 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
16205 nullptr,
16206 0,
16207 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
16208 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
16209 pl,
16210 VK_NULL_HANDLE,
16211 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120016212
16213 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016214 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120016215
16216 m_errorMonitor->VerifyFound();
16217
16218 if (err == VK_SUCCESS) {
16219 vkDestroyPipeline(m_device->device(), pipe, nullptr);
16220 }
16221
16222 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
16223 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
16224}
16225
Chris Forbes50020592016-07-27 13:52:41 +120016226TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016227 TEST_DESCRIPTION(
16228 "Test that an error is produced when an image view type "
16229 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120016230
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016231 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 +120016232
Tony Barbour1fa09702017-03-16 12:09:08 -060016233 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120016234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16235
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016236 char const *vsSource =
16237 "#version 450\n"
16238 "\n"
16239 "out gl_PerVertex { vec4 gl_Position; };\n"
16240 "void main() { gl_Position = vec4(0); }\n";
16241 char const *fsSource =
16242 "#version 450\n"
16243 "\n"
16244 "layout(set=0, binding=0) uniform sampler3D s;\n"
16245 "layout(location=0) out vec4 color;\n"
16246 "void main() {\n"
16247 " color = texture(s, vec3(0));\n"
16248 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120016249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16251
16252 VkPipelineObj pipe(m_device);
16253 pipe.AddShader(&vs);
16254 pipe.AddShader(&fs);
16255 pipe.AddColorAttachment();
16256
16257 VkTextureObj texture(m_device, nullptr);
16258 VkSamplerObj sampler(m_device);
16259
16260 VkDescriptorSetObj descriptorSet(m_device);
16261 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16262 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16263
16264 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16265 ASSERT_VK_SUCCESS(err);
16266
Tony Barbour552f6c02016-12-21 14:34:07 -070016267 m_commandBuffer->BeginCommandBuffer();
16268 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120016269
16270 m_commandBuffer->BindPipeline(pipe);
16271 m_commandBuffer->BindDescriptorSet(descriptorSet);
16272
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016273 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120016274 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016275 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120016276 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16277
16278 // error produced here.
16279 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16280
16281 m_errorMonitor->VerifyFound();
16282
Tony Barbour552f6c02016-12-21 14:34:07 -070016283 m_commandBuffer->EndRenderPass();
16284 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120016285}
16286
Chris Forbes5533bfc2016-07-27 14:12:34 +120016287TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016288 TEST_DESCRIPTION(
16289 "Test that an error is produced when a multisampled images "
16290 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016291
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120016293
Tony Barbour1fa09702017-03-16 12:09:08 -060016294 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120016295 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16296
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016297 char const *vsSource =
16298 "#version 450\n"
16299 "\n"
16300 "out gl_PerVertex { vec4 gl_Position; };\n"
16301 "void main() { gl_Position = vec4(0); }\n";
16302 char const *fsSource =
16303 "#version 450\n"
16304 "\n"
16305 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
16306 "layout(location=0) out vec4 color;\n"
16307 "void main() {\n"
16308 " color = texelFetch(s, ivec2(0), 0);\n"
16309 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120016310 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
16311 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
16312
16313 VkPipelineObj pipe(m_device);
16314 pipe.AddShader(&vs);
16315 pipe.AddShader(&fs);
16316 pipe.AddColorAttachment();
16317
16318 VkTextureObj texture(m_device, nullptr);
16319 VkSamplerObj sampler(m_device);
16320
16321 VkDescriptorSetObj descriptorSet(m_device);
16322 descriptorSet.AppendSamplerTexture(&sampler, &texture);
16323 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
16324
16325 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
16326 ASSERT_VK_SUCCESS(err);
16327
Tony Barbour552f6c02016-12-21 14:34:07 -070016328 m_commandBuffer->BeginCommandBuffer();
16329 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120016330
16331 m_commandBuffer->BindPipeline(pipe);
16332 m_commandBuffer->BindDescriptorSet(descriptorSet);
16333
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016334 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016335 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016336 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120016337 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
16338
16339 // error produced here.
16340 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
16341
16342 m_errorMonitor->VerifyFound();
16343
Tony Barbour552f6c02016-12-21 14:34:07 -070016344 m_commandBuffer->EndRenderPass();
16345 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120016346}
16347
Mark Youngc48c4c12016-04-11 14:26:49 -060016348TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016349 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016350
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016351 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16352 {
16353 VkFormatProperties properties;
16354 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16355 if (properties.optimalTilingFeatures == 0) {
16356 printf(" Image format not supported; skipped.\n");
16357 return;
16358 }
16359 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016360
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016361 VkImageCreateInfo info = {};
16362 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16363 info.pNext = NULL;
16364 info.imageType = VK_IMAGE_TYPE_2D;
16365 info.format = format;
16366 info.extent.height = 32;
16367 info.extent.depth = 1;
16368 info.mipLevels = 1;
16369 info.arrayLayers = 1;
16370 info.samples = VK_SAMPLE_COUNT_1_BIT;
16371 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16372 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16373 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016374
16375 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016376 {
16377 VkImageFormatProperties properties;
16378 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
16379 info.tiling, info.usage, info.flags, &properties);
16380 ASSERT_VK_SUCCESS(result);
16381 info.extent.width = properties.maxExtent.width + 1;
16382 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016383
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016384 VkImage image;
16385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
16386 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016387 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060016388}
16389
Mark Youngc48c4c12016-04-11 14:26:49 -060016390TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016391 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060016392
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016393 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16394 {
16395 VkFormatProperties properties;
16396 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16397 if (properties.optimalTilingFeatures == 0) {
16398 printf(" Image format not supported; skipped.\n");
16399 return;
16400 }
16401 }
Mark Youngc48c4c12016-04-11 14:26:49 -060016402
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016403 VkImageCreateInfo info = {};
16404 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16405 info.pNext = NULL;
16406 info.imageType = VK_IMAGE_TYPE_2D;
16407 info.format = format;
16408 info.extent.height = 32;
16409 info.extent.depth = 1;
16410 info.mipLevels = 1;
16411 info.arrayLayers = 1;
16412 info.samples = VK_SAMPLE_COUNT_1_BIT;
16413 info.tiling = VK_IMAGE_TILING_OPTIMAL;
16414 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16415 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016416
16417 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016418 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060016419
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016420 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060016421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016422 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
16423 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060016424 m_errorMonitor->VerifyFound();
16425}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070016426
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016427TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016428 TEST_DESCRIPTION(
16429 "Create a render pass with an attachment description "
16430 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016431
Tony Barbour1fa09702017-03-16 12:09:08 -060016432 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016433 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
16434
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070016435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060016436
16437 VkAttachmentReference color_attach = {};
16438 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
16439 color_attach.attachment = 0;
16440 VkSubpassDescription subpass = {};
16441 subpass.colorAttachmentCount = 1;
16442 subpass.pColorAttachments = &color_attach;
16443
16444 VkRenderPassCreateInfo rpci = {};
16445 rpci.subpassCount = 1;
16446 rpci.pSubpasses = &subpass;
16447 rpci.attachmentCount = 1;
16448 VkAttachmentDescription attach_desc = {};
16449 attach_desc.format = VK_FORMAT_UNDEFINED;
16450 rpci.pAttachments = &attach_desc;
16451 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
16452 VkRenderPass rp;
16453 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
16454
16455 m_errorMonitor->VerifyFound();
16456
16457 if (result == VK_SUCCESS) {
16458 vkDestroyRenderPass(m_device->device(), rp, NULL);
16459 }
16460}
16461
Karl Schultz6addd812016-02-02 17:17:23 -070016462TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060016463 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060016464
Mike Stroyana3082432015-09-25 13:39:21 -060016465 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070016466 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16467 const int32_t tex_width = 32;
16468 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060016469
16470 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016471 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16472 image_create_info.pNext = NULL;
16473 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16474 image_create_info.format = tex_format;
16475 image_create_info.extent.width = tex_width;
16476 image_create_info.extent.height = tex_height;
16477 image_create_info.extent.depth = 1;
16478 image_create_info.mipLevels = 1;
16479 image_create_info.arrayLayers = 1;
16480 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16481 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16482 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16483 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060016484
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016485 VkImage image;
16486 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060016487 ASSERT_VK_SUCCESS(err);
16488
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016489 VkMemoryRequirements requirements;
16490 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
16491
16492 VkMemoryAllocateInfo alloc_info{};
16493 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16494 alloc_info.pNext = NULL;
16495 alloc_info.memoryTypeIndex = 0;
16496 alloc_info.allocationSize = requirements.size;
16497 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16498 ASSERT_TRUE(pass);
16499
16500 VkDeviceMemory memory;
16501 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16502 ASSERT_VK_SUCCESS(err);
16503
16504 err = vkBindImageMemory(m_device->device(), image, memory, 0);
16505
Tobin Ehliscde08892015-09-22 10:11:37 -060016506 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016507 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070016508 image_view_create_info.image = image;
16509 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16510 image_view_create_info.format = tex_format;
16511 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016512 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070016513 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016514 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060016515
16516 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016518 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016519 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070016520
16521 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060016522 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060016523}
Mike Stroyana3082432015-09-25 13:39:21 -060016524
Mark Youngd339ba32016-05-30 13:28:35 -060016525TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
16526 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060016527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060016528 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060016529
Tony Barbour1fa09702017-03-16 12:09:08 -060016530 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060016531
16532 // Create an image and try to create a view with no memory backing the image
16533 VkImage image;
16534
16535 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
16536 const int32_t tex_width = 32;
16537 const int32_t tex_height = 32;
16538
16539 VkImageCreateInfo image_create_info = {};
16540 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16541 image_create_info.pNext = NULL;
16542 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16543 image_create_info.format = tex_format;
16544 image_create_info.extent.width = tex_width;
16545 image_create_info.extent.height = tex_height;
16546 image_create_info.extent.depth = 1;
16547 image_create_info.mipLevels = 1;
16548 image_create_info.arrayLayers = 1;
16549 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16550 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16551 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
16552 image_create_info.flags = 0;
16553
16554 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
16555 ASSERT_VK_SUCCESS(err);
16556
16557 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130016558 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060016559 image_view_create_info.image = image;
16560 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16561 image_view_create_info.format = tex_format;
16562 image_view_create_info.subresourceRange.layerCount = 1;
16563 image_view_create_info.subresourceRange.baseMipLevel = 0;
16564 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016565 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060016566
16567 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016568 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060016569
16570 m_errorMonitor->VerifyFound();
16571 vkDestroyImage(m_device->device(), image, NULL);
16572 // If last error is success, it still created the view, so delete it.
16573 if (err == VK_SUCCESS) {
16574 vkDestroyImageView(m_device->device(), view, NULL);
16575 }
Mark Youngd339ba32016-05-30 13:28:35 -060016576}
16577
Karl Schultz6addd812016-02-02 17:17:23 -070016578TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016579 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016581
Tony Barbour1fa09702017-03-16 12:09:08 -060016582 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016583
Karl Schultz6addd812016-02-02 17:17:23 -070016584 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016585 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016586 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016587 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016588
16589 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016590 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016591 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070016592 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
16593 image_view_create_info.format = tex_format;
16594 image_view_create_info.subresourceRange.baseMipLevel = 0;
16595 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016596 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070016597 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016598 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016599
16600 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060016601 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016602
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016603 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060016604}
16605
Mike Weiblena1e13f42017-02-09 21:25:59 -070016606TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
16607 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
16608
Tony Barbour1fa09702017-03-16 12:09:08 -060016609 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070016610 VkSubresourceLayout subres_layout = {};
16611
16612 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
16613 {
16614 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
16615 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016616 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016617 ASSERT_TRUE(img.initialized());
16618
16619 VkImageSubresource subres = {};
16620 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16621 subres.mipLevel = 0;
16622 subres.arrayLayer = 0;
16623
16624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
16625 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16626 m_errorMonitor->VerifyFound();
16627 }
16628
16629 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
16630 {
16631 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016632 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016633 ASSERT_TRUE(img.initialized());
16634
16635 VkImageSubresource subres = {};
16636 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16637 subres.mipLevel = 0;
16638 subres.arrayLayer = 0;
16639
16640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16642 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16643 m_errorMonitor->VerifyFound();
16644 }
16645
16646 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16647 {
16648 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016649 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016650 ASSERT_TRUE(img.initialized());
16651
16652 VkImageSubresource subres = {};
16653 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16654 subres.mipLevel = 1; // ERROR: triggers VU 00739
16655 subres.arrayLayer = 0;
16656
16657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16658 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16659 m_errorMonitor->VerifyFound();
16660 }
16661
16662 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16663 {
16664 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016665 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016666 ASSERT_TRUE(img.initialized());
16667
16668 VkImageSubresource subres = {};
16669 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16670 subres.mipLevel = 0;
16671 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16672
16673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16674 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16675 m_errorMonitor->VerifyFound();
16676 }
16677}
16678
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016679TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016680 VkResult err;
16681 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016682
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016684
Tony Barbour1fa09702017-03-16 12:09:08 -060016685 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016686
16687 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016688 VkImage srcImage;
16689 VkImage dstImage;
16690 VkDeviceMemory srcMem;
16691 VkDeviceMemory destMem;
16692 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016693
16694 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016695 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16696 image_create_info.pNext = NULL;
16697 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16698 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16699 image_create_info.extent.width = 32;
16700 image_create_info.extent.height = 32;
16701 image_create_info.extent.depth = 1;
16702 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016703 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016704 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16705 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16706 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16707 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016708
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016709 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016710 ASSERT_VK_SUCCESS(err);
16711
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016712 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016713 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016714 ASSERT_VK_SUCCESS(err);
16715
16716 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016717 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016718 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16719 memAlloc.pNext = NULL;
16720 memAlloc.allocationSize = 0;
16721 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016722
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016723 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016724 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016725 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016726 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016727 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016728 ASSERT_VK_SUCCESS(err);
16729
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016730 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016731 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016732 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016733 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016734 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016735 ASSERT_VK_SUCCESS(err);
16736
16737 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16738 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016739 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016740 ASSERT_VK_SUCCESS(err);
16741
Tony Barbour552f6c02016-12-21 14:34:07 -070016742 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016743 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016744 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016745 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016746 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016747 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016748 copyRegion.srcOffset.x = 0;
16749 copyRegion.srcOffset.y = 0;
16750 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016751 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016752 copyRegion.dstSubresource.mipLevel = 0;
16753 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016754 // Introduce failure by forcing the dst layerCount to differ from src
16755 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016756 copyRegion.dstOffset.x = 0;
16757 copyRegion.dstOffset.y = 0;
16758 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016759 copyRegion.extent.width = 1;
16760 copyRegion.extent.height = 1;
16761 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016762 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016763 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016764
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016765 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016766
Chia-I Wuf7458c52015-10-26 21:10:41 +080016767 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016768 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016769 vkFreeMemory(m_device->device(), srcMem, NULL);
16770 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016771}
16772
Tony Barbourd6673642016-05-05 14:46:39 -060016773TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016774 TEST_DESCRIPTION("Creating images with unsuported formats ");
16775
Tony Barbour1fa09702017-03-16 12:09:08 -060016776 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016777 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016778
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016779 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016780 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016781 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016782 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16783 image_create_info.format = VK_FORMAT_UNDEFINED;
16784 image_create_info.extent.width = 32;
16785 image_create_info.extent.height = 32;
16786 image_create_info.extent.depth = 1;
16787 image_create_info.mipLevels = 1;
16788 image_create_info.arrayLayers = 1;
16789 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16790 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16791 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016792
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16794 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016795
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016796 VkImage image;
16797 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016798 m_errorMonitor->VerifyFound();
16799
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016800 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016801 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016802 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16803 VkFormat format = static_cast<VkFormat>(f);
16804 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016805 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016806 unsupported = format;
16807 break;
16808 }
16809 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016810
Tony Barbourd6673642016-05-05 14:46:39 -060016811 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016812 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016814
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016815 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016816 m_errorMonitor->VerifyFound();
16817 }
16818}
16819
16820TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016821 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16822
Tony Barbour1fa09702017-03-16 12:09:08 -060016823 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016824 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016825 if (!depth_format) {
16826 return;
16827 }
Tony Barbourd6673642016-05-05 14:46:39 -060016828
16829 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016830 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060016831 VK_IMAGE_TILING_OPTIMAL, 0);
16832 ASSERT_TRUE(image.initialized());
16833
16834 VkImageView imgView;
16835 VkImageViewCreateInfo imgViewInfo = {};
16836 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16837 imgViewInfo.image = image.handle();
16838 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16839 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16840 imgViewInfo.subresourceRange.layerCount = 1;
16841 imgViewInfo.subresourceRange.baseMipLevel = 0;
16842 imgViewInfo.subresourceRange.levelCount = 1;
16843 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16844
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016845 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016846 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016848 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16849 m_errorMonitor->VerifyFound();
16850 imgViewInfo.subresourceRange.baseMipLevel = 0;
16851
Tony Barbourd6673642016-05-05 14:46:39 -060016852 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16853 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016855 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16856 m_errorMonitor->VerifyFound();
16857 imgViewInfo.subresourceRange.levelCount = 1;
16858
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016859 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16860 imgViewInfo.subresourceRange.levelCount = 2;
16861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16862 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16863 m_errorMonitor->VerifyFound();
16864 imgViewInfo.subresourceRange.levelCount = 1;
16865
16866 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16867 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16869 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16870 m_errorMonitor->VerifyFound();
16871 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16872
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016873 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16874 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016875 m_errorMonitor->SetDesiredFailureMsg(
16876 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16877 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016878 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16879 m_errorMonitor->VerifyFound();
16880 imgViewInfo.subresourceRange.layerCount = 1;
16881
Tony Barbourd6673642016-05-05 14:46:39 -060016882 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016883 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016884 m_errorMonitor->SetDesiredFailureMsg(
16885 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16886 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016887 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16888 m_errorMonitor->VerifyFound();
16889 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16890
Tony Barbourd6673642016-05-05 14:46:39 -060016891 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16892 // VIEW_CREATE_ERROR
16893 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016895 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16896 m_errorMonitor->VerifyFound();
16897 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16898
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016899 // TODO: Update framework to easily passing mutable flag into ImageObj init
16900 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016901 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16902 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16903 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016904 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16905 // VIEW_CREATE_ERROR
16906 VkImageCreateInfo mutImgInfo = image.create_info();
16907 VkImage mutImage;
16908 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016909 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016910 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16911 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016912 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016913 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016914
16915 VkMemoryRequirements requirements;
16916 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16917
16918 VkMemoryAllocateInfo alloc_info{};
16919 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16920 alloc_info.pNext = NULL;
16921 alloc_info.memoryTypeIndex = 0;
16922 alloc_info.allocationSize = requirements.size;
16923 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16924 ASSERT_TRUE(pass);
16925
16926 VkDeviceMemory memory;
16927 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16928 ASSERT_VK_SUCCESS(ret);
16929
16930 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16931 ASSERT_VK_SUCCESS(ret);
16932
Tony Barbourd6673642016-05-05 14:46:39 -060016933 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016935 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16936 m_errorMonitor->VerifyFound();
16937 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016938
16939 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016940 vkDestroyImage(m_device->handle(), mutImage, NULL);
16941}
16942
Dave Houlton75967fc2017-03-06 17:21:16 -070016943TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16944 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16945
Tony Barbour1fa09702017-03-16 12:09:08 -060016946 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016947
Jamie Madill35127872017-03-15 16:17:46 -040016948 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016949 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16950 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16951 if (device_features.textureCompressionBC) {
16952 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16953 } else if (device_features.textureCompressionETC2) {
16954 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16955 } else if (device_features.textureCompressionASTC_LDR) {
16956 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16957 } else {
16958 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16959 return;
16960 }
16961
16962 VkImageCreateInfo ci;
16963 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16964 ci.pNext = NULL;
16965 ci.flags = 0;
16966 ci.imageType = VK_IMAGE_TYPE_2D;
16967 ci.format = compressed_format;
16968 ci.extent = {32, 32, 1};
16969 ci.mipLevels = 6;
16970 ci.arrayLayers = 1;
16971 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16972 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16973 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16974 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16975 ci.queueFamilyIndexCount = 0;
16976 ci.pQueueFamilyIndices = NULL;
16977 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16978
16979 VkImageObj image(m_device);
16980 image.init(&ci);
16981 ASSERT_TRUE(image.initialized());
16982
16983 VkImageObj odd_image(m_device);
16984 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16985 odd_image.init(&ci);
16986 ASSERT_TRUE(odd_image.initialized());
16987
16988 // Allocate buffers
16989 VkMemoryPropertyFlags reqs = 0;
16990 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16991 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16992 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16993 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16994 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16995
16996 VkBufferImageCopy region = {};
16997 region.bufferRowLength = 0;
16998 region.bufferImageHeight = 0;
16999 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17000 region.imageSubresource.layerCount = 1;
17001 region.imageOffset = {0, 0, 0};
17002 region.bufferOffset = 0;
17003
17004 // start recording
17005 m_commandBuffer->BeginCommandBuffer();
17006
17007 // Mip level copies that work - 5 levels
17008 m_errorMonitor->ExpectSuccess();
17009
17010 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
17011 region.imageExtent = {32, 32, 1};
17012 region.imageSubresource.mipLevel = 0;
17013 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
17014 &region);
17015 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17016 &region);
17017
17018 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
17019 region.imageExtent = {8, 8, 1};
17020 region.imageSubresource.mipLevel = 2;
17021 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
17022 &region);
17023 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17024 &region);
17025
17026 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
17027 region.imageExtent = {4, 4, 1};
17028 region.imageSubresource.mipLevel = 3;
17029 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17030 &region);
17031 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17032 &region);
17033
17034 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
17035 region.imageExtent = {2, 2, 1};
17036 region.imageSubresource.mipLevel = 4;
17037 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17038 &region);
17039 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17040 &region);
17041
17042 region.imageExtent = {1, 1, 1};
17043 region.imageSubresource.mipLevel = 5;
17044 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17045 &region);
17046 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17047 &region);
17048 m_errorMonitor->VerifyNotFound();
17049
17050 // Buffer must accomodate a full compressed block, regardless of texel count
17051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17052 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
17053 &region);
17054 m_errorMonitor->VerifyFound();
17055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
17056 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17057 &region);
17058 m_errorMonitor->VerifyFound();
17059
17060 // Copy width < compressed block size, but not the full mip width
17061 region.imageExtent = {1, 2, 1};
17062 region.imageSubresource.mipLevel = 4;
17063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17064 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17065 &region);
17066 m_errorMonitor->VerifyFound();
17067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17068 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17069 &region);
17070 m_errorMonitor->VerifyFound();
17071
17072 // Copy height < compressed block size but not the full mip height
17073 region.imageExtent = {2, 1, 1};
17074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17075 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17076 &region);
17077 m_errorMonitor->VerifyFound();
17078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17079 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17080 &region);
17081 m_errorMonitor->VerifyFound();
17082
17083 // Offsets must be multiple of compressed block size
17084 region.imageOffset = {1, 1, 0};
17085 region.imageExtent = {1, 1, 1};
17086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17087 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17088 &region);
17089 m_errorMonitor->VerifyFound();
17090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
17091 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17092 &region);
17093 m_errorMonitor->VerifyFound();
17094
17095 // Offset + extent width = mip width - should succeed
17096 region.imageOffset = {4, 4, 0};
17097 region.imageExtent = {3, 4, 1};
17098 region.imageSubresource.mipLevel = 2;
17099 m_errorMonitor->ExpectSuccess();
17100 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17101 &region);
17102 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17103 &region);
17104 m_errorMonitor->VerifyNotFound();
17105
17106 // Offset + extent width > mip width, but still within the final compressed block - should succeed
17107 region.imageExtent = {4, 4, 1};
17108 m_errorMonitor->ExpectSuccess();
17109 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17110 &region);
17111 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17112 &region);
17113 m_errorMonitor->VerifyNotFound();
17114
17115 // Offset + extent width < mip width and not a multiple of block width - should fail
17116 region.imageExtent = {3, 3, 1};
17117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17118 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
17119 &region);
17120 m_errorMonitor->VerifyFound();
17121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
17122 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17123 &region);
17124 m_errorMonitor->VerifyFound();
17125}
17126
Dave Houlton59a20702017-02-02 17:26:23 -070017127TEST_F(VkLayerTest, ImageBufferCopyTests) {
17128 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
17129
Tony Barbour1fa09702017-03-16 12:09:08 -060017130 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017131 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
17132 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
17133 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
17134 return;
17135 }
Dave Houlton584d51e2017-02-16 12:52:54 -070017136
17137 // Bail if any dimension of transfer granularity is 0.
17138 auto index = m_device->graphics_queue_node_index_;
17139 auto queue_family_properties = m_device->phy().queue_properties();
17140 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
17141 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
17142 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
17143 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
17144 return;
17145 }
17146
Dave Houlton59a20702017-02-02 17:26:23 -070017147 VkImageObj image_64k(m_device); // 128^2 texels, 64k
17148 VkImageObj image_16k(m_device); // 64^2 texels, 16k
17149 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070017150 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
17151 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
17152 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
17153 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
17154
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017155 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017156 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17157 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017158 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070017159 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17160 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017161 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Dave Houlton59a20702017-02-02 17:26:23 -070017162 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070017163 ASSERT_TRUE(image_64k.initialized());
17164 ASSERT_TRUE(image_16k.initialized());
17165 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017166
Dave Houltonf3229d52017-02-21 15:59:08 -070017167 // Verify all needed Depth/Stencil formats are supported
17168 bool missing_ds_support = false;
17169 VkFormatProperties props = {0, 0, 0};
17170 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
17171 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17172 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
17173 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17174 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
17175 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17176 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
17177 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
17178
17179 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017180 ds_image_4D_1S.Init(
17181 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017182 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17183 VK_IMAGE_TILING_OPTIMAL, 0);
17184 ASSERT_TRUE(ds_image_4D_1S.initialized());
17185
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017186 ds_image_3D_1S.Init(
17187 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070017188 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17189 VK_IMAGE_TILING_OPTIMAL, 0);
17190 ASSERT_TRUE(ds_image_3D_1S.initialized());
17191
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017192 ds_image_2D.Init(
17193 256, 256, 1, VK_FORMAT_D16_UNORM,
17194 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17195 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017196 ASSERT_TRUE(ds_image_2D.initialized());
17197
Dave Houlton11dcd5e2017-04-25 16:00:10 -060017198 ds_image_1S.Init(
17199 256, 256, 1, VK_FORMAT_S8_UINT,
17200 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
17201 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070017202 ASSERT_TRUE(ds_image_1S.initialized());
17203 }
17204
17205 // Allocate buffers
17206 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070017207 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070017208 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
17209 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
17210 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
17211 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070017212
17213 VkBufferImageCopy region = {};
17214 region.bufferRowLength = 0;
17215 region.bufferImageHeight = 0;
17216 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17217 region.imageSubresource.layerCount = 1;
17218 region.imageOffset = {0, 0, 0};
17219 region.imageExtent = {64, 64, 1};
17220 region.bufferOffset = 0;
17221
17222 // attempt copies before putting command buffer in recording state
17223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
17224 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17225 &region);
17226 m_errorMonitor->VerifyFound();
17227
17228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
17229 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17230 &region);
17231 m_errorMonitor->VerifyFound();
17232
17233 // start recording
17234 m_commandBuffer->BeginCommandBuffer();
17235
17236 // successful copies
17237 m_errorMonitor->ExpectSuccess();
17238 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17239 &region);
17240 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17241 &region);
17242 region.imageOffset.x = 16; // 16k copy, offset requires larger image
17243 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17244 &region);
17245 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
17246 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17247 &region);
17248 region.imageOffset.x = 0;
17249 region.imageExtent.height = 64;
17250 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
17251 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17252 &region);
17253 m_errorMonitor->VerifyNotFound();
17254
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017255 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070017256 region.imageExtent = {65, 64, 1};
17257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17258 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17259 &region);
17260 m_errorMonitor->VerifyFound();
17261
17262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17263 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17264 &region);
17265 m_errorMonitor->VerifyFound();
17266
17267 // image/buffer too small (offset) on copy to image
17268 region.imageExtent = {64, 64, 1};
17269 region.imageOffset = {0, 4, 0};
17270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
17271 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17272 &region);
17273 m_errorMonitor->VerifyFound();
17274
17275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
17276 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
17277 &region);
17278 m_errorMonitor->VerifyFound();
17279
17280 // image/buffer too small on copy to buffer
17281 region.imageExtent = {64, 64, 1};
17282 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070017283 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
17285 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17286 &region);
17287 m_errorMonitor->VerifyFound();
17288
17289 region.imageExtent = {64, 65, 1};
17290 region.bufferOffset = 0;
17291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
17292 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
17293 &region);
17294 m_errorMonitor->VerifyFound();
17295
17296 // buffer size ok but rowlength causes loose packing
17297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17298 region.imageExtent = {64, 64, 1};
17299 region.bufferRowLength = 68;
17300 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17301 &region);
17302 m_errorMonitor->VerifyFound();
17303
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017304 // An extent with zero area should produce a warning, but no error
17305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
17306 region.imageExtent.width = 0;
17307 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17308 &region);
17309 m_errorMonitor->VerifyFound();
17310
Dave Houlton59a20702017-02-02 17:26:23 -070017311 // aspect bits
17312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
17313 region.imageExtent = {64, 64, 1};
17314 region.bufferRowLength = 0;
17315 region.bufferImageHeight = 0;
17316 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
17317 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17318 buffer_16k.handle(), 1, &region);
17319 m_errorMonitor->VerifyFound();
17320
17321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
17322 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17323 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
17324 &region);
17325 m_errorMonitor->VerifyFound();
17326
17327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
17328 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17329 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
17330 buffer_16k.handle(), 1, &region);
17331 m_errorMonitor->VerifyFound();
17332
Dave Houltonf3229d52017-02-21 15:59:08 -070017333 // Test Depth/Stencil copies
17334 if (missing_ds_support) {
17335 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
17336 } else {
17337 VkBufferImageCopy ds_region = {};
17338 ds_region.bufferOffset = 0;
17339 ds_region.bufferRowLength = 0;
17340 ds_region.bufferImageHeight = 0;
17341 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17342 ds_region.imageSubresource.mipLevel = 0;
17343 ds_region.imageSubresource.baseArrayLayer = 0;
17344 ds_region.imageSubresource.layerCount = 1;
17345 ds_region.imageOffset = {0, 0, 0};
17346 ds_region.imageExtent = {256, 256, 1};
17347
17348 // Depth copies that should succeed
17349 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
17350 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17351 buffer_256k.handle(), 1, &ds_region);
17352 m_errorMonitor->VerifyNotFound();
17353
17354 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
17355 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17356 buffer_256k.handle(), 1, &ds_region);
17357 m_errorMonitor->VerifyNotFound();
17358
17359 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
17360 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17361 buffer_128k.handle(), 1, &ds_region);
17362 m_errorMonitor->VerifyNotFound();
17363
17364 // Depth copies that should fail
17365 ds_region.bufferOffset = 4;
17366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17367 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
17368 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17369 buffer_256k.handle(), 1, &ds_region);
17370 m_errorMonitor->VerifyFound();
17371
17372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17373 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
17374 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17375 buffer_256k.handle(), 1, &ds_region);
17376 m_errorMonitor->VerifyFound();
17377
17378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17379 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
17380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17381 buffer_128k.handle(), 1, &ds_region);
17382 m_errorMonitor->VerifyFound();
17383
17384 // Stencil copies that should succeed
17385 ds_region.bufferOffset = 0;
17386 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17387 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17389 buffer_64k.handle(), 1, &ds_region);
17390 m_errorMonitor->VerifyNotFound();
17391
17392 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
17393 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17394 buffer_64k.handle(), 1, &ds_region);
17395 m_errorMonitor->VerifyNotFound();
17396
17397 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
17398 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17399 buffer_64k.handle(), 1, &ds_region);
17400 m_errorMonitor->VerifyNotFound();
17401
17402 // Stencil copies that should fail
17403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17404 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17405 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17406 buffer_16k.handle(), 1, &ds_region);
17407 m_errorMonitor->VerifyFound();
17408
17409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17410 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
17411 ds_region.bufferRowLength = 260;
17412 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17413 buffer_64k.handle(), 1, &ds_region);
17414 m_errorMonitor->VerifyFound();
17415
17416 ds_region.bufferRowLength = 0;
17417 ds_region.bufferOffset = 4;
17418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17419 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
17420 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
17421 buffer_64k.handle(), 1, &ds_region);
17422 m_errorMonitor->VerifyFound();
17423 }
17424
Dave Houlton584d51e2017-02-16 12:52:54 -070017425 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040017426 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070017427 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070017428 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
17429 device_features.textureCompressionASTC_LDR)) {
17430 printf(" No compressed formats supported - block compression tests skipped.\n");
17431 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070017432 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
17433 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070017434 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017435 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
17436 0);
17437 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
Dave Houlton67e9b532017-03-02 17:00:10 -070017438 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017439 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017440 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton584d51e2017-02-16 12:52:54 -070017441 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017442 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton67e9b532017-03-02 17:00:10 -070017443 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017444 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017445 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017446 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017447 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton67e9b532017-03-02 17:00:10 -070017448 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070017449 }
17450 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070017451
Dave Houlton584d51e2017-02-16 12:52:54 -070017452 // Just fits
17453 m_errorMonitor->ExpectSuccess();
17454 region.imageExtent = {128, 128, 1};
17455 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17456 buffer_16k.handle(), 1, &region);
17457 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017458
Dave Houlton584d51e2017-02-16 12:52:54 -070017459 // with offset, too big for buffer
17460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
17461 region.bufferOffset = 16;
17462 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17463 buffer_16k.handle(), 1, &region);
17464 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017465 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017466
Dave Houlton67e9b532017-03-02 17:00:10 -070017467 // extents that are not a multiple of compressed block size
17468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
17469 region.imageExtent.width = 66;
17470 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17471 buffer_16k.handle(), 1, &region);
17472 m_errorMonitor->VerifyFound();
17473 region.imageExtent.width = 128;
17474
17475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017476 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070017477 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17478 buffer_16k.handle(), 1, &region);
17479 m_errorMonitor->VerifyFound();
17480 region.imageExtent.height = 128;
17481
17482 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
17483
17484 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
17485 m_errorMonitor->ExpectSuccess();
17486 region.imageExtent.width = 66;
17487 region.imageOffset.x = 64;
17488 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17489 buffer_16k.handle(), 1, &region);
17490 region.imageExtent.width = 16;
17491 region.imageOffset.x = 0;
17492 region.imageExtent.height = 2;
17493 region.imageOffset.y = 128;
17494 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017495 buffer_16k.handle(), 1, &region);
17496 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070017497 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017498
Dave Houlton584d51e2017-02-16 12:52:54 -070017499 // buffer offset must be a multiple of texel block size (16)
17500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
17501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
17502 region.imageExtent = {64, 64, 1};
17503 region.bufferOffset = 24;
17504 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17505 buffer_16k.handle(), 1, &region);
17506 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017507
Dave Houlton584d51e2017-02-16 12:52:54 -070017508 // rowlength not a multiple of block width (4)
17509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
17510 region.bufferOffset = 0;
17511 region.bufferRowLength = 130;
17512 region.bufferImageHeight = 0;
17513 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17514 buffer_64k.handle(), 1, &region);
17515 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070017516
Dave Houlton584d51e2017-02-16 12:52:54 -070017517 // imageheight not a multiple of block height (4)
17518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
17519 region.bufferRowLength = 0;
17520 region.bufferImageHeight = 130;
17521 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
17522 buffer_64k.handle(), 1, &region);
17523 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070017524 }
Dave Houlton59a20702017-02-02 17:26:23 -070017525}
17526
Tony Barbourd6673642016-05-05 14:46:39 -060017527TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070017528 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060017529
Tony Barbour1fa09702017-03-16 12:09:08 -060017530 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060017531
Rene Lindsay135204f2016-12-22 17:11:09 -070017532 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060017533 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017534 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017535 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060017536 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060017537 vk_testing::Buffer buffer;
17538 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070017539 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060017540 VkBufferImageCopy region = {};
17541 region.bufferRowLength = 128;
17542 region.bufferImageHeight = 128;
17543 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17544 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070017545 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017546 region.imageExtent.height = 4;
17547 region.imageExtent.width = 4;
17548 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070017549
17550 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017551 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017552 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070017553 ASSERT_TRUE(image2.initialized());
17554 vk_testing::Buffer buffer2;
17555 VkMemoryPropertyFlags reqs2 = 0;
17556 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
17557 VkBufferImageCopy region2 = {};
17558 region2.bufferRowLength = 128;
17559 region2.bufferImageHeight = 128;
17560 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17561 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
17562 region2.imageSubresource.layerCount = 1;
17563 region2.imageExtent.height = 4;
17564 region2.imageExtent.width = 4;
17565 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017566 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060017567
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017568 // Image must have offset.z of 0 and extent.depth of 1
17569 // Introduce failure by setting imageExtent.depth to 0
17570 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070017571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017572 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017573 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017574 m_errorMonitor->VerifyFound();
17575
17576 region.imageExtent.depth = 1;
17577
17578 // Image must have offset.z of 0 and extent.depth of 1
17579 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017580 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017581 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070017582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070017583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017584 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017585 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070017586 m_errorMonitor->VerifyFound();
17587
17588 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017589 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
17590 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070017591 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017593 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17594 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017595 m_errorMonitor->VerifyFound();
17596
17597 // BufferOffset must be a multiple of 4
17598 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070017599 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070017601 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
17602 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017603 m_errorMonitor->VerifyFound();
17604
17605 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
17606 region.bufferOffset = 0;
17607 region.imageExtent.height = 128;
17608 region.imageExtent.width = 128;
17609 // Introduce failure by setting bufferRowLength > 0 but less than width
17610 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017612 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17613 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017614 m_errorMonitor->VerifyFound();
17615
17616 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
17617 region.bufferRowLength = 128;
17618 // Introduce failure by setting bufferRowHeight > 0 but less than height
17619 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070017620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017621 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
17622 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060017623 m_errorMonitor->VerifyFound();
17624
17625 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060017626 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017627 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070017628 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017629 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017630 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070017631 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017632 VkImageBlit blitRegion = {};
17633 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17634 blitRegion.srcSubresource.baseArrayLayer = 0;
17635 blitRegion.srcSubresource.layerCount = 1;
17636 blitRegion.srcSubresource.mipLevel = 0;
17637 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17638 blitRegion.dstSubresource.baseArrayLayer = 0;
17639 blitRegion.dstSubresource.layerCount = 1;
17640 blitRegion.dstSubresource.mipLevel = 0;
17641
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017642 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17644 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17646 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017647 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17648 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017649 m_errorMonitor->VerifyFound();
17650
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017652 VkImageMemoryBarrier img_barrier;
17653 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17654 img_barrier.pNext = NULL;
17655 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17656 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17657 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17658 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17659 img_barrier.image = image.handle();
17660 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17661 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17662 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17663 img_barrier.subresourceRange.baseArrayLayer = 0;
17664 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017665 img_barrier.subresourceRange.layerCount = 0;
17666 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017667 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17668 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017669 m_errorMonitor->VerifyFound();
17670 img_barrier.subresourceRange.layerCount = 1;
17671}
17672
17673TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017674 TEST_DESCRIPTION("Exceed the limits of image format ");
17675
Tony Barbour1fa09702017-03-16 12:09:08 -060017676 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017677
17678 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17679 {
17680 VkFormatProperties properties;
17681 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17682 if (properties.linearTilingFeatures == 0) {
17683 printf(" Image format not supported; skipped.\n");
17684 return;
17685 }
17686 }
17687
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017689 VkImageCreateInfo image_create_info = {};
17690 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17691 image_create_info.pNext = NULL;
17692 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017693 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017694 image_create_info.extent.width = 32;
17695 image_create_info.extent.height = 32;
17696 image_create_info.extent.depth = 1;
17697 image_create_info.mipLevels = 1;
17698 image_create_info.arrayLayers = 1;
17699 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17700 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17701 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17702 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17703 image_create_info.flags = 0;
17704
17705 VkImage nullImg;
17706 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017707 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17708 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017709 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017710 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17711 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17712 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017713 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017714
Tony Barbour0907e362017-03-09 15:05:30 -070017715 uint32_t maxDim =
17716 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17717 // If max mip levels exceeds image extents, skip the max mip levels test
17718 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17720 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17721 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17722 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17723 m_errorMonitor->VerifyFound();
17724 image_create_info.mipLevels = 1;
17725 }
Tony Barbourd6673642016-05-05 14:46:39 -060017726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017728 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17729 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17730 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17731 m_errorMonitor->VerifyFound();
17732 image_create_info.arrayLayers = 1;
17733
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017735 int samples = imgFmtProps.sampleCounts >> 1;
17736 image_create_info.samples = (VkSampleCountFlagBits)samples;
17737 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17738 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17739 m_errorMonitor->VerifyFound();
17740 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17741
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17743 "pCreateInfo->initialLayout, must be "
17744 "VK_IMAGE_LAYOUT_UNDEFINED or "
17745 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017746 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17747 // Expect INVALID_LAYOUT
17748 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17749 m_errorMonitor->VerifyFound();
17750 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17751}
17752
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017753TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017754 // Image copy with source region specified greater than src image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017755 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017756
Dave Houltonfc1a4052017-04-27 14:32:45 -060017757 // Create images with full mip chain
17758 VkImageCreateInfo ci;
17759 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17760 ci.pNext = NULL;
17761 ci.flags = 0;
17762 ci.imageType = VK_IMAGE_TYPE_3D;
17763 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17764 ci.extent = {32, 32, 8};
17765 ci.mipLevels = 6;
17766 ci.arrayLayers = 1;
17767 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17768 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17769 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17770 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17771 ci.queueFamilyIndexCount = 0;
17772 ci.pQueueFamilyIndices = NULL;
17773 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17774
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017775 VkImageObj src_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017776 src_image.init(&ci);
17777 ASSERT_TRUE(src_image.initialized());
17778
17779 // Dest image with one more mip level
17780 ci.extent = {64, 64, 16};
17781 ci.mipLevels = 7;
17782 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017783 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017784 dst_image.init(&ci);
17785 ASSERT_TRUE(dst_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017786
Tony Barbour552f6c02016-12-21 14:34:07 -070017787 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017788
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017789 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017790 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017791 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017792 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017793 copy_region.srcSubresource.mipLevel = 0;
17794 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017795 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017796 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017797 copy_region.srcSubresource.layerCount = 1;
17798 copy_region.dstSubresource.layerCount = 1;
17799 copy_region.srcOffset = {0, 0, 0};
17800 copy_region.dstOffset = {0, 0, 0};
17801
17802 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017803 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17804 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017805 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017806
Dave Houltonfc1a4052017-04-27 14:32:45 -060017807 // Source exceeded in x-dim, VU 01202
17808 copy_region.srcOffset.x = 4;
17809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175); // General "contained within" VU
17810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01202);
17811 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17812 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017813 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017814
17815 // Source exceeded in y-dim, VU 01203
17816 copy_region.srcOffset.x = 0;
17817 copy_region.extent.height = 48;
17818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01203);
17820 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17821 &copy_region);
17822 m_errorMonitor->VerifyFound();
17823
17824 // Source exceeded in z-dim, VU 01204
17825 copy_region.extent = {4, 4, 4};
17826 copy_region.srcSubresource.mipLevel = 2;
17827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01204);
17829 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17830 &copy_region);
17831 m_errorMonitor->VerifyFound();
17832
17833 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017834}
17835
17836TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017837 // Image copy with dest region specified greater than dest image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017838 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017839
Dave Houltonfc1a4052017-04-27 14:32:45 -060017840 // Create images with full mip chain
17841 VkImageCreateInfo ci;
17842 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17843 ci.pNext = NULL;
17844 ci.flags = 0;
17845 ci.imageType = VK_IMAGE_TYPE_3D;
17846 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17847 ci.extent = {32, 32, 8};
17848 ci.mipLevels = 6;
17849 ci.arrayLayers = 1;
17850 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17851 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17852 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17853 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17854 ci.queueFamilyIndexCount = 0;
17855 ci.pQueueFamilyIndices = NULL;
17856 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17857
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017858 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017859 dst_image.init(&ci);
17860 ASSERT_TRUE(dst_image.initialized());
17861
17862 // Src image with one more mip level
17863 ci.extent = {64, 64, 16};
17864 ci.mipLevels = 7;
17865 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17866 VkImageObj src_image(m_device);
17867 src_image.init(&ci);
17868 ASSERT_TRUE(src_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017869
Tony Barbour552f6c02016-12-21 14:34:07 -070017870 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017871
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017872 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017873 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017874 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017875 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017876 copy_region.srcSubresource.mipLevel = 0;
17877 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017878 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017879 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017880 copy_region.srcSubresource.layerCount = 1;
17881 copy_region.dstSubresource.layerCount = 1;
17882 copy_region.srcOffset = {0, 0, 0};
17883 copy_region.dstOffset = {0, 0, 0};
17884
17885 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017886 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17887 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017888 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017889
Dave Houltonfc1a4052017-04-27 14:32:45 -060017890 // Dest exceeded in x-dim, VU 01205
17891 copy_region.dstOffset.x = 4;
17892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176); // General "contained within" VU
17893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01205);
17894 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17895 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017896 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017897
17898 // Dest exceeded in y-dim, VU 01206
17899 copy_region.dstOffset.x = 0;
17900 copy_region.extent.height = 48;
17901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01206);
17903 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17904 &copy_region);
17905 m_errorMonitor->VerifyFound();
17906
17907 // Dest exceeded in z-dim, VU 01207
17908 copy_region.extent = {4, 4, 4};
17909 copy_region.dstSubresource.mipLevel = 2;
17910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01207);
17912 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17913 &copy_region);
17914 m_errorMonitor->VerifyFound();
17915
17916 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017917}
17918
Karl Schultz6addd812016-02-02 17:17:23 -070017919TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017920 VkResult err;
17921 bool pass;
17922
17923 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017925
Tony Barbour1fa09702017-03-16 12:09:08 -060017926 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017927
17928 // Create two images of different types and try to copy between them
17929 VkImage srcImage;
17930 VkImage dstImage;
17931 VkDeviceMemory srcMem;
17932 VkDeviceMemory destMem;
17933 VkMemoryRequirements memReqs;
17934
17935 VkImageCreateInfo image_create_info = {};
17936 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17937 image_create_info.pNext = NULL;
17938 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17939 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17940 image_create_info.extent.width = 32;
17941 image_create_info.extent.height = 32;
17942 image_create_info.extent.depth = 1;
17943 image_create_info.mipLevels = 1;
17944 image_create_info.arrayLayers = 1;
17945 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17946 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17947 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17948 image_create_info.flags = 0;
17949
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017950 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017951 ASSERT_VK_SUCCESS(err);
17952
17953 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17954 // Introduce failure by creating second image with a different-sized format.
17955 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017956 VkFormatProperties properties;
17957 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17958 if (properties.optimalTilingFeatures == 0) {
17959 printf(" Image format not supported; skipped.\n");
17960 return;
17961 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017962
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017963 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017964 ASSERT_VK_SUCCESS(err);
17965
17966 // Allocate memory
17967 VkMemoryAllocateInfo memAlloc = {};
17968 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17969 memAlloc.pNext = NULL;
17970 memAlloc.allocationSize = 0;
17971 memAlloc.memoryTypeIndex = 0;
17972
17973 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17974 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017975 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017976 ASSERT_TRUE(pass);
17977 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17978 ASSERT_VK_SUCCESS(err);
17979
17980 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17981 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017982 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017983 ASSERT_TRUE(pass);
17984 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17985 ASSERT_VK_SUCCESS(err);
17986
17987 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17988 ASSERT_VK_SUCCESS(err);
17989 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17990 ASSERT_VK_SUCCESS(err);
17991
Tony Barbour552f6c02016-12-21 14:34:07 -070017992 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017993 VkImageCopy copyRegion;
17994 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17995 copyRegion.srcSubresource.mipLevel = 0;
17996 copyRegion.srcSubresource.baseArrayLayer = 0;
17997 copyRegion.srcSubresource.layerCount = 0;
17998 copyRegion.srcOffset.x = 0;
17999 copyRegion.srcOffset.y = 0;
18000 copyRegion.srcOffset.z = 0;
18001 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18002 copyRegion.dstSubresource.mipLevel = 0;
18003 copyRegion.dstSubresource.baseArrayLayer = 0;
18004 copyRegion.dstSubresource.layerCount = 0;
18005 copyRegion.dstOffset.x = 0;
18006 copyRegion.dstOffset.y = 0;
18007 copyRegion.dstOffset.z = 0;
18008 copyRegion.extent.width = 1;
18009 copyRegion.extent.height = 1;
18010 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018011 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018012 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060018013
18014 m_errorMonitor->VerifyFound();
18015
18016 vkDestroyImage(m_device->device(), srcImage, NULL);
18017 vkDestroyImage(m_device->device(), dstImage, NULL);
18018 vkFreeMemory(m_device->device(), srcMem, NULL);
18019 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018020}
18021
Karl Schultz6addd812016-02-02 17:17:23 -070018022TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
18023 VkResult err;
18024 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018025
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018026 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18028 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018029
Tony Barbour1fa09702017-03-16 12:09:08 -060018030 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018031 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018032 if (!depth_format) {
18033 return;
18034 }
Mike Stroyana3082432015-09-25 13:39:21 -060018035
18036 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018037 VkImage srcImage;
18038 VkImage dstImage;
18039 VkDeviceMemory srcMem;
18040 VkDeviceMemory destMem;
18041 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018042
18043 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018044 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18045 image_create_info.pNext = NULL;
18046 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018047 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070018048 image_create_info.extent.width = 32;
18049 image_create_info.extent.height = 32;
18050 image_create_info.extent.depth = 1;
18051 image_create_info.mipLevels = 1;
18052 image_create_info.arrayLayers = 1;
18053 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060018054 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070018055 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18056 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018057 VkFormatProperties properties;
18058 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
18059 if (properties.optimalTilingFeatures == 0) {
18060 printf(" Image format not supported; skipped.\n");
18061 return;
18062 }
Mike Stroyana3082432015-09-25 13:39:21 -060018063
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018064 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018065 ASSERT_VK_SUCCESS(err);
18066
Karl Schultzbdb75952016-04-19 11:36:49 -060018067 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18068
Mark Lobodzinskidb117632016-03-31 10:45:56 -060018069 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070018070 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070018071 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060018072 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018073
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018074 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018075 ASSERT_VK_SUCCESS(err);
18076
18077 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018078 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018079 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18080 memAlloc.pNext = NULL;
18081 memAlloc.allocationSize = 0;
18082 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018083
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018084 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018085 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018086 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018087 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018088 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018089 ASSERT_VK_SUCCESS(err);
18090
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018091 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018092 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018093 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018094 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018095 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018096 ASSERT_VK_SUCCESS(err);
18097
18098 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18099 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018100 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018101 ASSERT_VK_SUCCESS(err);
18102
Tony Barbour552f6c02016-12-21 14:34:07 -070018103 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018104 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018105 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018106 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018107 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018108 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018109 copyRegion.srcOffset.x = 0;
18110 copyRegion.srcOffset.y = 0;
18111 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018112 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018113 copyRegion.dstSubresource.mipLevel = 0;
18114 copyRegion.dstSubresource.baseArrayLayer = 0;
18115 copyRegion.dstSubresource.layerCount = 0;
18116 copyRegion.dstOffset.x = 0;
18117 copyRegion.dstOffset.y = 0;
18118 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018119 copyRegion.extent.width = 1;
18120 copyRegion.extent.height = 1;
18121 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018122 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018123 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018124
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018125 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018126
Chia-I Wuf7458c52015-10-26 21:10:41 +080018127 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018128 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018129 vkFreeMemory(m_device->device(), srcMem, NULL);
18130 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018131}
18132
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018133TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
18134 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070018135
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018136 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070018137
18138 VkImageFormatProperties image_format_properties;
18139 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
18140 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
18141 &image_format_properties);
18142
18143 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
18144 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
18145 printf(" Image multi-sample support not found; skipped.\n");
18146 return;
18147 }
18148
18149 VkImageCreateInfo ci;
18150 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18151 ci.pNext = NULL;
18152 ci.flags = 0;
18153 ci.imageType = VK_IMAGE_TYPE_2D;
18154 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
18155 ci.extent = {128, 128, 1};
18156 ci.mipLevels = 1;
18157 ci.arrayLayers = 1;
18158 ci.samples = VK_SAMPLE_COUNT_1_BIT;
18159 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
18160 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
18161 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18162 ci.queueFamilyIndexCount = 0;
18163 ci.pQueueFamilyIndices = NULL;
18164 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18165
18166 VkImageObj image1(m_device);
18167 image1.init(&ci);
18168 ASSERT_TRUE(image1.initialized());
18169
18170 ci.samples = VK_SAMPLE_COUNT_2_BIT;
18171 VkImageObj image2(m_device);
18172 image2.init(&ci);
18173 ASSERT_TRUE(image2.initialized());
18174
18175 ci.samples = VK_SAMPLE_COUNT_4_BIT;
18176 VkImageObj image4(m_device);
18177 image4.init(&ci);
18178 ASSERT_TRUE(image4.initialized());
18179
18180 m_commandBuffer->BeginCommandBuffer();
18181
18182 VkImageCopy copyRegion;
18183 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18184 copyRegion.srcSubresource.mipLevel = 0;
18185 copyRegion.srcSubresource.baseArrayLayer = 0;
18186 copyRegion.srcSubresource.layerCount = 1;
18187 copyRegion.srcOffset = {0, 0, 0};
18188 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18189 copyRegion.dstSubresource.mipLevel = 0;
18190 copyRegion.dstSubresource.baseArrayLayer = 0;
18191 copyRegion.dstSubresource.layerCount = 1;
18192 copyRegion.dstOffset = {0, 0, 0};
18193 copyRegion.extent = {128, 128, 1};
18194
18195 // Copy a single sample image to/from a multi-sample image
18196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18197 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18198 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18199 m_errorMonitor->VerifyFound();
18200
18201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18202 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
18203 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18204 m_errorMonitor->VerifyFound();
18205
18206 // Copy between multi-sample images with different sample counts
18207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18208 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
18209 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18210 m_errorMonitor->VerifyFound();
18211
18212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
18213 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
18214 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18215 m_errorMonitor->VerifyFound();
18216
18217 m_commandBuffer->EndCommandBuffer();
18218}
18219
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018220TEST_F(VkLayerTest, CopyImageAspectMismatch) {
18221 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060018222 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018223 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060018224 if (!ds_format) {
18225 return;
18226 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018227
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060018228 VkFormatProperties properties;
18229 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
18230 if (properties.optimalTilingFeatures == 0) {
18231 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
18232 return;
18233 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018234 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018235 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
Mark Youngad61f4b2017-04-07 08:59:56 -060018236 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Dave Houlton11dcd5e2017-04-25 16:00:10 -060018237 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018238 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
18239 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018240 ASSERT_TRUE(color_image.initialized());
18241 ASSERT_TRUE(depth_image.initialized());
18242 ASSERT_TRUE(ds_image.initialized());
18243
18244 VkImageCopy copyRegion;
18245 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18246 copyRegion.srcSubresource.mipLevel = 0;
18247 copyRegion.srcSubresource.baseArrayLayer = 0;
18248 copyRegion.srcSubresource.layerCount = 1;
18249 copyRegion.srcOffset = {0, 0, 0};
18250 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18251 copyRegion.dstSubresource.mipLevel = 0;
18252 copyRegion.dstSubresource.baseArrayLayer = 0;
18253 copyRegion.dstSubresource.layerCount = 1;
18254 copyRegion.dstOffset = {64, 0, 0};
18255 copyRegion.extent = {64, 128, 1};
18256
18257 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060018258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18259 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
18260 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18261 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018262 m_errorMonitor->VerifyFound();
18263
18264 m_commandBuffer->BeginCommandBuffer();
18265
18266 // Src and dest aspect masks don't match
18267 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
18268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018269 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
18270 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018271 m_errorMonitor->VerifyFound();
18272 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18273
18274 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060018275 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018276 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
18277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
18278 // These aspect/format mismatches are redundant but unavoidable here
18279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018281 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18282 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018283 m_errorMonitor->VerifyFound();
18284 // Metadata aspect is illegal - VU 01222
18285 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18286 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
18287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
18288 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060018289 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
18290 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060018291 m_errorMonitor->VerifyFound();
18292
18293 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18294 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18295
18296 // Aspect mask doesn't match source image format - VU 01200
18297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
18298 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
18299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18300 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18301 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18302 m_errorMonitor->VerifyFound();
18303
18304 // Aspect mask doesn't match dest image format - VU 01201
18305 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18306 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
18308 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
18309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
18310 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
18311 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
18312 m_errorMonitor->VerifyFound();
18313
18314 m_commandBuffer->EndCommandBuffer();
18315}
18316
Karl Schultz6addd812016-02-02 17:17:23 -070018317TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
18318 VkResult err;
18319 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018320
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18322 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018323
Tony Barbour1fa09702017-03-16 12:09:08 -060018324 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018325
18326 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018327 VkImage srcImage;
18328 VkImage dstImage;
18329 VkDeviceMemory srcMem;
18330 VkDeviceMemory destMem;
18331 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018332
18333 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018334 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18335 image_create_info.pNext = NULL;
18336 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18337 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18338 image_create_info.extent.width = 32;
18339 image_create_info.extent.height = 1;
18340 image_create_info.extent.depth = 1;
18341 image_create_info.mipLevels = 1;
18342 image_create_info.arrayLayers = 1;
18343 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18344 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18345 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18346 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018348 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018349 ASSERT_VK_SUCCESS(err);
18350
Karl Schultz6addd812016-02-02 17:17:23 -070018351 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018352
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018353 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018354 ASSERT_VK_SUCCESS(err);
18355
18356 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018357 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018358 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18359 memAlloc.pNext = NULL;
18360 memAlloc.allocationSize = 0;
18361 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018362
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018363 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018364 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018365 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018366 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018367 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018368 ASSERT_VK_SUCCESS(err);
18369
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018370 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018371 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018372 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018373 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018374 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018375 ASSERT_VK_SUCCESS(err);
18376
18377 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18378 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018379 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018380 ASSERT_VK_SUCCESS(err);
18381
Tony Barbour552f6c02016-12-21 14:34:07 -070018382 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018383 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018384 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18385 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018386 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018387 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018388 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018389 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018390 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018391 resolveRegion.srcOffset.x = 0;
18392 resolveRegion.srcOffset.y = 0;
18393 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018394 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018395 resolveRegion.dstSubresource.mipLevel = 0;
18396 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018397 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018398 resolveRegion.dstOffset.x = 0;
18399 resolveRegion.dstOffset.y = 0;
18400 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018401 resolveRegion.extent.width = 1;
18402 resolveRegion.extent.height = 1;
18403 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018404 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018405 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018406
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018407 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018408
Chia-I Wuf7458c52015-10-26 21:10:41 +080018409 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018410 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018411 vkFreeMemory(m_device->device(), srcMem, NULL);
18412 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018413}
18414
Karl Schultz6addd812016-02-02 17:17:23 -070018415TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
18416 VkResult err;
18417 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018418
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018419 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18420 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018421
Tony Barbour1fa09702017-03-16 12:09:08 -060018422 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018423
Chris Forbesa7530692016-05-08 12:35:39 +120018424 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070018425 VkImage srcImage;
18426 VkImage dstImage;
18427 VkDeviceMemory srcMem;
18428 VkDeviceMemory destMem;
18429 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018430
18431 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018432 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18433 image_create_info.pNext = NULL;
18434 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18435 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18436 image_create_info.extent.width = 32;
18437 image_create_info.extent.height = 1;
18438 image_create_info.extent.depth = 1;
18439 image_create_info.mipLevels = 1;
18440 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120018441 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018442 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18443 // Note: Some implementations expect color attachment usage for any
18444 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018445 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018446 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018447
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018448 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018449 ASSERT_VK_SUCCESS(err);
18450
Karl Schultz6addd812016-02-02 17:17:23 -070018451 // Note: Some implementations expect color attachment usage for any
18452 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018453 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018455 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018456 ASSERT_VK_SUCCESS(err);
18457
18458 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018459 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018460 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18461 memAlloc.pNext = NULL;
18462 memAlloc.allocationSize = 0;
18463 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018464
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018465 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018466 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018467 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018468 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018469 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018470 ASSERT_VK_SUCCESS(err);
18471
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018472 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018473 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018474 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018475 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018476 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018477 ASSERT_VK_SUCCESS(err);
18478
18479 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18480 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018481 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018482 ASSERT_VK_SUCCESS(err);
18483
Tony Barbour552f6c02016-12-21 14:34:07 -070018484 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018485 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018486 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18487 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018488 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018489 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018490 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018491 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018492 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018493 resolveRegion.srcOffset.x = 0;
18494 resolveRegion.srcOffset.y = 0;
18495 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018496 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018497 resolveRegion.dstSubresource.mipLevel = 0;
18498 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018499 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018500 resolveRegion.dstOffset.x = 0;
18501 resolveRegion.dstOffset.y = 0;
18502 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018503 resolveRegion.extent.width = 1;
18504 resolveRegion.extent.height = 1;
18505 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018506 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018507 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018508
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018509 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018510
Chia-I Wuf7458c52015-10-26 21:10:41 +080018511 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018512 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018513 vkFreeMemory(m_device->device(), srcMem, NULL);
18514 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018515}
18516
Karl Schultz6addd812016-02-02 17:17:23 -070018517TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
18518 VkResult err;
18519 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018520
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018521 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018522 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018523
Tony Barbour1fa09702017-03-16 12:09:08 -060018524 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018525
18526 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018527 VkImage srcImage;
18528 VkImage dstImage;
18529 VkDeviceMemory srcMem;
18530 VkDeviceMemory destMem;
18531 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018532
18533 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018534 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18535 image_create_info.pNext = NULL;
18536 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18537 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18538 image_create_info.extent.width = 32;
18539 image_create_info.extent.height = 1;
18540 image_create_info.extent.depth = 1;
18541 image_create_info.mipLevels = 1;
18542 image_create_info.arrayLayers = 1;
18543 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18544 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18545 // Note: Some implementations expect color attachment usage for any
18546 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018547 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018548 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018549
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018550 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018551 ASSERT_VK_SUCCESS(err);
18552
Karl Schultz6addd812016-02-02 17:17:23 -070018553 // Set format to something other than source image
18554 image_create_info.format = VK_FORMAT_R32_SFLOAT;
18555 // Note: Some implementations expect color attachment usage for any
18556 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018557 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018558 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018559
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018560 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018561 ASSERT_VK_SUCCESS(err);
18562
18563 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018564 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018565 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18566 memAlloc.pNext = NULL;
18567 memAlloc.allocationSize = 0;
18568 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018569
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018570 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018571 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018572 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018573 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018574 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018575 ASSERT_VK_SUCCESS(err);
18576
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018577 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018578 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018579 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018580 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018581 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018582 ASSERT_VK_SUCCESS(err);
18583
18584 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18585 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018586 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018587 ASSERT_VK_SUCCESS(err);
18588
Tony Barbour552f6c02016-12-21 14:34:07 -070018589 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018590 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018591 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18592 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018593 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018594 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018595 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018596 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018597 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018598 resolveRegion.srcOffset.x = 0;
18599 resolveRegion.srcOffset.y = 0;
18600 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018601 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018602 resolveRegion.dstSubresource.mipLevel = 0;
18603 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018604 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018605 resolveRegion.dstOffset.x = 0;
18606 resolveRegion.dstOffset.y = 0;
18607 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018608 resolveRegion.extent.width = 1;
18609 resolveRegion.extent.height = 1;
18610 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018611 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018612 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018613
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018614 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018615
Chia-I Wuf7458c52015-10-26 21:10:41 +080018616 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018617 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018618 vkFreeMemory(m_device->device(), srcMem, NULL);
18619 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018620}
18621
Karl Schultz6addd812016-02-02 17:17:23 -070018622TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
18623 VkResult err;
18624 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060018625
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018627 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018628
Tony Barbour1fa09702017-03-16 12:09:08 -060018629 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018630
18631 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018632 VkImage srcImage;
18633 VkImage dstImage;
18634 VkDeviceMemory srcMem;
18635 VkDeviceMemory destMem;
18636 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018637
18638 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018639 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18640 image_create_info.pNext = NULL;
18641 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18642 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18643 image_create_info.extent.width = 32;
18644 image_create_info.extent.height = 1;
18645 image_create_info.extent.depth = 1;
18646 image_create_info.mipLevels = 1;
18647 image_create_info.arrayLayers = 1;
18648 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18649 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18650 // Note: Some implementations expect color attachment usage for any
18651 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018652 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018653 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018654
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018655 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018656 ASSERT_VK_SUCCESS(err);
18657
Karl Schultz6addd812016-02-02 17:17:23 -070018658 image_create_info.imageType = VK_IMAGE_TYPE_1D;
18659 // Note: Some implementations expect color attachment usage for any
18660 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018661 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018662 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018663
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018664 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018665 ASSERT_VK_SUCCESS(err);
18666
18667 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018668 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018669 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18670 memAlloc.pNext = NULL;
18671 memAlloc.allocationSize = 0;
18672 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018673
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018674 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018675 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018676 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018677 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018678 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018679 ASSERT_VK_SUCCESS(err);
18680
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018681 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018682 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018683 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018684 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018685 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018686 ASSERT_VK_SUCCESS(err);
18687
18688 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18689 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018690 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018691 ASSERT_VK_SUCCESS(err);
18692
Tony Barbour552f6c02016-12-21 14:34:07 -070018693 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018694 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018695 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18696 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018697 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018698 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018699 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018700 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018701 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018702 resolveRegion.srcOffset.x = 0;
18703 resolveRegion.srcOffset.y = 0;
18704 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018705 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018706 resolveRegion.dstSubresource.mipLevel = 0;
18707 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018708 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018709 resolveRegion.dstOffset.x = 0;
18710 resolveRegion.dstOffset.y = 0;
18711 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018712 resolveRegion.extent.width = 1;
18713 resolveRegion.extent.height = 1;
18714 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018715 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018716 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018717
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018718 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018719
Chia-I Wuf7458c52015-10-26 21:10:41 +080018720 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018721 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018722 vkFreeMemory(m_device->device(), srcMem, NULL);
18723 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018724}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018725
Karl Schultz6addd812016-02-02 17:17:23 -070018726TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018727 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018728 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18729 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018730 // The image format check comes 2nd in validation so we trigger it first,
18731 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018732 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018733
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18735 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018736
Tony Barbour1fa09702017-03-16 12:09:08 -060018737 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018738 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018739 if (!depth_format) {
18740 return;
18741 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018742
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018743 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018744 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18745 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018746
18747 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018748 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18749 ds_pool_ci.pNext = NULL;
18750 ds_pool_ci.maxSets = 1;
18751 ds_pool_ci.poolSizeCount = 1;
18752 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018753
18754 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018755 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018756 ASSERT_VK_SUCCESS(err);
18757
18758 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018759 dsl_binding.binding = 0;
18760 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18761 dsl_binding.descriptorCount = 1;
18762 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18763 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018764
18765 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018766 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18767 ds_layout_ci.pNext = NULL;
18768 ds_layout_ci.bindingCount = 1;
18769 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018770 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018771 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018772 ASSERT_VK_SUCCESS(err);
18773
18774 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018775 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018776 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018777 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018778 alloc_info.descriptorPool = ds_pool;
18779 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018780 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018781 ASSERT_VK_SUCCESS(err);
18782
Karl Schultz6addd812016-02-02 17:17:23 -070018783 VkImage image_bad;
18784 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018785 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018786 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018787 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018788 const int32_t tex_width = 32;
18789 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018790
18791 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018792 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18793 image_create_info.pNext = NULL;
18794 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18795 image_create_info.format = tex_format_bad;
18796 image_create_info.extent.width = tex_width;
18797 image_create_info.extent.height = tex_height;
18798 image_create_info.extent.depth = 1;
18799 image_create_info.mipLevels = 1;
18800 image_create_info.arrayLayers = 1;
18801 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18802 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018803 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018804 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018805
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018806 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018807 ASSERT_VK_SUCCESS(err);
18808 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018809 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18810 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018811 ASSERT_VK_SUCCESS(err);
18812
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018813 // ---Bind image memory---
18814 VkMemoryRequirements img_mem_reqs;
18815 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18816 VkMemoryAllocateInfo image_alloc_info = {};
18817 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18818 image_alloc_info.pNext = NULL;
18819 image_alloc_info.memoryTypeIndex = 0;
18820 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018821 bool pass =
18822 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 -070018823 ASSERT_TRUE(pass);
18824 VkDeviceMemory mem;
18825 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18826 ASSERT_VK_SUCCESS(err);
18827 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18828 ASSERT_VK_SUCCESS(err);
18829 // -----------------------
18830
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018831 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018832 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018833 image_view_create_info.image = image_bad;
18834 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18835 image_view_create_info.format = tex_format_bad;
18836 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18837 image_view_create_info.subresourceRange.baseMipLevel = 0;
18838 image_view_create_info.subresourceRange.layerCount = 1;
18839 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018840 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018841
18842 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018843 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018844
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018845 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018846
Chia-I Wuf7458c52015-10-26 21:10:41 +080018847 vkDestroyImage(m_device->device(), image_bad, NULL);
18848 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018849 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18850 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018851
18852 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018853}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018854
18855TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018856 TEST_DESCRIPTION(
18857 "Call ClearColorImage w/ a depth|stencil image and "
18858 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018859
Tony Barbour1fa09702017-03-16 12:09:08 -060018860 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018861 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018862 if (!depth_format) {
18863 return;
18864 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018865 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18866
Tony Barbour552f6c02016-12-21 14:34:07 -070018867 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018868
18869 // Color image
18870 VkClearColorValue clear_color;
18871 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18872 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18873 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18874 const int32_t img_width = 32;
18875 const int32_t img_height = 32;
18876 VkImageCreateInfo image_create_info = {};
18877 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18878 image_create_info.pNext = NULL;
18879 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18880 image_create_info.format = color_format;
18881 image_create_info.extent.width = img_width;
18882 image_create_info.extent.height = img_height;
18883 image_create_info.extent.depth = 1;
18884 image_create_info.mipLevels = 1;
18885 image_create_info.arrayLayers = 1;
18886 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18887 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18888 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18889
18890 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018891 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018892
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018893 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018894
18895 // Depth/Stencil image
18896 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018897 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018898 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18899 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018900 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018901 ds_image_create_info.extent.width = 64;
18902 ds_image_create_info.extent.height = 64;
18903 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018904 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 -060018905
18906 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018907 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018908
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018909 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 -060018910
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018912
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018913 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018914 &color_range);
18915
18916 m_errorMonitor->VerifyFound();
18917
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18919 "vkCmdClearColorImage called with "
18920 "image created without "
18921 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018922
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018923 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018924 &color_range);
18925
18926 m_errorMonitor->VerifyFound();
18927
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018928 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18930 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018931
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018932 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18933 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018934
18935 m_errorMonitor->VerifyFound();
18936}
Tobin Ehliscde08892015-09-22 10:11:37 -060018937
Mike Schuchardt35fece12017-03-07 14:40:28 -070018938TEST_F(VkLayerTest, CommandQueueFlags) {
18939 TEST_DESCRIPTION(
18940 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18941 "graphics-only command");
18942
18943 ASSERT_NO_FATAL_FAILURE(Init());
18944
18945 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018946 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018947 printf(" Non-graphics queue family not found; skipped.\n");
18948 return;
18949 } else {
18950 // Create command pool on a non-graphics queue
18951 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18952
18953 // Setup command buffer on pool
18954 VkCommandBufferObj command_buffer(m_device, &command_pool);
18955 command_buffer.BeginCommandBuffer();
18956
18957 // Issue a graphics only command
18958 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18959 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18960 command_buffer.SetViewport(0, 1, &viewport);
18961 m_errorMonitor->VerifyFound();
18962 }
18963}
18964
Mark Lobodzinskib8359282017-05-16 09:17:51 -060018965TEST_F(VkLayerTest, ExecuteUnrecordedCBs) {
18966 TEST_DESCRIPTION(
18967 "Attempt vkCmdExecuteCommands and then QueueSubmit with an unrecorded secondary and primary command buffer, respectively");
18968
18969 ASSERT_NO_FATAL_FAILURE(Init());
18970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00155);
18972 // Allocate a secondary command buffer
18973 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18974 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18975 command_buffer_allocate_info.commandPool = m_commandPool->handle();
18976 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18977 command_buffer_allocate_info.commandBufferCount = 1;
18978 VkCommandBuffer secondary_command_buffer;
18979 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18980 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18981 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18982 command_buffer_begin_info.flags =
18983 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18984 command_buffer_begin_info.pInheritanceInfo = nullptr;
18985
18986 // Now update primary cmd buffer to execute unrecorded secondary
18987 VkResult err = vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
18988 ASSERT_VK_SUCCESS(err);
18989 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
18990 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
18991 vkCmdEndRenderPass(m_commandBuffer->handle());
18992 err = vkEndCommandBuffer(m_commandBuffer->handle());
18993 ASSERT_VK_SUCCESS(err);
18994 m_errorMonitor->VerifyFound();
18995
18996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00134);
18997 // Allocate a primary command buffer
18998 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18999 command_buffer_allocate_info.commandBufferCount = 1;
19000 VkCommandBuffer primary_command_buffer;
19001 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19002
19003 // And submit the unrecorded command buffer
19004 VkSubmitInfo submit_info = {};
19005 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19006 submit_info.commandBufferCount = 1;
19007 submit_info.pCommandBuffers = &primary_command_buffer;
19008 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19009 m_errorMonitor->VerifyFound();
19010}
19011
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019012// WSI Enabled Tests
19013//
Chris Forbes09368e42016-10-13 11:59:22 +130019014#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019015TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
19016
19017#if defined(VK_USE_PLATFORM_XCB_KHR)
19018 VkSurfaceKHR surface = VK_NULL_HANDLE;
19019
19020 VkResult err;
19021 bool pass;
19022 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
19023 VkSwapchainCreateInfoKHR swapchain_create_info = {};
19024 // uint32_t swapchain_image_count = 0;
19025 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
19026 // uint32_t image_index = 0;
19027 // VkPresentInfoKHR present_info = {};
19028
Tony Barbour1fa09702017-03-16 12:09:08 -060019029 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019030
19031 // Use the create function from one of the VK_KHR_*_surface extension in
19032 // order to create a surface, testing all known errors in the process,
19033 // before successfully creating a surface:
19034 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
19035 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
19036 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
19037 pass = (err != VK_SUCCESS);
19038 ASSERT_TRUE(pass);
19039 m_errorMonitor->VerifyFound();
19040
19041 // Next, try to create a surface with the wrong
19042 // VkXcbSurfaceCreateInfoKHR::sType:
19043 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
19044 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19045 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19046 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19047 pass = (err != VK_SUCCESS);
19048 ASSERT_TRUE(pass);
19049 m_errorMonitor->VerifyFound();
19050
19051 // Create a native window, and then correctly create a surface:
19052 xcb_connection_t *connection;
19053 xcb_screen_t *screen;
19054 xcb_window_t xcb_window;
19055 xcb_intern_atom_reply_t *atom_wm_delete_window;
19056
19057 const xcb_setup_t *setup;
19058 xcb_screen_iterator_t iter;
19059 int scr;
19060 uint32_t value_mask, value_list[32];
19061 int width = 1;
19062 int height = 1;
19063
19064 connection = xcb_connect(NULL, &scr);
19065 ASSERT_TRUE(connection != NULL);
19066 setup = xcb_get_setup(connection);
19067 iter = xcb_setup_roots_iterator(setup);
19068 while (scr-- > 0)
19069 xcb_screen_next(&iter);
19070 screen = iter.data;
19071
19072 xcb_window = xcb_generate_id(connection);
19073
19074 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
19075 value_list[0] = screen->black_pixel;
19076 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
19077
19078 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
19079 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
19080
19081 /* Magic code that will send notification when window is destroyed */
19082 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
19083 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
19084
19085 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
19086 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
19087 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
19088 free(reply);
19089
19090 xcb_map_window(connection, xcb_window);
19091
19092 // Force the x/y coordinates to 100,100 results are identical in consecutive
19093 // runs
19094 const uint32_t coords[] = { 100, 100 };
19095 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
19096
19097 // Finally, try to correctly create a surface:
19098 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
19099 xcb_create_info.pNext = NULL;
19100 xcb_create_info.flags = 0;
19101 xcb_create_info.connection = connection;
19102 xcb_create_info.window = xcb_window;
19103 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
19104 pass = (err == VK_SUCCESS);
19105 ASSERT_TRUE(pass);
19106
19107 // Check if surface supports presentation:
19108
19109 // 1st, do so without having queried the queue families:
19110 VkBool32 supported = false;
19111 // TODO: Get the following error to come out:
19112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19113 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
19114 "function");
19115 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19116 pass = (err != VK_SUCCESS);
19117 // ASSERT_TRUE(pass);
19118 // m_errorMonitor->VerifyFound();
19119
19120 // Next, query a queue family index that's too large:
19121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19122 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
19123 pass = (err != VK_SUCCESS);
19124 ASSERT_TRUE(pass);
19125 m_errorMonitor->VerifyFound();
19126
19127 // Finally, do so correctly:
19128 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19129 // SUPPORTED
19130 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
19131 pass = (err == VK_SUCCESS);
19132 ASSERT_TRUE(pass);
19133
19134 // Before proceeding, try to create a swapchain without having called
19135 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
19136 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19137 swapchain_create_info.pNext = NULL;
19138 swapchain_create_info.flags = 0;
19139 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
19140 swapchain_create_info.surface = surface;
19141 swapchain_create_info.imageArrayLayers = 1;
19142 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
19143 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
19144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19145 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
19146 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19147 pass = (err != VK_SUCCESS);
19148 ASSERT_TRUE(pass);
19149 m_errorMonitor->VerifyFound();
19150
19151 // Get the surface capabilities:
19152 VkSurfaceCapabilitiesKHR surface_capabilities;
19153
19154 // Do so correctly (only error logged by this entrypoint is if the
19155 // extension isn't enabled):
19156 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
19157 pass = (err == VK_SUCCESS);
19158 ASSERT_TRUE(pass);
19159
19160 // Get the surface formats:
19161 uint32_t surface_format_count;
19162
19163 // First, try without a pointer to surface_format_count:
19164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
19165 "specified as NULL");
19166 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
19167 pass = (err == VK_SUCCESS);
19168 ASSERT_TRUE(pass);
19169 m_errorMonitor->VerifyFound();
19170
19171 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
19172 // correctly done a 1st try (to get the count):
19173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19174 surface_format_count = 0;
19175 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
19176 pass = (err == VK_SUCCESS);
19177 ASSERT_TRUE(pass);
19178 m_errorMonitor->VerifyFound();
19179
19180 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19181 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19182 pass = (err == VK_SUCCESS);
19183 ASSERT_TRUE(pass);
19184
19185 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19186 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
19187
19188 // Next, do a 2nd try with surface_format_count being set too high:
19189 surface_format_count += 5;
19190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19191 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19192 pass = (err == VK_SUCCESS);
19193 ASSERT_TRUE(pass);
19194 m_errorMonitor->VerifyFound();
19195
19196 // Finally, do a correct 1st and 2nd try:
19197 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
19198 pass = (err == VK_SUCCESS);
19199 ASSERT_TRUE(pass);
19200 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
19201 pass = (err == VK_SUCCESS);
19202 ASSERT_TRUE(pass);
19203
19204 // Get the surface present modes:
19205 uint32_t surface_present_mode_count;
19206
19207 // First, try without a pointer to surface_format_count:
19208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
19209 "specified as NULL");
19210
19211 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
19212 pass = (err == VK_SUCCESS);
19213 ASSERT_TRUE(pass);
19214 m_errorMonitor->VerifyFound();
19215
19216 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
19217 // correctly done a 1st try (to get the count):
19218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
19219 surface_present_mode_count = 0;
19220 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
19221 (VkPresentModeKHR *)&surface_present_mode_count);
19222 pass = (err == VK_SUCCESS);
19223 ASSERT_TRUE(pass);
19224 m_errorMonitor->VerifyFound();
19225
19226 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
19227 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19228 pass = (err == VK_SUCCESS);
19229 ASSERT_TRUE(pass);
19230
19231 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
19232 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
19233
19234 // Next, do a 2nd try with surface_format_count being set too high:
19235 surface_present_mode_count += 5;
19236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
19237 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19238 pass = (err == VK_SUCCESS);
19239 ASSERT_TRUE(pass);
19240 m_errorMonitor->VerifyFound();
19241
19242 // Finally, do a correct 1st and 2nd try:
19243 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
19244 pass = (err == VK_SUCCESS);
19245 ASSERT_TRUE(pass);
19246 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
19247 pass = (err == VK_SUCCESS);
19248 ASSERT_TRUE(pass);
19249
19250 // Create a swapchain:
19251
19252 // First, try without a pointer to swapchain_create_info:
19253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
19254 "specified as NULL");
19255
19256 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
19257 pass = (err != VK_SUCCESS);
19258 ASSERT_TRUE(pass);
19259 m_errorMonitor->VerifyFound();
19260
19261 // Next, call with a non-NULL swapchain_create_info, that has the wrong
19262 // sType:
19263 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
19264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
19265
19266 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19267 pass = (err != VK_SUCCESS);
19268 ASSERT_TRUE(pass);
19269 m_errorMonitor->VerifyFound();
19270
19271 // Next, call with a NULL swapchain pointer:
19272 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
19273 swapchain_create_info.pNext = NULL;
19274 swapchain_create_info.flags = 0;
19275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
19276 "specified as NULL");
19277
19278 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
19279 pass = (err != VK_SUCCESS);
19280 ASSERT_TRUE(pass);
19281 m_errorMonitor->VerifyFound();
19282
19283 // TODO: Enhance swapchain layer so that
19284 // swapchain_create_info.queueFamilyIndexCount is checked against something?
19285
19286 // Next, call with a queue family index that's too large:
19287 uint32_t queueFamilyIndex[2] = { 100000, 0 };
19288 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19289 swapchain_create_info.queueFamilyIndexCount = 2;
19290 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
19291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
19292 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19293 pass = (err != VK_SUCCESS);
19294 ASSERT_TRUE(pass);
19295 m_errorMonitor->VerifyFound();
19296
19297 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
19298 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
19299 swapchain_create_info.queueFamilyIndexCount = 1;
19300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19301 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
19302 "pCreateInfo->pQueueFamilyIndices).");
19303 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19304 pass = (err != VK_SUCCESS);
19305 ASSERT_TRUE(pass);
19306 m_errorMonitor->VerifyFound();
19307
19308 // Next, call with an invalid imageSharingMode:
19309 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
19310 swapchain_create_info.queueFamilyIndexCount = 1;
19311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
19312 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
19313 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
19314 pass = (err != VK_SUCCESS);
19315 ASSERT_TRUE(pass);
19316 m_errorMonitor->VerifyFound();
19317 // Fix for the future:
19318 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
19319 // SUPPORTED
19320 swapchain_create_info.queueFamilyIndexCount = 0;
19321 queueFamilyIndex[0] = 0;
19322 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
19323
19324 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
19325 // Get the images from a swapchain:
19326 // Acquire an image from a swapchain:
19327 // Present an image to a swapchain:
19328 // Destroy the swapchain:
19329
19330 // TODOs:
19331 //
19332 // - Try destroying the device without first destroying the swapchain
19333 //
19334 // - Try destroying the device without first destroying the surface
19335 //
19336 // - Try destroying the surface without first destroying the swapchain
19337
19338 // Destroy the surface:
19339 vkDestroySurfaceKHR(instance(), surface, NULL);
19340
19341 // Tear down the window:
19342 xcb_destroy_window(connection, xcb_window);
19343 xcb_disconnect(connection);
19344
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019345#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019346 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019347#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019348}
Chris Forbes09368e42016-10-13 11:59:22 +130019349#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019350
19351//
19352// POSITIVE VALIDATION TESTS
19353//
19354// These tests do not expect to encounter ANY validation errors pass only if this is true
19355
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019356TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
19357 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060019358 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019359 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19360
19361 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19362 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019363 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070019364 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19365 command_buffer_allocate_info.commandBufferCount = 1;
19366
19367 VkCommandBuffer secondary_command_buffer;
19368 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19369 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19370 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19371 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19372 command_buffer_inheritance_info.renderPass = m_renderPass;
19373 command_buffer_inheritance_info.framebuffer = m_framebuffer;
19374
19375 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19376 command_buffer_begin_info.flags =
19377 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
19378 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19379
19380 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19381 VkClearAttachment color_attachment;
19382 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19383 color_attachment.clearValue.color.float32[0] = 0;
19384 color_attachment.clearValue.color.float32[1] = 0;
19385 color_attachment.clearValue.color.float32[2] = 0;
19386 color_attachment.clearValue.color.float32[3] = 0;
19387 color_attachment.colorAttachment = 0;
19388 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
19389 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
19390}
19391
Tobin Ehlise0006882016-11-03 10:14:28 -060019392TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019393 TEST_DESCRIPTION(
19394 "Perform an image layout transition in a secondary command buffer followed "
19395 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060019396 VkResult err;
19397 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060019398 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060019399 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070019400 if (!depth_format) {
19401 return;
19402 }
Tobin Ehlise0006882016-11-03 10:14:28 -060019403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19404 // Allocate a secondary and primary cmd buffer
19405 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
19406 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019407 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060019408 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
19409 command_buffer_allocate_info.commandBufferCount = 1;
19410
19411 VkCommandBuffer secondary_command_buffer;
19412 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
19413 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19414 VkCommandBuffer primary_command_buffer;
19415 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
19416 VkCommandBufferBeginInfo command_buffer_begin_info = {};
19417 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
19418 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
19419 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19420 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
19421 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
19422
19423 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
19424 ASSERT_VK_SUCCESS(err);
19425 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019426 image.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlise0006882016-11-03 10:14:28 -060019427 ASSERT_TRUE(image.initialized());
19428 VkImageMemoryBarrier img_barrier = {};
19429 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19430 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19431 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19432 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
19433 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19434 img_barrier.image = image.handle();
19435 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19436 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19437 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19438 img_barrier.subresourceRange.baseArrayLayer = 0;
19439 img_barrier.subresourceRange.baseMipLevel = 0;
19440 img_barrier.subresourceRange.layerCount = 1;
19441 img_barrier.subresourceRange.levelCount = 1;
19442 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
19443 0, nullptr, 1, &img_barrier);
19444 err = vkEndCommandBuffer(secondary_command_buffer);
19445 ASSERT_VK_SUCCESS(err);
19446
19447 // Now update primary cmd buffer to execute secondary and transitions image
19448 command_buffer_begin_info.pInheritanceInfo = nullptr;
19449 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
19450 ASSERT_VK_SUCCESS(err);
19451 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
19452 VkImageMemoryBarrier img_barrier2 = {};
19453 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19454 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19455 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19456 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19457 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19458 img_barrier2.image = image.handle();
19459 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19460 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19461 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
19462 img_barrier2.subresourceRange.baseArrayLayer = 0;
19463 img_barrier2.subresourceRange.baseMipLevel = 0;
19464 img_barrier2.subresourceRange.layerCount = 1;
19465 img_barrier2.subresourceRange.levelCount = 1;
19466 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
19467 nullptr, 1, &img_barrier2);
19468 err = vkEndCommandBuffer(primary_command_buffer);
19469 ASSERT_VK_SUCCESS(err);
19470 VkSubmitInfo submit_info = {};
19471 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19472 submit_info.commandBufferCount = 1;
19473 submit_info.pCommandBuffers = &primary_command_buffer;
19474 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
19475 ASSERT_VK_SUCCESS(err);
19476 m_errorMonitor->VerifyNotFound();
19477 err = vkDeviceWaitIdle(m_device->device());
19478 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070019479 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
19480 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060019481}
19482
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019483// This is a positive test. No failures are expected.
19484TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019485 TEST_DESCRIPTION(
19486 "Ensure that the vkUpdateDescriptorSets validation code "
19487 "is ignoring VkWriteDescriptorSet members that are not "
19488 "related to the descriptor type specified by "
19489 "VkWriteDescriptorSet::descriptorType. Correct "
19490 "validation behavior will result in the test running to "
19491 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019492
19493 const uintptr_t invalid_ptr = 0xcdcdcdcd;
19494
Tony Barbour1fa09702017-03-16 12:09:08 -060019495 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019496
19497 // Image Case
19498 {
19499 m_errorMonitor->ExpectSuccess();
19500
19501 VkImage image;
19502 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
19503 const int32_t tex_width = 32;
19504 const int32_t tex_height = 32;
19505 VkImageCreateInfo image_create_info = {};
19506 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19507 image_create_info.pNext = NULL;
19508 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19509 image_create_info.format = tex_format;
19510 image_create_info.extent.width = tex_width;
19511 image_create_info.extent.height = tex_height;
19512 image_create_info.extent.depth = 1;
19513 image_create_info.mipLevels = 1;
19514 image_create_info.arrayLayers = 1;
19515 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19516 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19517 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
19518 image_create_info.flags = 0;
19519 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19520 ASSERT_VK_SUCCESS(err);
19521
19522 VkMemoryRequirements memory_reqs;
19523 VkDeviceMemory image_memory;
19524 bool pass;
19525 VkMemoryAllocateInfo memory_info = {};
19526 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19527 memory_info.pNext = NULL;
19528 memory_info.allocationSize = 0;
19529 memory_info.memoryTypeIndex = 0;
19530 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19531 memory_info.allocationSize = memory_reqs.size;
19532 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19533 ASSERT_TRUE(pass);
19534 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
19535 ASSERT_VK_SUCCESS(err);
19536 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
19537 ASSERT_VK_SUCCESS(err);
19538
19539 VkImageViewCreateInfo image_view_create_info = {};
19540 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19541 image_view_create_info.image = image;
19542 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
19543 image_view_create_info.format = tex_format;
19544 image_view_create_info.subresourceRange.layerCount = 1;
19545 image_view_create_info.subresourceRange.baseMipLevel = 0;
19546 image_view_create_info.subresourceRange.levelCount = 1;
19547 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19548
19549 VkImageView view;
19550 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
19551 ASSERT_VK_SUCCESS(err);
19552
19553 VkDescriptorPoolSize ds_type_count = {};
19554 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19555 ds_type_count.descriptorCount = 1;
19556
19557 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19558 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19559 ds_pool_ci.pNext = NULL;
19560 ds_pool_ci.maxSets = 1;
19561 ds_pool_ci.poolSizeCount = 1;
19562 ds_pool_ci.pPoolSizes = &ds_type_count;
19563
19564 VkDescriptorPool ds_pool;
19565 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19566 ASSERT_VK_SUCCESS(err);
19567
19568 VkDescriptorSetLayoutBinding dsl_binding = {};
19569 dsl_binding.binding = 0;
19570 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19571 dsl_binding.descriptorCount = 1;
19572 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19573 dsl_binding.pImmutableSamplers = NULL;
19574
19575 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19576 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19577 ds_layout_ci.pNext = NULL;
19578 ds_layout_ci.bindingCount = 1;
19579 ds_layout_ci.pBindings = &dsl_binding;
19580 VkDescriptorSetLayout ds_layout;
19581 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19582 ASSERT_VK_SUCCESS(err);
19583
19584 VkDescriptorSet descriptor_set;
19585 VkDescriptorSetAllocateInfo alloc_info = {};
19586 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19587 alloc_info.descriptorSetCount = 1;
19588 alloc_info.descriptorPool = ds_pool;
19589 alloc_info.pSetLayouts = &ds_layout;
19590 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19591 ASSERT_VK_SUCCESS(err);
19592
19593 VkDescriptorImageInfo image_info = {};
19594 image_info.imageView = view;
19595 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
19596
19597 VkWriteDescriptorSet descriptor_write;
19598 memset(&descriptor_write, 0, sizeof(descriptor_write));
19599 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19600 descriptor_write.dstSet = descriptor_set;
19601 descriptor_write.dstBinding = 0;
19602 descriptor_write.descriptorCount = 1;
19603 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
19604 descriptor_write.pImageInfo = &image_info;
19605
19606 // Set pBufferInfo and pTexelBufferView to invalid values, which should
19607 // be
19608 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
19609 // This will most likely produce a crash if the parameter_validation
19610 // layer
19611 // does not correctly ignore pBufferInfo.
19612 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19613 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19614
19615 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19616
19617 m_errorMonitor->VerifyNotFound();
19618
19619 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19620 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19621 vkDestroyImageView(m_device->device(), view, NULL);
19622 vkDestroyImage(m_device->device(), image, NULL);
19623 vkFreeMemory(m_device->device(), image_memory, NULL);
19624 }
19625
19626 // Buffer Case
19627 {
19628 m_errorMonitor->ExpectSuccess();
19629
19630 VkBuffer buffer;
19631 uint32_t queue_family_index = 0;
19632 VkBufferCreateInfo buffer_create_info = {};
19633 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19634 buffer_create_info.size = 1024;
19635 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19636 buffer_create_info.queueFamilyIndexCount = 1;
19637 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19638
19639 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19640 ASSERT_VK_SUCCESS(err);
19641
19642 VkMemoryRequirements memory_reqs;
19643 VkDeviceMemory buffer_memory;
19644 bool pass;
19645 VkMemoryAllocateInfo memory_info = {};
19646 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19647 memory_info.pNext = NULL;
19648 memory_info.allocationSize = 0;
19649 memory_info.memoryTypeIndex = 0;
19650
19651 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19652 memory_info.allocationSize = memory_reqs.size;
19653 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19654 ASSERT_TRUE(pass);
19655
19656 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19657 ASSERT_VK_SUCCESS(err);
19658 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19659 ASSERT_VK_SUCCESS(err);
19660
19661 VkDescriptorPoolSize ds_type_count = {};
19662 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19663 ds_type_count.descriptorCount = 1;
19664
19665 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19666 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19667 ds_pool_ci.pNext = NULL;
19668 ds_pool_ci.maxSets = 1;
19669 ds_pool_ci.poolSizeCount = 1;
19670 ds_pool_ci.pPoolSizes = &ds_type_count;
19671
19672 VkDescriptorPool ds_pool;
19673 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19674 ASSERT_VK_SUCCESS(err);
19675
19676 VkDescriptorSetLayoutBinding dsl_binding = {};
19677 dsl_binding.binding = 0;
19678 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19679 dsl_binding.descriptorCount = 1;
19680 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19681 dsl_binding.pImmutableSamplers = NULL;
19682
19683 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19684 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19685 ds_layout_ci.pNext = NULL;
19686 ds_layout_ci.bindingCount = 1;
19687 ds_layout_ci.pBindings = &dsl_binding;
19688 VkDescriptorSetLayout ds_layout;
19689 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19690 ASSERT_VK_SUCCESS(err);
19691
19692 VkDescriptorSet descriptor_set;
19693 VkDescriptorSetAllocateInfo alloc_info = {};
19694 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19695 alloc_info.descriptorSetCount = 1;
19696 alloc_info.descriptorPool = ds_pool;
19697 alloc_info.pSetLayouts = &ds_layout;
19698 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19699 ASSERT_VK_SUCCESS(err);
19700
19701 VkDescriptorBufferInfo buffer_info = {};
19702 buffer_info.buffer = buffer;
19703 buffer_info.offset = 0;
19704 buffer_info.range = 1024;
19705
19706 VkWriteDescriptorSet descriptor_write;
19707 memset(&descriptor_write, 0, sizeof(descriptor_write));
19708 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19709 descriptor_write.dstSet = descriptor_set;
19710 descriptor_write.dstBinding = 0;
19711 descriptor_write.descriptorCount = 1;
19712 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19713 descriptor_write.pBufferInfo = &buffer_info;
19714
19715 // Set pImageInfo and pTexelBufferView to invalid values, which should
19716 // be
19717 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
19718 // This will most likely produce a crash if the parameter_validation
19719 // layer
19720 // does not correctly ignore pImageInfo.
19721 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19722 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19723
19724 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19725
19726 m_errorMonitor->VerifyNotFound();
19727
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019728 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19729 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19730 vkDestroyBuffer(m_device->device(), buffer, NULL);
19731 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19732 }
19733
19734 // Texel Buffer Case
19735 {
19736 m_errorMonitor->ExpectSuccess();
19737
19738 VkBuffer buffer;
19739 uint32_t queue_family_index = 0;
19740 VkBufferCreateInfo buffer_create_info = {};
19741 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19742 buffer_create_info.size = 1024;
19743 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
19744 buffer_create_info.queueFamilyIndexCount = 1;
19745 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19746
19747 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19748 ASSERT_VK_SUCCESS(err);
19749
19750 VkMemoryRequirements memory_reqs;
19751 VkDeviceMemory buffer_memory;
19752 bool pass;
19753 VkMemoryAllocateInfo memory_info = {};
19754 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19755 memory_info.pNext = NULL;
19756 memory_info.allocationSize = 0;
19757 memory_info.memoryTypeIndex = 0;
19758
19759 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19760 memory_info.allocationSize = memory_reqs.size;
19761 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19762 ASSERT_TRUE(pass);
19763
19764 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19765 ASSERT_VK_SUCCESS(err);
19766 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19767 ASSERT_VK_SUCCESS(err);
19768
19769 VkBufferViewCreateInfo buff_view_ci = {};
19770 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
19771 buff_view_ci.buffer = buffer;
19772 buff_view_ci.format = VK_FORMAT_R8_UNORM;
19773 buff_view_ci.range = VK_WHOLE_SIZE;
19774 VkBufferView buffer_view;
19775 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19776
19777 VkDescriptorPoolSize ds_type_count = {};
19778 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19779 ds_type_count.descriptorCount = 1;
19780
19781 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19782 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19783 ds_pool_ci.pNext = NULL;
19784 ds_pool_ci.maxSets = 1;
19785 ds_pool_ci.poolSizeCount = 1;
19786 ds_pool_ci.pPoolSizes = &ds_type_count;
19787
19788 VkDescriptorPool ds_pool;
19789 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19790 ASSERT_VK_SUCCESS(err);
19791
19792 VkDescriptorSetLayoutBinding dsl_binding = {};
19793 dsl_binding.binding = 0;
19794 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19795 dsl_binding.descriptorCount = 1;
19796 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19797 dsl_binding.pImmutableSamplers = NULL;
19798
19799 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19800 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19801 ds_layout_ci.pNext = NULL;
19802 ds_layout_ci.bindingCount = 1;
19803 ds_layout_ci.pBindings = &dsl_binding;
19804 VkDescriptorSetLayout ds_layout;
19805 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19806 ASSERT_VK_SUCCESS(err);
19807
19808 VkDescriptorSet descriptor_set;
19809 VkDescriptorSetAllocateInfo alloc_info = {};
19810 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19811 alloc_info.descriptorSetCount = 1;
19812 alloc_info.descriptorPool = ds_pool;
19813 alloc_info.pSetLayouts = &ds_layout;
19814 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19815 ASSERT_VK_SUCCESS(err);
19816
19817 VkWriteDescriptorSet descriptor_write;
19818 memset(&descriptor_write, 0, sizeof(descriptor_write));
19819 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19820 descriptor_write.dstSet = descriptor_set;
19821 descriptor_write.dstBinding = 0;
19822 descriptor_write.descriptorCount = 1;
19823 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19824 descriptor_write.pTexelBufferView = &buffer_view;
19825
19826 // Set pImageInfo and pBufferInfo to invalid values, which should be
19827 // ignored for descriptorType ==
19828 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19829 // This will most likely produce a crash if the parameter_validation
19830 // layer
19831 // does not correctly ignore pImageInfo and pBufferInfo.
19832 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19833 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19834
19835 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19836
19837 m_errorMonitor->VerifyNotFound();
19838
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019839 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19840 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19841 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19842 vkDestroyBuffer(m_device->device(), buffer, NULL);
19843 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19844 }
19845}
19846
Tobin Ehlis8893af82017-05-08 12:52:25 -060019847TEST_F(VkPositiveLayerTest, ImmutableSamplerOnlyDescriptor) {
19848 TEST_DESCRIPTION(
19849 "Bind a DescriptorSet with only an immutable sampler"
19850 "and make sure that we don't warn for no update.");
19851
19852 ASSERT_NO_FATAL_FAILURE(Init());
19853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19854
19855 VkDescriptorPoolSize ds_type_count = {};
19856 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
19857 ds_type_count.descriptorCount = 1;
19858
19859 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19860 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19861 ds_pool_ci.maxSets = 1;
19862 ds_pool_ci.poolSizeCount = 1;
19863 ds_pool_ci.pPoolSizes = &ds_type_count;
19864
19865 VkDescriptorPool ds_pool;
19866 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19867 ASSERT_VK_SUCCESS(err);
19868
19869 VkSamplerCreateInfo sampler_ci = {};
19870 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
19871 sampler_ci.pNext = NULL;
19872 sampler_ci.magFilter = VK_FILTER_NEAREST;
19873 sampler_ci.minFilter = VK_FILTER_NEAREST;
19874 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
19875 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19876 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19877 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
19878 sampler_ci.mipLodBias = 1.0;
19879 sampler_ci.anisotropyEnable = VK_FALSE;
19880 sampler_ci.maxAnisotropy = 1;
19881 sampler_ci.compareEnable = VK_FALSE;
19882 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
19883 sampler_ci.minLod = 1.0;
19884 sampler_ci.maxLod = 1.0;
19885 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
19886 sampler_ci.unnormalizedCoordinates = VK_FALSE;
19887 VkSampler sampler;
19888
19889 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
19890 ASSERT_VK_SUCCESS(err);
19891
19892 VkDescriptorSetLayoutBinding layout_binding = {};
19893 layout_binding.binding = 0;
19894 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
19895 layout_binding.descriptorCount = 1;
19896 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19897 layout_binding.pImmutableSamplers = static_cast<VkSampler *>(&sampler);
19898
19899 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19900 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19901 ds_layout_ci.bindingCount = 1;
19902 ds_layout_ci.pBindings = &layout_binding;
19903 VkDescriptorSetLayout ds_layout;
19904 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19905 ASSERT_VK_SUCCESS(err);
19906
19907 VkDescriptorSetAllocateInfo alloc_info = {};
19908 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19909 alloc_info.descriptorSetCount = 1;
19910 alloc_info.descriptorPool = ds_pool;
19911 alloc_info.pSetLayouts = &ds_layout;
19912 VkDescriptorSet descriptor_set;
19913 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19914 ASSERT_VK_SUCCESS(err);
19915
19916 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19917 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19918 pipeline_layout_ci.pNext = NULL;
19919 pipeline_layout_ci.setLayoutCount = 1;
19920 pipeline_layout_ci.pSetLayouts = &ds_layout;
19921
19922 VkPipelineLayout pipeline_layout;
19923 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19924 ASSERT_VK_SUCCESS(err);
19925
19926 m_errorMonitor->ExpectSuccess();
19927 m_commandBuffer->BeginCommandBuffer();
19928 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
19929
19930 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19931 &descriptor_set, 0, nullptr);
19932 m_errorMonitor->VerifyNotFound();
19933
19934 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19935 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19936 vkDestroySampler(m_device->device(), sampler, NULL);
19937 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19938}
19939
Tobin Ehlisf7428442016-10-25 07:58:24 -060019940TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19941 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19942
Tony Barbour1fa09702017-03-16 12:09:08 -060019943 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019944 // Create layout where two binding #s are "1"
19945 static const uint32_t NUM_BINDINGS = 3;
19946 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19947 dsl_binding[0].binding = 1;
19948 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19949 dsl_binding[0].descriptorCount = 1;
19950 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19951 dsl_binding[0].pImmutableSamplers = NULL;
19952 dsl_binding[1].binding = 0;
19953 dsl_binding[1].descriptorCount = 1;
19954 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19955 dsl_binding[1].descriptorCount = 1;
19956 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19957 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019958 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019959 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19960 dsl_binding[2].descriptorCount = 1;
19961 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19962 dsl_binding[2].pImmutableSamplers = NULL;
19963
19964 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19965 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19966 ds_layout_ci.pNext = NULL;
19967 ds_layout_ci.bindingCount = NUM_BINDINGS;
19968 ds_layout_ci.pBindings = dsl_binding;
19969 VkDescriptorSetLayout ds_layout;
19970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19971 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19972 m_errorMonitor->VerifyFound();
19973}
19974
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019975TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019976 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19977
Tony Barbour1fa09702017-03-16 12:09:08 -060019978 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019979
Tony Barbour552f6c02016-12-21 14:34:07 -070019980 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019981
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019982 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19983
19984 {
19985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19986 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19987 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19988 m_errorMonitor->VerifyFound();
19989 }
19990
19991 {
19992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19993 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19994 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19995 m_errorMonitor->VerifyFound();
19996 }
19997
19998 {
19999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
20000 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
20001 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20002 m_errorMonitor->VerifyFound();
20003 }
20004
20005 {
20006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
20007 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
20008 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20009 m_errorMonitor->VerifyFound();
20010 }
20011
20012 {
20013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
20014 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
20015 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20016 m_errorMonitor->VerifyFound();
20017 }
20018
20019 {
20020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
20021 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
20022 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
20023 m_errorMonitor->VerifyFound();
20024 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020025
20026 {
20027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
20028 VkRect2D scissor = {{-1, 0}, {16, 16}};
20029 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20030 m_errorMonitor->VerifyFound();
20031 }
20032
20033 {
20034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
20035 VkRect2D scissor = {{0, -2}, {16, 16}};
20036 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20037 m_errorMonitor->VerifyFound();
20038 }
20039
20040 {
20041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
20042 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
20043 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20044 m_errorMonitor->VerifyFound();
20045 }
20046
20047 {
20048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
20049 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
20050 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
20051 m_errorMonitor->VerifyFound();
20052 }
20053
Tony Barbour552f6c02016-12-21 14:34:07 -070020054 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060020055}
20056
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020057// This is a positive test. No failures are expected.
20058TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
20059 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
20060 VkResult err;
20061
Tony Barbour1fa09702017-03-16 12:09:08 -060020062 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020063 m_errorMonitor->ExpectSuccess();
20064 VkDescriptorPoolSize ds_type_count = {};
20065 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20066 ds_type_count.descriptorCount = 2;
20067
20068 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20069 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20070 ds_pool_ci.pNext = NULL;
20071 ds_pool_ci.maxSets = 1;
20072 ds_pool_ci.poolSizeCount = 1;
20073 ds_pool_ci.pPoolSizes = &ds_type_count;
20074
20075 VkDescriptorPool ds_pool;
20076 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20077 ASSERT_VK_SUCCESS(err);
20078
20079 // Create layout with two uniform buffer descriptors w/ empty binding between them
20080 static const uint32_t NUM_BINDINGS = 3;
20081 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
20082 dsl_binding[0].binding = 0;
20083 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20084 dsl_binding[0].descriptorCount = 1;
20085 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
20086 dsl_binding[0].pImmutableSamplers = NULL;
20087 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020088 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020089 dsl_binding[2].binding = 2;
20090 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20091 dsl_binding[2].descriptorCount = 1;
20092 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
20093 dsl_binding[2].pImmutableSamplers = NULL;
20094
20095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20097 ds_layout_ci.pNext = NULL;
20098 ds_layout_ci.bindingCount = NUM_BINDINGS;
20099 ds_layout_ci.pBindings = dsl_binding;
20100 VkDescriptorSetLayout ds_layout;
20101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20102 ASSERT_VK_SUCCESS(err);
20103
20104 VkDescriptorSet descriptor_set = {};
20105 VkDescriptorSetAllocateInfo alloc_info = {};
20106 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20107 alloc_info.descriptorSetCount = 1;
20108 alloc_info.descriptorPool = ds_pool;
20109 alloc_info.pSetLayouts = &ds_layout;
20110 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20111 ASSERT_VK_SUCCESS(err);
20112
20113 // Create a buffer to be used for update
20114 VkBufferCreateInfo buff_ci = {};
20115 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20116 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20117 buff_ci.size = 256;
20118 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20119 VkBuffer buffer;
20120 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
20121 ASSERT_VK_SUCCESS(err);
20122 // Have to bind memory to buffer before descriptor update
20123 VkMemoryAllocateInfo mem_alloc = {};
20124 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20125 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020126 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020127 mem_alloc.memoryTypeIndex = 0;
20128
20129 VkMemoryRequirements mem_reqs;
20130 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20131 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
20132 if (!pass) {
20133 vkDestroyBuffer(m_device->device(), buffer, NULL);
20134 return;
20135 }
20136
20137 VkDeviceMemory mem;
20138 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20139 ASSERT_VK_SUCCESS(err);
20140 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20141 ASSERT_VK_SUCCESS(err);
20142
20143 // Only update the descriptor at binding 2
20144 VkDescriptorBufferInfo buff_info = {};
20145 buff_info.buffer = buffer;
20146 buff_info.offset = 0;
20147 buff_info.range = VK_WHOLE_SIZE;
20148 VkWriteDescriptorSet descriptor_write = {};
20149 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20150 descriptor_write.dstBinding = 2;
20151 descriptor_write.descriptorCount = 1;
20152 descriptor_write.pTexelBufferView = nullptr;
20153 descriptor_write.pBufferInfo = &buff_info;
20154 descriptor_write.pImageInfo = nullptr;
20155 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
20156 descriptor_write.dstSet = descriptor_set;
20157
20158 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20159
20160 m_errorMonitor->VerifyNotFound();
20161 // Cleanup
20162 vkFreeMemory(m_device->device(), mem, NULL);
20163 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20164 vkDestroyBuffer(m_device->device(), buffer, NULL);
20165 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20166}
20167
20168// This is a positive test. No failures are expected.
20169TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
20170 VkResult err;
20171 bool pass;
20172
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020173 TEST_DESCRIPTION(
20174 "Create a buffer, allocate memory, bind memory, destroy "
20175 "the buffer, create an image, and bind the same memory to "
20176 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020177
20178 m_errorMonitor->ExpectSuccess();
20179
Tony Barbour1fa09702017-03-16 12:09:08 -060020180 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020181
20182 VkBuffer buffer;
20183 VkImage image;
20184 VkDeviceMemory mem;
20185 VkMemoryRequirements mem_reqs;
20186
20187 VkBufferCreateInfo buf_info = {};
20188 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20189 buf_info.pNext = NULL;
20190 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20191 buf_info.size = 256;
20192 buf_info.queueFamilyIndexCount = 0;
20193 buf_info.pQueueFamilyIndices = NULL;
20194 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20195 buf_info.flags = 0;
20196 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
20197 ASSERT_VK_SUCCESS(err);
20198
20199 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
20200
20201 VkMemoryAllocateInfo alloc_info = {};
20202 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20203 alloc_info.pNext = NULL;
20204 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020205
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020206 // Ensure memory is big enough for both bindings
20207 alloc_info.allocationSize = 0x10000;
20208
20209 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20210 if (!pass) {
20211 vkDestroyBuffer(m_device->device(), buffer, NULL);
20212 return;
20213 }
20214
20215 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20216 ASSERT_VK_SUCCESS(err);
20217
20218 uint8_t *pData;
20219 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
20220 ASSERT_VK_SUCCESS(err);
20221
20222 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
20223
20224 vkUnmapMemory(m_device->device(), mem);
20225
20226 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20227 ASSERT_VK_SUCCESS(err);
20228
20229 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
20230 // memory. In fact, it was never used by the GPU.
20231 // Just be be sure, wait for idle.
20232 vkDestroyBuffer(m_device->device(), buffer, NULL);
20233 vkDeviceWaitIdle(m_device->device());
20234
Tobin Ehlis6a005702016-12-28 15:25:56 -070020235 // Use optimal as some platforms report linear support but then fail image creation
20236 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
20237 VkImageFormatProperties image_format_properties;
20238 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
20239 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
20240 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070020241 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070020242 vkFreeMemory(m_device->device(), mem, NULL);
20243 return;
20244 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020245 VkImageCreateInfo image_create_info = {};
20246 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20247 image_create_info.pNext = NULL;
20248 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20249 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
20250 image_create_info.extent.width = 64;
20251 image_create_info.extent.height = 64;
20252 image_create_info.extent.depth = 1;
20253 image_create_info.mipLevels = 1;
20254 image_create_info.arrayLayers = 1;
20255 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070020256 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020257 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
20258 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
20259 image_create_info.queueFamilyIndexCount = 0;
20260 image_create_info.pQueueFamilyIndices = NULL;
20261 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
20262 image_create_info.flags = 0;
20263
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020264 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070020265 * to be textures or it will be the staging image if they are not.
20266 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020267 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20268 ASSERT_VK_SUCCESS(err);
20269
20270 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
20271
Tobin Ehlis6a005702016-12-28 15:25:56 -070020272 VkMemoryAllocateInfo mem_alloc = {};
20273 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20274 mem_alloc.pNext = NULL;
20275 mem_alloc.allocationSize = 0;
20276 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020277 mem_alloc.allocationSize = mem_reqs.size;
20278
20279 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
20280 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070020281 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020282 vkDestroyImage(m_device->device(), image, NULL);
20283 return;
20284 }
20285
20286 // VALIDATION FAILURE:
20287 err = vkBindImageMemory(m_device->device(), image, mem, 0);
20288 ASSERT_VK_SUCCESS(err);
20289
20290 m_errorMonitor->VerifyNotFound();
20291
20292 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020293 vkDestroyImage(m_device->device(), image, NULL);
20294}
20295
Tony Barbourab713912017-02-02 14:17:35 -070020296// This is a positive test. No failures are expected.
20297TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
20298 VkResult err;
20299
20300 TEST_DESCRIPTION(
20301 "Call all applicable destroy and free routines with NULL"
20302 "handles, expecting no validation errors");
20303
20304 m_errorMonitor->ExpectSuccess();
20305
Tony Barbour1fa09702017-03-16 12:09:08 -060020306 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070020307 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20308 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
20309 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
20310 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
20311 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20312 vkDestroyDevice(VK_NULL_HANDLE, NULL);
20313 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
20314 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
20315 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
20316 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
20317 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
20318 vkDestroyInstance(VK_NULL_HANDLE, NULL);
20319 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
20320 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
20321 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
20322 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
20323 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
20324 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
20325 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
20326 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
20327
20328 VkCommandPool command_pool;
20329 VkCommandPoolCreateInfo pool_create_info{};
20330 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20331 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20332 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20333 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20334 VkCommandBuffer command_buffers[3] = {};
20335 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20336 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20337 command_buffer_allocate_info.commandPool = command_pool;
20338 command_buffer_allocate_info.commandBufferCount = 1;
20339 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20340 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
20341 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
20342 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20343
20344 VkDescriptorPoolSize ds_type_count = {};
20345 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20346 ds_type_count.descriptorCount = 1;
20347
20348 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20349 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20350 ds_pool_ci.pNext = NULL;
20351 ds_pool_ci.maxSets = 1;
20352 ds_pool_ci.poolSizeCount = 1;
20353 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
20354 ds_pool_ci.pPoolSizes = &ds_type_count;
20355
20356 VkDescriptorPool ds_pool;
20357 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20358 ASSERT_VK_SUCCESS(err);
20359
20360 VkDescriptorSetLayoutBinding dsl_binding = {};
20361 dsl_binding.binding = 2;
20362 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20363 dsl_binding.descriptorCount = 1;
20364 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20365 dsl_binding.pImmutableSamplers = NULL;
20366 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20367 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20368 ds_layout_ci.pNext = NULL;
20369 ds_layout_ci.bindingCount = 1;
20370 ds_layout_ci.pBindings = &dsl_binding;
20371 VkDescriptorSetLayout ds_layout;
20372 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20373 ASSERT_VK_SUCCESS(err);
20374
20375 VkDescriptorSet descriptor_sets[3] = {};
20376 VkDescriptorSetAllocateInfo alloc_info = {};
20377 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20378 alloc_info.descriptorSetCount = 1;
20379 alloc_info.descriptorPool = ds_pool;
20380 alloc_info.pSetLayouts = &ds_layout;
20381 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
20382 ASSERT_VK_SUCCESS(err);
20383 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
20384 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20385 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20386
20387 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
20388
20389 m_errorMonitor->VerifyNotFound();
20390}
20391
Tony Barbour626994c2017-02-08 15:29:37 -070020392TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070020393 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070020394
20395 m_errorMonitor->ExpectSuccess();
20396
Tony Barbour1fa09702017-03-16 12:09:08 -060020397 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070020398 VkCommandBuffer cmd_bufs[4];
20399 VkCommandBufferAllocateInfo alloc_info;
20400 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20401 alloc_info.pNext = NULL;
20402 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070020403 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070020404 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20405 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
20406 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020407 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070020408 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
20409 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070020410 ASSERT_TRUE(image.initialized());
20411 VkCommandBufferBeginInfo cb_binfo;
20412 cb_binfo.pNext = NULL;
20413 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20414 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
20415 cb_binfo.flags = 0;
20416 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
20417 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
20418 VkImageMemoryBarrier img_barrier = {};
20419 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20420 img_barrier.pNext = NULL;
20421 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20422 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20423 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20424 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20425 img_barrier.image = image.handle();
20426 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20427 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20428 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20429 img_barrier.subresourceRange.baseArrayLayer = 0;
20430 img_barrier.subresourceRange.baseMipLevel = 0;
20431 img_barrier.subresourceRange.layerCount = 1;
20432 img_barrier.subresourceRange.levelCount = 1;
20433 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20434 &img_barrier);
20435 vkEndCommandBuffer(cmd_bufs[0]);
20436 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
20437 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20438 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20439 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20440 &img_barrier);
20441 vkEndCommandBuffer(cmd_bufs[1]);
20442 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
20443 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20444 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20445 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20446 &img_barrier);
20447 vkEndCommandBuffer(cmd_bufs[2]);
20448 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
20449 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20450 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20451 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
20452 &img_barrier);
20453 vkEndCommandBuffer(cmd_bufs[3]);
20454
20455 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
20456 VkSemaphore semaphore1, semaphore2;
20457 VkSemaphoreCreateInfo semaphore_create_info{};
20458 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20459 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
20460 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
20461 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
20462 VkSubmitInfo submit_info[3];
20463 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20464 submit_info[0].pNext = nullptr;
20465 submit_info[0].commandBufferCount = 1;
20466 submit_info[0].pCommandBuffers = &cmd_bufs[0];
20467 submit_info[0].signalSemaphoreCount = 1;
20468 submit_info[0].pSignalSemaphores = &semaphore1;
20469 submit_info[0].waitSemaphoreCount = 0;
20470 submit_info[0].pWaitDstStageMask = nullptr;
20471 submit_info[0].pWaitDstStageMask = flags;
20472 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20473 submit_info[1].pNext = nullptr;
20474 submit_info[1].commandBufferCount = 1;
20475 submit_info[1].pCommandBuffers = &cmd_bufs[1];
20476 submit_info[1].waitSemaphoreCount = 1;
20477 submit_info[1].pWaitSemaphores = &semaphore1;
20478 submit_info[1].signalSemaphoreCount = 1;
20479 submit_info[1].pSignalSemaphores = &semaphore2;
20480 submit_info[1].pWaitDstStageMask = flags;
20481 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20482 submit_info[2].pNext = nullptr;
20483 submit_info[2].commandBufferCount = 2;
20484 submit_info[2].pCommandBuffers = &cmd_bufs[2];
20485 submit_info[2].waitSemaphoreCount = 1;
20486 submit_info[2].pWaitSemaphores = &semaphore2;
20487 submit_info[2].signalSemaphoreCount = 0;
20488 submit_info[2].pSignalSemaphores = nullptr;
20489 submit_info[2].pWaitDstStageMask = flags;
20490 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
20491 vkQueueWaitIdle(m_device->m_queue);
20492
20493 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
20494 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
20495 m_errorMonitor->VerifyNotFound();
20496}
20497
Tobin Ehlis953e8392016-11-17 10:54:13 -070020498TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
20499 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
20500 // We previously had a bug where dynamic offset of inactive bindings was still being used
20501 VkResult err;
20502 m_errorMonitor->ExpectSuccess();
20503
Tony Barbour1fa09702017-03-16 12:09:08 -060020504 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070020505 ASSERT_NO_FATAL_FAILURE(InitViewport());
20506 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20507
20508 VkDescriptorPoolSize ds_type_count = {};
20509 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20510 ds_type_count.descriptorCount = 3;
20511
20512 VkDescriptorPoolCreateInfo ds_pool_ci = {};
20513 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
20514 ds_pool_ci.pNext = NULL;
20515 ds_pool_ci.maxSets = 1;
20516 ds_pool_ci.poolSizeCount = 1;
20517 ds_pool_ci.pPoolSizes = &ds_type_count;
20518
20519 VkDescriptorPool ds_pool;
20520 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
20521 ASSERT_VK_SUCCESS(err);
20522
20523 const uint32_t BINDING_COUNT = 3;
20524 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020525 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020526 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20527 dsl_binding[0].descriptorCount = 1;
20528 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20529 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020530 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020531 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20532 dsl_binding[1].descriptorCount = 1;
20533 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20534 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070020535 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070020536 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20537 dsl_binding[2].descriptorCount = 1;
20538 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
20539 dsl_binding[2].pImmutableSamplers = NULL;
20540
20541 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
20542 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
20543 ds_layout_ci.pNext = NULL;
20544 ds_layout_ci.bindingCount = BINDING_COUNT;
20545 ds_layout_ci.pBindings = dsl_binding;
20546 VkDescriptorSetLayout ds_layout;
20547 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
20548 ASSERT_VK_SUCCESS(err);
20549
20550 VkDescriptorSet descriptor_set;
20551 VkDescriptorSetAllocateInfo alloc_info = {};
20552 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
20553 alloc_info.descriptorSetCount = 1;
20554 alloc_info.descriptorPool = ds_pool;
20555 alloc_info.pSetLayouts = &ds_layout;
20556 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
20557 ASSERT_VK_SUCCESS(err);
20558
20559 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
20560 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
20561 pipeline_layout_ci.pNext = NULL;
20562 pipeline_layout_ci.setLayoutCount = 1;
20563 pipeline_layout_ci.pSetLayouts = &ds_layout;
20564
20565 VkPipelineLayout pipeline_layout;
20566 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
20567 ASSERT_VK_SUCCESS(err);
20568
20569 // Create two buffers to update the descriptors with
20570 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
20571 uint32_t qfi = 0;
20572 VkBufferCreateInfo buffCI = {};
20573 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20574 buffCI.size = 2048;
20575 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
20576 buffCI.queueFamilyIndexCount = 1;
20577 buffCI.pQueueFamilyIndices = &qfi;
20578
20579 VkBuffer dyub1;
20580 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
20581 ASSERT_VK_SUCCESS(err);
20582 // buffer2
20583 buffCI.size = 1024;
20584 VkBuffer dyub2;
20585 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
20586 ASSERT_VK_SUCCESS(err);
20587 // Allocate memory and bind to buffers
20588 VkMemoryAllocateInfo mem_alloc[2] = {};
20589 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20590 mem_alloc[0].pNext = NULL;
20591 mem_alloc[0].memoryTypeIndex = 0;
20592 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20593 mem_alloc[1].pNext = NULL;
20594 mem_alloc[1].memoryTypeIndex = 0;
20595
20596 VkMemoryRequirements mem_reqs1;
20597 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
20598 VkMemoryRequirements mem_reqs2;
20599 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
20600 mem_alloc[0].allocationSize = mem_reqs1.size;
20601 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
20602 mem_alloc[1].allocationSize = mem_reqs2.size;
20603 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
20604 if (!pass) {
20605 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20606 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20607 return;
20608 }
20609
20610 VkDeviceMemory mem1;
20611 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
20612 ASSERT_VK_SUCCESS(err);
20613 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
20614 ASSERT_VK_SUCCESS(err);
20615 VkDeviceMemory mem2;
20616 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
20617 ASSERT_VK_SUCCESS(err);
20618 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
20619 ASSERT_VK_SUCCESS(err);
20620 // Update descriptors
20621 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
20622 buff_info[0].buffer = dyub1;
20623 buff_info[0].offset = 0;
20624 buff_info[0].range = 256;
20625 buff_info[1].buffer = dyub1;
20626 buff_info[1].offset = 256;
20627 buff_info[1].range = 512;
20628 buff_info[2].buffer = dyub2;
20629 buff_info[2].offset = 0;
20630 buff_info[2].range = 512;
20631
20632 VkWriteDescriptorSet descriptor_write;
20633 memset(&descriptor_write, 0, sizeof(descriptor_write));
20634 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
20635 descriptor_write.dstSet = descriptor_set;
20636 descriptor_write.dstBinding = 0;
20637 descriptor_write.descriptorCount = BINDING_COUNT;
20638 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
20639 descriptor_write.pBufferInfo = buff_info;
20640
20641 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
20642
Tony Barbour552f6c02016-12-21 14:34:07 -070020643 m_commandBuffer->BeginCommandBuffer();
20644 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070020645
20646 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020647 char const *vsSource =
20648 "#version 450\n"
20649 "\n"
20650 "out gl_PerVertex { \n"
20651 " vec4 gl_Position;\n"
20652 "};\n"
20653 "void main(){\n"
20654 " gl_Position = vec4(1);\n"
20655 "}\n";
20656 char const *fsSource =
20657 "#version 450\n"
20658 "\n"
20659 "layout(location=0) out vec4 x;\n"
20660 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
20661 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
20662 "void main(){\n"
20663 " x = vec4(bar1.y) + vec4(bar2.y);\n"
20664 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070020665 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
20666 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
20667 VkPipelineObj pipe(m_device);
20668 pipe.SetViewport(m_viewports);
20669 pipe.SetScissor(m_scissors);
20670 pipe.AddShader(&vs);
20671 pipe.AddShader(&fs);
20672 pipe.AddColorAttachment();
20673 pipe.CreateVKPipeline(pipeline_layout, renderPass());
20674
20675 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
20676 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
20677 // we used to have a bug in this case.
20678 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
20679 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
20680 &descriptor_set, BINDING_COUNT, dyn_off);
20681 Draw(1, 0, 0, 0);
20682 m_errorMonitor->VerifyNotFound();
20683
20684 vkDestroyBuffer(m_device->device(), dyub1, NULL);
20685 vkDestroyBuffer(m_device->device(), dyub2, NULL);
20686 vkFreeMemory(m_device->device(), mem1, NULL);
20687 vkFreeMemory(m_device->device(), mem2, NULL);
20688
20689 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
20690 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
20691 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
20692}
20693
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020694TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020695 TEST_DESCRIPTION(
20696 "Ensure that validations handling of non-coherent memory "
20697 "mapping while using VK_WHOLE_SIZE does not cause access "
20698 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020699 VkResult err;
20700 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060020701 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020702
20703 VkDeviceMemory mem;
20704 VkMemoryRequirements mem_reqs;
20705 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020706 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020707 VkMemoryAllocateInfo alloc_info = {};
20708 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20709 alloc_info.pNext = NULL;
20710 alloc_info.memoryTypeIndex = 0;
20711
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020712 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020713 alloc_info.allocationSize = allocation_size;
20714
20715 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
20716 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 -070020717 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020718 if (!pass) {
20719 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020720 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
20721 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020722 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020723 pass = m_device->phy().set_memory_type(
20724 mem_reqs.memoryTypeBits, &alloc_info,
20725 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
20726 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020727 if (!pass) {
20728 return;
20729 }
20730 }
20731 }
20732
20733 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
20734 ASSERT_VK_SUCCESS(err);
20735
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020736 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020737 m_errorMonitor->ExpectSuccess();
20738 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20739 ASSERT_VK_SUCCESS(err);
20740 VkMappedMemoryRange mmr = {};
20741 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20742 mmr.memory = mem;
20743 mmr.offset = 0;
20744 mmr.size = VK_WHOLE_SIZE;
20745 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20746 ASSERT_VK_SUCCESS(err);
20747 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20748 ASSERT_VK_SUCCESS(err);
20749 m_errorMonitor->VerifyNotFound();
20750 vkUnmapMemory(m_device->device(), mem);
20751
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020752 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020753 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020754 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020755 ASSERT_VK_SUCCESS(err);
20756 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20757 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020758 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020759 mmr.size = VK_WHOLE_SIZE;
20760 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20761 ASSERT_VK_SUCCESS(err);
20762 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20763 ASSERT_VK_SUCCESS(err);
20764 m_errorMonitor->VerifyNotFound();
20765 vkUnmapMemory(m_device->device(), mem);
20766
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020767 // Map with offset and size
20768 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020769 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020770 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020771 ASSERT_VK_SUCCESS(err);
20772 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20773 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020774 mmr.offset = 4 * atom_size;
20775 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020776 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20777 ASSERT_VK_SUCCESS(err);
20778 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20779 ASSERT_VK_SUCCESS(err);
20780 m_errorMonitor->VerifyNotFound();
20781 vkUnmapMemory(m_device->device(), mem);
20782
20783 // Map without offset and flush WHOLE_SIZE with two separate offsets
20784 m_errorMonitor->ExpectSuccess();
20785 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20786 ASSERT_VK_SUCCESS(err);
20787 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20788 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020789 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020790 mmr.size = VK_WHOLE_SIZE;
20791 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20792 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020793 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020794 mmr.size = VK_WHOLE_SIZE;
20795 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20796 ASSERT_VK_SUCCESS(err);
20797 m_errorMonitor->VerifyNotFound();
20798 vkUnmapMemory(m_device->device(), mem);
20799
20800 vkFreeMemory(m_device->device(), mem, NULL);
20801}
20802
20803// This is a positive test. We used to expect error in this case but spec now allows it
20804TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
20805 m_errorMonitor->ExpectSuccess();
20806 vk_testing::Fence testFence;
20807 VkFenceCreateInfo fenceInfo = {};
20808 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20809 fenceInfo.pNext = NULL;
20810
Tony Barbour1fa09702017-03-16 12:09:08 -060020811 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020812 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020813 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020814 VkResult result = vkResetFences(m_device->device(), 1, fences);
20815 ASSERT_VK_SUCCESS(result);
20816
20817 m_errorMonitor->VerifyNotFound();
20818}
20819
20820TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
20821 m_errorMonitor->ExpectSuccess();
20822
Tony Barbour1fa09702017-03-16 12:09:08 -060020823 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020824 VkResult err;
20825
20826 // Record (empty!) command buffer that can be submitted multiple times
20827 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020828 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
20829 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020830 m_commandBuffer->BeginCommandBuffer(&cbbi);
20831 m_commandBuffer->EndCommandBuffer();
20832
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020833 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020834 VkFence fence;
20835 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20836 ASSERT_VK_SUCCESS(err);
20837
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020838 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020839 VkSemaphore s1, s2;
20840 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
20841 ASSERT_VK_SUCCESS(err);
20842 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
20843 ASSERT_VK_SUCCESS(err);
20844
20845 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020846 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020847 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20848 ASSERT_VK_SUCCESS(err);
20849
20850 // Submit CB again, signaling s2.
20851 si.pSignalSemaphores = &s2;
20852 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
20853 ASSERT_VK_SUCCESS(err);
20854
20855 // Wait for fence.
20856 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20857 ASSERT_VK_SUCCESS(err);
20858
20859 // CB is still in flight from second submission, but semaphore s1 is no
20860 // longer in flight. delete it.
20861 vkDestroySemaphore(m_device->device(), s1, nullptr);
20862
20863 m_errorMonitor->VerifyNotFound();
20864
20865 // Force device idle and clean up remaining objects
20866 vkDeviceWaitIdle(m_device->device());
20867 vkDestroySemaphore(m_device->device(), s2, nullptr);
20868 vkDestroyFence(m_device->device(), fence, nullptr);
20869}
20870
20871TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20872 m_errorMonitor->ExpectSuccess();
20873
Tony Barbour1fa09702017-03-16 12:09:08 -060020874 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020875 VkResult err;
20876
20877 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020878 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020879 VkFence f1;
20880 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20881 ASSERT_VK_SUCCESS(err);
20882
20883 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020884 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020885 VkFence f2;
20886 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20887 ASSERT_VK_SUCCESS(err);
20888
20889 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020890 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020891 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20892
20893 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020894 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020895 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20896
20897 // Should have both retired!
20898 vkDestroyFence(m_device->device(), f1, nullptr);
20899 vkDestroyFence(m_device->device(), f2, nullptr);
20900
20901 m_errorMonitor->VerifyNotFound();
20902}
20903
20904TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020905 TEST_DESCRIPTION(
20906 "Verify that creating an image view from an image with valid usage "
20907 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020908
Tony Barbour1fa09702017-03-16 12:09:08 -060020909 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020910
20911 m_errorMonitor->ExpectSuccess();
20912 // Verify that we can create a view with usage INPUT_ATTACHMENT
20913 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020914 image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020915 ASSERT_TRUE(image.initialized());
20916 VkImageView imageView;
20917 VkImageViewCreateInfo ivci = {};
20918 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20919 ivci.image = image.handle();
20920 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20921 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20922 ivci.subresourceRange.layerCount = 1;
20923 ivci.subresourceRange.baseMipLevel = 0;
20924 ivci.subresourceRange.levelCount = 1;
20925 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20926
20927 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20928 m_errorMonitor->VerifyNotFound();
20929 vkDestroyImageView(m_device->device(), imageView, NULL);
20930}
20931
20932// This is a positive test. No failures are expected.
20933TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020934 TEST_DESCRIPTION(
20935 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20936 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020937
Tony Barbour1fa09702017-03-16 12:09:08 -060020938 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020939
20940 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020941 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020942 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020943
20944 m_errorMonitor->ExpectSuccess();
20945
20946 VkImage image;
20947 VkImageCreateInfo image_create_info = {};
20948 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20949 image_create_info.pNext = NULL;
20950 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20951 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20952 image_create_info.extent.width = 64;
20953 image_create_info.extent.height = 64;
20954 image_create_info.extent.depth = 1;
20955 image_create_info.mipLevels = 1;
20956 image_create_info.arrayLayers = 1;
20957 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20958 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20959 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20960 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20961 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20962 ASSERT_VK_SUCCESS(err);
20963
20964 VkMemoryRequirements memory_reqs;
20965 VkDeviceMemory memory_one, memory_two;
20966 bool pass;
20967 VkMemoryAllocateInfo memory_info = {};
20968 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20969 memory_info.pNext = NULL;
20970 memory_info.allocationSize = 0;
20971 memory_info.memoryTypeIndex = 0;
20972 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20973 // Find an image big enough to allow sparse mapping of 2 memory regions
20974 // Increase the image size until it is at least twice the
20975 // size of the required alignment, to ensure we can bind both
20976 // allocated memory blocks to the image on aligned offsets.
20977 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20978 vkDestroyImage(m_device->device(), image, nullptr);
20979 image_create_info.extent.width *= 2;
20980 image_create_info.extent.height *= 2;
20981 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20982 ASSERT_VK_SUCCESS(err);
20983 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20984 }
20985 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20986 // at the end of the first
20987 memory_info.allocationSize = memory_reqs.alignment;
20988 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20989 ASSERT_TRUE(pass);
20990 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20991 ASSERT_VK_SUCCESS(err);
20992 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20993 ASSERT_VK_SUCCESS(err);
20994 VkSparseMemoryBind binds[2];
20995 binds[0].flags = 0;
20996 binds[0].memory = memory_one;
20997 binds[0].memoryOffset = 0;
20998 binds[0].resourceOffset = 0;
20999 binds[0].size = memory_info.allocationSize;
21000 binds[1].flags = 0;
21001 binds[1].memory = memory_two;
21002 binds[1].memoryOffset = 0;
21003 binds[1].resourceOffset = memory_info.allocationSize;
21004 binds[1].size = memory_info.allocationSize;
21005
21006 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
21007 opaqueBindInfo.image = image;
21008 opaqueBindInfo.bindCount = 2;
21009 opaqueBindInfo.pBinds = binds;
21010
21011 VkFence fence = VK_NULL_HANDLE;
21012 VkBindSparseInfo bindSparseInfo = {};
21013 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
21014 bindSparseInfo.imageOpaqueBindCount = 1;
21015 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
21016
21017 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
21018 vkQueueWaitIdle(m_device->m_queue);
21019 vkDestroyImage(m_device->device(), image, NULL);
21020 vkFreeMemory(m_device->device(), memory_one, NULL);
21021 vkFreeMemory(m_device->device(), memory_two, NULL);
21022 m_errorMonitor->VerifyNotFound();
21023}
21024
21025TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021026 TEST_DESCRIPTION(
21027 "Ensure that CmdBeginRenderPass with an attachment's "
21028 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
21029 "the command buffer has prior knowledge of that "
21030 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021031
21032 m_errorMonitor->ExpectSuccess();
21033
Tony Barbour1fa09702017-03-16 12:09:08 -060021034 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021035
21036 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021037 VkAttachmentDescription attachment = {0,
21038 VK_FORMAT_R8G8B8A8_UNORM,
21039 VK_SAMPLE_COUNT_1_BIT,
21040 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21041 VK_ATTACHMENT_STORE_OP_STORE,
21042 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21043 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21044 VK_IMAGE_LAYOUT_UNDEFINED,
21045 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021046
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021047 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021048
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021049 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021050
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021051 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021052
21053 VkRenderPass rp;
21054 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21055 ASSERT_VK_SUCCESS(err);
21056
21057 // A compatible framebuffer.
21058 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021059 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021060 ASSERT_TRUE(image.initialized());
21061
21062 VkImageViewCreateInfo ivci = {
21063 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21064 nullptr,
21065 0,
21066 image.handle(),
21067 VK_IMAGE_VIEW_TYPE_2D,
21068 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021069 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21070 VK_COMPONENT_SWIZZLE_IDENTITY},
21071 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021072 };
21073 VkImageView view;
21074 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21075 ASSERT_VK_SUCCESS(err);
21076
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021077 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021078 VkFramebuffer fb;
21079 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21080 ASSERT_VK_SUCCESS(err);
21081
21082 // Record a single command buffer which uses this renderpass twice. The
21083 // bug is triggered at the beginning of the second renderpass, when the
21084 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021085 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 -070021086 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021087 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21088 vkCmdEndRenderPass(m_commandBuffer->handle());
21089 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21090
21091 m_errorMonitor->VerifyNotFound();
21092
21093 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070021094 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021095
21096 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21097 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21098 vkDestroyImageView(m_device->device(), view, nullptr);
21099}
21100
21101TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021102 TEST_DESCRIPTION(
21103 "This test should pass. Create a Framebuffer and "
21104 "command buffer, bind them together, then destroy "
21105 "command pool and framebuffer and verify there are no "
21106 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021107
21108 m_errorMonitor->ExpectSuccess();
21109
Tony Barbour1fa09702017-03-16 12:09:08 -060021110 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021111
21112 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021113 VkAttachmentDescription attachment = {0,
21114 VK_FORMAT_R8G8B8A8_UNORM,
21115 VK_SAMPLE_COUNT_1_BIT,
21116 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21117 VK_ATTACHMENT_STORE_OP_STORE,
21118 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21119 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21120 VK_IMAGE_LAYOUT_UNDEFINED,
21121 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021122
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021123 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021124
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021125 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021126
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021127 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021128
21129 VkRenderPass rp;
21130 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21131 ASSERT_VK_SUCCESS(err);
21132
21133 // A compatible framebuffer.
21134 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021135 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021136 ASSERT_TRUE(image.initialized());
21137
21138 VkImageViewCreateInfo ivci = {
21139 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21140 nullptr,
21141 0,
21142 image.handle(),
21143 VK_IMAGE_VIEW_TYPE_2D,
21144 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021145 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21146 VK_COMPONENT_SWIZZLE_IDENTITY},
21147 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021148 };
21149 VkImageView view;
21150 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21151 ASSERT_VK_SUCCESS(err);
21152
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021153 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021154 VkFramebuffer fb;
21155 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21156 ASSERT_VK_SUCCESS(err);
21157
21158 // Explicitly create a command buffer to bind the FB to so that we can then
21159 // destroy the command pool in order to implicitly free command buffer
21160 VkCommandPool command_pool;
21161 VkCommandPoolCreateInfo pool_create_info{};
21162 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21163 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21164 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21165 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21166
21167 VkCommandBuffer command_buffer;
21168 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21169 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21170 command_buffer_allocate_info.commandPool = command_pool;
21171 command_buffer_allocate_info.commandBufferCount = 1;
21172 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21173 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21174
21175 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021176 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 -060021177 VkCommandBufferBeginInfo begin_info{};
21178 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21179 vkBeginCommandBuffer(command_buffer, &begin_info);
21180
21181 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21182 vkCmdEndRenderPass(command_buffer);
21183 vkEndCommandBuffer(command_buffer);
21184 vkDestroyImageView(m_device->device(), view, nullptr);
21185 // Destroy command pool to implicitly free command buffer
21186 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21187 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21188 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21189 m_errorMonitor->VerifyNotFound();
21190}
21191
21192TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021193 TEST_DESCRIPTION(
21194 "Ensure that CmdBeginRenderPass applies the layout "
21195 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021196
21197 m_errorMonitor->ExpectSuccess();
21198
Tony Barbour1fa09702017-03-16 12:09:08 -060021199 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021200
21201 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021202 VkAttachmentDescription attachment = {0,
21203 VK_FORMAT_R8G8B8A8_UNORM,
21204 VK_SAMPLE_COUNT_1_BIT,
21205 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21206 VK_ATTACHMENT_STORE_OP_STORE,
21207 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21208 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21209 VK_IMAGE_LAYOUT_UNDEFINED,
21210 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021211
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021212 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021213
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021214 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021215
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021216 VkSubpassDependency dep = {0,
21217 0,
21218 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21219 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21220 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21221 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21222 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021223
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021224 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021225
21226 VkResult err;
21227 VkRenderPass rp;
21228 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21229 ASSERT_VK_SUCCESS(err);
21230
21231 // A compatible framebuffer.
21232 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021233 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021234 ASSERT_TRUE(image.initialized());
21235
21236 VkImageViewCreateInfo ivci = {
21237 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21238 nullptr,
21239 0,
21240 image.handle(),
21241 VK_IMAGE_VIEW_TYPE_2D,
21242 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021243 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21244 VK_COMPONENT_SWIZZLE_IDENTITY},
21245 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021246 };
21247 VkImageView view;
21248 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21249 ASSERT_VK_SUCCESS(err);
21250
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021251 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021252 VkFramebuffer fb;
21253 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21254 ASSERT_VK_SUCCESS(err);
21255
21256 // Record a single command buffer which issues a pipeline barrier w/
21257 // image memory barrier for the attachment. This detects the previously
21258 // missing tracking of the subpass layout by throwing a validation error
21259 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021260 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 -070021261 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021262 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21263
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021264 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
21265 nullptr,
21266 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21267 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21268 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21269 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
21270 VK_QUEUE_FAMILY_IGNORED,
21271 VK_QUEUE_FAMILY_IGNORED,
21272 image.handle(),
21273 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021274 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021275 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21276 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021277
21278 vkCmdEndRenderPass(m_commandBuffer->handle());
21279 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021280 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021281
21282 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21283 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21284 vkDestroyImageView(m_device->device(), view, nullptr);
21285}
21286
21287TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021288 TEST_DESCRIPTION(
21289 "Validate that when an imageView of a depth/stencil image "
21290 "is used as a depth/stencil framebuffer attachment, the "
21291 "aspectMask is ignored and both depth and stencil image "
21292 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021293
Tony Barbour1fa09702017-03-16 12:09:08 -060021294 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021295 VkFormatProperties format_properties;
21296 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
21297 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
21298 return;
21299 }
21300
21301 m_errorMonitor->ExpectSuccess();
21302
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021303 VkAttachmentDescription attachment = {0,
21304 VK_FORMAT_D32_SFLOAT_S8_UINT,
21305 VK_SAMPLE_COUNT_1_BIT,
21306 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21307 VK_ATTACHMENT_STORE_OP_STORE,
21308 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21309 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21310 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
21311 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021312
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021313 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021314
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021315 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021316
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021317 VkSubpassDependency dep = {0,
21318 0,
21319 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21320 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
21321 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21322 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
21323 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021324
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021325 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021326
21327 VkResult err;
21328 VkRenderPass rp;
21329 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21330 ASSERT_VK_SUCCESS(err);
21331
21332 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021333 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
21334 0x26, // usage
21335 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021336 ASSERT_TRUE(image.initialized());
21337 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
21338
21339 VkImageViewCreateInfo ivci = {
21340 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21341 nullptr,
21342 0,
21343 image.handle(),
21344 VK_IMAGE_VIEW_TYPE_2D,
21345 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021346 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
21347 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021348 };
21349 VkImageView view;
21350 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21351 ASSERT_VK_SUCCESS(err);
21352
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021353 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021354 VkFramebuffer fb;
21355 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21356 ASSERT_VK_SUCCESS(err);
21357
Tony Barbour552f6c02016-12-21 14:34:07 -070021358 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021359
21360 VkImageMemoryBarrier imb = {};
21361 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21362 imb.pNext = nullptr;
21363 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21364 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21365 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21366 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
21367 imb.srcQueueFamilyIndex = 0;
21368 imb.dstQueueFamilyIndex = 0;
21369 imb.image = image.handle();
21370 imb.subresourceRange.aspectMask = 0x6;
21371 imb.subresourceRange.baseMipLevel = 0;
21372 imb.subresourceRange.levelCount = 0x1;
21373 imb.subresourceRange.baseArrayLayer = 0;
21374 imb.subresourceRange.layerCount = 0x1;
21375
21376 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021377 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
21378 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021379
Tony Barbour552f6c02016-12-21 14:34:07 -070021380 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021381 QueueCommandBuffer(false);
21382 m_errorMonitor->VerifyNotFound();
21383
21384 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21385 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21386 vkDestroyImageView(m_device->device(), view, nullptr);
21387}
21388
21389TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021390 TEST_DESCRIPTION(
21391 "Ensure that layout transitions work correctly without "
21392 "errors, when an attachment reference is "
21393 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021394
21395 m_errorMonitor->ExpectSuccess();
21396
Tony Barbour1fa09702017-03-16 12:09:08 -060021397 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021398
21399 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021400 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021401
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021402 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021403
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021404 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021405
21406 VkRenderPass rp;
21407 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21408 ASSERT_VK_SUCCESS(err);
21409
21410 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021411 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021412 VkFramebuffer fb;
21413 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21414 ASSERT_VK_SUCCESS(err);
21415
21416 // Record a command buffer which just begins and ends the renderpass. The
21417 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021418 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 -070021419 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021420 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21421 vkCmdEndRenderPass(m_commandBuffer->handle());
21422 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070021423 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021424
21425 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21426 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21427}
21428
21429// This is a positive test. No errors are expected.
21430TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021431 TEST_DESCRIPTION(
21432 "Create a stencil-only attachment with a LOAD_OP set to "
21433 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021434 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060021435 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021436 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021437 if (!depth_format) {
21438 printf(" No Depth + Stencil format found. Skipped.\n");
21439 return;
21440 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021441 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070021442 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021443 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
21444 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021445 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
21446 return;
21447 }
21448
Tony Barbourf887b162017-03-09 10:06:46 -070021449 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021450 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021451 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021452 VkAttachmentDescription att = {};
21453 VkAttachmentReference ref = {};
21454 att.format = depth_stencil_fmt;
21455 att.samples = VK_SAMPLE_COUNT_1_BIT;
21456 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
21457 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21458 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21459 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
21460 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21461 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21462
21463 VkClearValue clear;
21464 clear.depthStencil.depth = 1.0;
21465 clear.depthStencil.stencil = 0;
21466 ref.attachment = 0;
21467 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21468
21469 VkSubpassDescription subpass = {};
21470 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
21471 subpass.flags = 0;
21472 subpass.inputAttachmentCount = 0;
21473 subpass.pInputAttachments = NULL;
21474 subpass.colorAttachmentCount = 0;
21475 subpass.pColorAttachments = NULL;
21476 subpass.pResolveAttachments = NULL;
21477 subpass.pDepthStencilAttachment = &ref;
21478 subpass.preserveAttachmentCount = 0;
21479 subpass.pPreserveAttachments = NULL;
21480
21481 VkRenderPass rp;
21482 VkRenderPassCreateInfo rp_info = {};
21483 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21484 rp_info.attachmentCount = 1;
21485 rp_info.pAttachments = &att;
21486 rp_info.subpassCount = 1;
21487 rp_info.pSubpasses = &subpass;
21488 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
21489 ASSERT_VK_SUCCESS(result);
21490
21491 VkImageView *depthView = m_depthStencil->BindInfo();
21492 VkFramebufferCreateInfo fb_info = {};
21493 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
21494 fb_info.pNext = NULL;
21495 fb_info.renderPass = rp;
21496 fb_info.attachmentCount = 1;
21497 fb_info.pAttachments = depthView;
21498 fb_info.width = 100;
21499 fb_info.height = 100;
21500 fb_info.layers = 1;
21501 VkFramebuffer fb;
21502 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
21503 ASSERT_VK_SUCCESS(result);
21504
21505 VkRenderPassBeginInfo rpbinfo = {};
21506 rpbinfo.clearValueCount = 1;
21507 rpbinfo.pClearValues = &clear;
21508 rpbinfo.pNext = NULL;
21509 rpbinfo.renderPass = rp;
21510 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
21511 rpbinfo.renderArea.extent.width = 100;
21512 rpbinfo.renderArea.extent.height = 100;
21513 rpbinfo.renderArea.offset.x = 0;
21514 rpbinfo.renderArea.offset.y = 0;
21515 rpbinfo.framebuffer = fb;
21516
21517 VkFence fence = {};
21518 VkFenceCreateInfo fence_ci = {};
21519 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21520 fence_ci.pNext = nullptr;
21521 fence_ci.flags = 0;
21522 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
21523 ASSERT_VK_SUCCESS(result);
21524
21525 m_commandBuffer->BeginCommandBuffer();
21526 m_commandBuffer->BeginRenderPass(rpbinfo);
21527 m_commandBuffer->EndRenderPass();
21528 m_commandBuffer->EndCommandBuffer();
21529 m_commandBuffer->QueueCommandBuffer(fence);
21530
21531 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021532 destImage.Init(100, 100, 1, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021533 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021534 VkImageMemoryBarrier barrier = {};
21535 VkImageSubresourceRange range;
21536 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21537 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21538 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
21539 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21540 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
21541 barrier.image = m_depthStencil->handle();
21542 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21543 range.baseMipLevel = 0;
21544 range.levelCount = 1;
21545 range.baseArrayLayer = 0;
21546 range.layerCount = 1;
21547 barrier.subresourceRange = range;
21548 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21549 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
21550 cmdbuf.BeginCommandBuffer();
21551 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 -070021552 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021553 barrier.srcAccessMask = 0;
21554 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
21555 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
21556 barrier.image = destImage.handle();
21557 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
21558 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 -070021559 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021560 VkImageCopy cregion;
21561 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21562 cregion.srcSubresource.mipLevel = 0;
21563 cregion.srcSubresource.baseArrayLayer = 0;
21564 cregion.srcSubresource.layerCount = 1;
21565 cregion.srcOffset.x = 0;
21566 cregion.srcOffset.y = 0;
21567 cregion.srcOffset.z = 0;
21568 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
21569 cregion.dstSubresource.mipLevel = 0;
21570 cregion.dstSubresource.baseArrayLayer = 0;
21571 cregion.dstSubresource.layerCount = 1;
21572 cregion.dstOffset.x = 0;
21573 cregion.dstOffset.y = 0;
21574 cregion.dstOffset.z = 0;
21575 cregion.extent.width = 100;
21576 cregion.extent.height = 100;
21577 cregion.extent.depth = 1;
21578 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021579 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021580 cmdbuf.EndCommandBuffer();
21581
21582 VkSubmitInfo submit_info;
21583 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21584 submit_info.pNext = NULL;
21585 submit_info.waitSemaphoreCount = 0;
21586 submit_info.pWaitSemaphores = NULL;
21587 submit_info.pWaitDstStageMask = NULL;
21588 submit_info.commandBufferCount = 1;
21589 submit_info.pCommandBuffers = &cmdbuf.handle();
21590 submit_info.signalSemaphoreCount = 0;
21591 submit_info.pSignalSemaphores = NULL;
21592
21593 m_errorMonitor->ExpectSuccess();
21594 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21595 m_errorMonitor->VerifyNotFound();
21596
21597 vkQueueWaitIdle(m_device->m_queue);
21598 vkDestroyFence(m_device->device(), fence, nullptr);
21599 vkDestroyRenderPass(m_device->device(), rp, nullptr);
21600 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
21601}
21602
21603// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070021604TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
21605 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
21606
21607 m_errorMonitor->ExpectSuccess();
21608
Tony Barbour1fa09702017-03-16 12:09:08 -060021609 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021610 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060021611 if (!depth_format) {
21612 printf(" No Depth + Stencil format found. Skipped.\n");
21613 return;
21614 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070021615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21616
21617 VkImageMemoryBarrier img_barrier = {};
21618 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
21619 img_barrier.pNext = NULL;
21620 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
21621 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
21622 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21623 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
21624 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21625 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
21626 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
21627 img_barrier.subresourceRange.baseArrayLayer = 0;
21628 img_barrier.subresourceRange.baseMipLevel = 0;
21629 img_barrier.subresourceRange.layerCount = 1;
21630 img_barrier.subresourceRange.levelCount = 1;
21631
21632 {
21633 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021634 img_color.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070021635 ASSERT_TRUE(img_color.initialized());
21636
21637 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021638 img_ds1.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070021639 ASSERT_TRUE(img_ds1.initialized());
21640
21641 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021642 img_ds2.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070021643 ASSERT_TRUE(img_ds2.initialized());
21644
21645 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021646 img_xfer_src.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070021647 ASSERT_TRUE(img_xfer_src.initialized());
21648
21649 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021650 img_xfer_dst.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070021651 ASSERT_TRUE(img_xfer_dst.initialized());
21652
21653 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021654 img_sampled.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070021655 ASSERT_TRUE(img_sampled.initialized());
21656
21657 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060021658 img_input.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070021659 ASSERT_TRUE(img_input.initialized());
21660
21661 const struct {
21662 VkImageObj &image_obj;
21663 VkImageLayout old_layout;
21664 VkImageLayout new_layout;
21665 } buffer_layouts[] = {
21666 // clang-format off
21667 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21668 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21669 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21670 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21671 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21672 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21673 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
21674 // clang-format on
21675 };
21676 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
21677
21678 m_commandBuffer->BeginCommandBuffer();
21679 for (uint32_t i = 0; i < layout_count; ++i) {
21680 img_barrier.image = buffer_layouts[i].image_obj.handle();
21681 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
21682 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
21683 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
21684 : VK_IMAGE_ASPECT_COLOR_BIT;
21685
21686 img_barrier.oldLayout = buffer_layouts[i].old_layout;
21687 img_barrier.newLayout = buffer_layouts[i].new_layout;
21688 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21689 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21690
21691 img_barrier.oldLayout = buffer_layouts[i].new_layout;
21692 img_barrier.newLayout = buffer_layouts[i].old_layout;
21693 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
21694 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
21695 }
21696 m_commandBuffer->EndCommandBuffer();
21697
21698 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
21699 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
21700 }
21701 m_errorMonitor->VerifyNotFound();
21702}
21703
21704// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021705TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
21706 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
21707
21708 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021709 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021710
21711 VkEvent event;
21712 VkEventCreateInfo event_create_info{};
21713 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21714 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21715
21716 VkCommandPool command_pool;
21717 VkCommandPoolCreateInfo pool_create_info{};
21718 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21719 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21720 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21721 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21722
21723 VkCommandBuffer command_buffer;
21724 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21725 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21726 command_buffer_allocate_info.commandPool = command_pool;
21727 command_buffer_allocate_info.commandBufferCount = 1;
21728 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21729 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21730
21731 VkQueue queue = VK_NULL_HANDLE;
21732 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21733
21734 {
21735 VkCommandBufferBeginInfo begin_info{};
21736 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21737 vkBeginCommandBuffer(command_buffer, &begin_info);
21738
21739 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 -070021740 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021741 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
21742 vkEndCommandBuffer(command_buffer);
21743 }
21744 {
21745 VkSubmitInfo submit_info{};
21746 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21747 submit_info.commandBufferCount = 1;
21748 submit_info.pCommandBuffers = &command_buffer;
21749 submit_info.signalSemaphoreCount = 0;
21750 submit_info.pSignalSemaphores = nullptr;
21751 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21752 }
21753 { vkSetEvent(m_device->device(), event); }
21754
21755 vkQueueWaitIdle(queue);
21756
21757 vkDestroyEvent(m_device->device(), event, nullptr);
21758 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21759 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21760
21761 m_errorMonitor->VerifyNotFound();
21762}
21763// This is a positive test. No errors should be generated.
21764TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
21765 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
21766
Tony Barbour1fa09702017-03-16 12:09:08 -060021767 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021768 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021769
21770 m_errorMonitor->ExpectSuccess();
21771
21772 VkQueryPool query_pool;
21773 VkQueryPoolCreateInfo query_pool_create_info{};
21774 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21775 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21776 query_pool_create_info.queryCount = 1;
21777 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21778
21779 VkCommandPool command_pool;
21780 VkCommandPoolCreateInfo pool_create_info{};
21781 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21782 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21783 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21784 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21785
21786 VkCommandBuffer command_buffer;
21787 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21788 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21789 command_buffer_allocate_info.commandPool = command_pool;
21790 command_buffer_allocate_info.commandBufferCount = 1;
21791 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21792 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21793
21794 VkCommandBuffer secondary_command_buffer;
21795 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
21796 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
21797
21798 VkQueue queue = VK_NULL_HANDLE;
21799 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21800
21801 uint32_t qfi = 0;
21802 VkBufferCreateInfo buff_create_info = {};
21803 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21804 buff_create_info.size = 1024;
21805 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21806 buff_create_info.queueFamilyIndexCount = 1;
21807 buff_create_info.pQueueFamilyIndices = &qfi;
21808
21809 VkResult err;
21810 VkBuffer buffer;
21811 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21812 ASSERT_VK_SUCCESS(err);
21813 VkMemoryAllocateInfo mem_alloc = {};
21814 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21815 mem_alloc.pNext = NULL;
21816 mem_alloc.allocationSize = 1024;
21817 mem_alloc.memoryTypeIndex = 0;
21818
21819 VkMemoryRequirements memReqs;
21820 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21821 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21822 if (!pass) {
21823 vkDestroyBuffer(m_device->device(), buffer, NULL);
21824 return;
21825 }
21826
21827 VkDeviceMemory mem;
21828 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21829 ASSERT_VK_SUCCESS(err);
21830 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21831 ASSERT_VK_SUCCESS(err);
21832
21833 VkCommandBufferInheritanceInfo hinfo = {};
21834 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
21835 hinfo.renderPass = VK_NULL_HANDLE;
21836 hinfo.subpass = 0;
21837 hinfo.framebuffer = VK_NULL_HANDLE;
21838 hinfo.occlusionQueryEnable = VK_FALSE;
21839 hinfo.queryFlags = 0;
21840 hinfo.pipelineStatistics = 0;
21841
21842 {
21843 VkCommandBufferBeginInfo begin_info{};
21844 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21845 begin_info.pInheritanceInfo = &hinfo;
21846 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
21847
21848 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
21849 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21850
21851 vkEndCommandBuffer(secondary_command_buffer);
21852
21853 begin_info.pInheritanceInfo = nullptr;
21854 vkBeginCommandBuffer(command_buffer, &begin_info);
21855
21856 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
21857 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
21858
21859 vkEndCommandBuffer(command_buffer);
21860 }
21861 {
21862 VkSubmitInfo submit_info{};
21863 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21864 submit_info.commandBufferCount = 1;
21865 submit_info.pCommandBuffers = &command_buffer;
21866 submit_info.signalSemaphoreCount = 0;
21867 submit_info.pSignalSemaphores = nullptr;
21868 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21869 }
21870
21871 vkQueueWaitIdle(queue);
21872
21873 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21874 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21875 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21876 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21877 vkDestroyBuffer(m_device->device(), buffer, NULL);
21878 vkFreeMemory(m_device->device(), mem, NULL);
21879
21880 m_errorMonitor->VerifyNotFound();
21881}
21882
21883// This is a positive test. No errors should be generated.
21884TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21885 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21886
Tony Barbour1fa09702017-03-16 12:09:08 -060021887 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021888 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021889
21890 m_errorMonitor->ExpectSuccess();
21891
21892 VkQueryPool query_pool;
21893 VkQueryPoolCreateInfo query_pool_create_info{};
21894 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21895 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21896 query_pool_create_info.queryCount = 1;
21897 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21898
21899 VkCommandPool command_pool;
21900 VkCommandPoolCreateInfo pool_create_info{};
21901 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21902 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21903 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21904 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21905
21906 VkCommandBuffer command_buffer[2];
21907 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21908 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21909 command_buffer_allocate_info.commandPool = command_pool;
21910 command_buffer_allocate_info.commandBufferCount = 2;
21911 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21912 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21913
21914 VkQueue queue = VK_NULL_HANDLE;
21915 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21916
21917 uint32_t qfi = 0;
21918 VkBufferCreateInfo buff_create_info = {};
21919 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21920 buff_create_info.size = 1024;
21921 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21922 buff_create_info.queueFamilyIndexCount = 1;
21923 buff_create_info.pQueueFamilyIndices = &qfi;
21924
21925 VkResult err;
21926 VkBuffer buffer;
21927 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21928 ASSERT_VK_SUCCESS(err);
21929 VkMemoryAllocateInfo mem_alloc = {};
21930 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21931 mem_alloc.pNext = NULL;
21932 mem_alloc.allocationSize = 1024;
21933 mem_alloc.memoryTypeIndex = 0;
21934
21935 VkMemoryRequirements memReqs;
21936 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21937 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21938 if (!pass) {
21939 vkDestroyBuffer(m_device->device(), buffer, NULL);
21940 return;
21941 }
21942
21943 VkDeviceMemory mem;
21944 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21945 ASSERT_VK_SUCCESS(err);
21946 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21947 ASSERT_VK_SUCCESS(err);
21948
21949 {
21950 VkCommandBufferBeginInfo begin_info{};
21951 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21952 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21953
21954 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21955 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21956
21957 vkEndCommandBuffer(command_buffer[0]);
21958
21959 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21960
21961 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21962
21963 vkEndCommandBuffer(command_buffer[1]);
21964 }
21965 {
21966 VkSubmitInfo submit_info{};
21967 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21968 submit_info.commandBufferCount = 2;
21969 submit_info.pCommandBuffers = command_buffer;
21970 submit_info.signalSemaphoreCount = 0;
21971 submit_info.pSignalSemaphores = nullptr;
21972 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21973 }
21974
21975 vkQueueWaitIdle(queue);
21976
21977 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21978 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21979 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21980 vkDestroyBuffer(m_device->device(), buffer, NULL);
21981 vkFreeMemory(m_device->device(), mem, NULL);
21982
21983 m_errorMonitor->VerifyNotFound();
21984}
21985
Tony Barbourc46924f2016-11-04 11:49:52 -060021986TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021987 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21988
Tony Barbour1fa09702017-03-16 12:09:08 -060021989 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021990 VkEvent event;
21991 VkEventCreateInfo event_create_info{};
21992 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21993 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21994
21995 VkCommandPool command_pool;
21996 VkCommandPoolCreateInfo pool_create_info{};
21997 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21998 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21999 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22000 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22001
22002 VkCommandBuffer command_buffer;
22003 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22004 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22005 command_buffer_allocate_info.commandPool = command_pool;
22006 command_buffer_allocate_info.commandBufferCount = 1;
22007 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22008 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
22009
22010 VkQueue queue = VK_NULL_HANDLE;
22011 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
22012
22013 {
22014 VkCommandBufferBeginInfo begin_info{};
22015 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22016 vkBeginCommandBuffer(command_buffer, &begin_info);
22017
22018 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022019 vkEndCommandBuffer(command_buffer);
22020 }
22021 {
22022 VkSubmitInfo submit_info{};
22023 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22024 submit_info.commandBufferCount = 1;
22025 submit_info.pCommandBuffers = &command_buffer;
22026 submit_info.signalSemaphoreCount = 0;
22027 submit_info.pSignalSemaphores = nullptr;
22028 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22029 }
22030 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
22032 "that is already in use by a "
22033 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022034 vkSetEvent(m_device->device(), event);
22035 m_errorMonitor->VerifyFound();
22036 }
22037
22038 vkQueueWaitIdle(queue);
22039
22040 vkDestroyEvent(m_device->device(), event, nullptr);
22041 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
22042 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22043}
22044
22045// This is a positive test. No errors should be generated.
22046TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022047 TEST_DESCRIPTION(
22048 "Two command buffers with two separate fences are each "
22049 "run through a Submit & WaitForFences cycle 3 times. This "
22050 "previously revealed a bug so running this positive test "
22051 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022052 m_errorMonitor->ExpectSuccess();
22053
Tony Barbour1fa09702017-03-16 12:09:08 -060022054 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022055 VkQueue queue = VK_NULL_HANDLE;
22056 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
22057
22058 static const uint32_t NUM_OBJECTS = 2;
22059 static const uint32_t NUM_FRAMES = 3;
22060 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
22061 VkFence fences[NUM_OBJECTS] = {};
22062
22063 VkCommandPool cmd_pool;
22064 VkCommandPoolCreateInfo cmd_pool_ci = {};
22065 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22066 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
22067 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22068 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
22069 ASSERT_VK_SUCCESS(err);
22070
22071 VkCommandBufferAllocateInfo cmd_buf_info = {};
22072 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22073 cmd_buf_info.commandPool = cmd_pool;
22074 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22075 cmd_buf_info.commandBufferCount = 1;
22076
22077 VkFenceCreateInfo fence_ci = {};
22078 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22079 fence_ci.pNext = nullptr;
22080 fence_ci.flags = 0;
22081
22082 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22083 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
22084 ASSERT_VK_SUCCESS(err);
22085 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
22086 ASSERT_VK_SUCCESS(err);
22087 }
22088
22089 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
22090 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
22091 // Create empty cmd buffer
22092 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
22093 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22094
22095 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
22096 ASSERT_VK_SUCCESS(err);
22097 err = vkEndCommandBuffer(cmd_buffers[obj]);
22098 ASSERT_VK_SUCCESS(err);
22099
22100 VkSubmitInfo submit_info = {};
22101 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22102 submit_info.commandBufferCount = 1;
22103 submit_info.pCommandBuffers = &cmd_buffers[obj];
22104 // Submit cmd buffer and wait for fence
22105 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
22106 ASSERT_VK_SUCCESS(err);
22107 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
22108 ASSERT_VK_SUCCESS(err);
22109 err = vkResetFences(m_device->device(), 1, &fences[obj]);
22110 ASSERT_VK_SUCCESS(err);
22111 }
22112 }
22113 m_errorMonitor->VerifyNotFound();
22114 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
22115 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
22116 vkDestroyFence(m_device->device(), fences[i], nullptr);
22117 }
22118}
22119// This is a positive test. No errors should be generated.
22120TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022121 TEST_DESCRIPTION(
22122 "Two command buffers, each in a separate QueueSubmit call "
22123 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022124
Tony Barbour1fa09702017-03-16 12:09:08 -060022125 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022126 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022127
22128 m_errorMonitor->ExpectSuccess();
22129
22130 VkSemaphore semaphore;
22131 VkSemaphoreCreateInfo semaphore_create_info{};
22132 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22133 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22134
22135 VkCommandPool command_pool;
22136 VkCommandPoolCreateInfo pool_create_info{};
22137 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22138 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22139 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22140 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22141
22142 VkCommandBuffer command_buffer[2];
22143 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22144 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22145 command_buffer_allocate_info.commandPool = command_pool;
22146 command_buffer_allocate_info.commandBufferCount = 2;
22147 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22148 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22149
22150 VkQueue queue = VK_NULL_HANDLE;
22151 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22152
22153 {
22154 VkCommandBufferBeginInfo begin_info{};
22155 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22156 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22157
22158 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 -070022159 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022160
22161 VkViewport viewport{};
22162 viewport.maxDepth = 1.0f;
22163 viewport.minDepth = 0.0f;
22164 viewport.width = 512;
22165 viewport.height = 512;
22166 viewport.x = 0;
22167 viewport.y = 0;
22168 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22169 vkEndCommandBuffer(command_buffer[0]);
22170 }
22171 {
22172 VkCommandBufferBeginInfo begin_info{};
22173 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22174 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22175
22176 VkViewport viewport{};
22177 viewport.maxDepth = 1.0f;
22178 viewport.minDepth = 0.0f;
22179 viewport.width = 512;
22180 viewport.height = 512;
22181 viewport.x = 0;
22182 viewport.y = 0;
22183 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22184 vkEndCommandBuffer(command_buffer[1]);
22185 }
22186 {
22187 VkSubmitInfo submit_info{};
22188 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22189 submit_info.commandBufferCount = 1;
22190 submit_info.pCommandBuffers = &command_buffer[0];
22191 submit_info.signalSemaphoreCount = 1;
22192 submit_info.pSignalSemaphores = &semaphore;
22193 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22194 }
22195 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022196 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022197 VkSubmitInfo submit_info{};
22198 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22199 submit_info.commandBufferCount = 1;
22200 submit_info.pCommandBuffers = &command_buffer[1];
22201 submit_info.waitSemaphoreCount = 1;
22202 submit_info.pWaitSemaphores = &semaphore;
22203 submit_info.pWaitDstStageMask = flags;
22204 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22205 }
22206
22207 vkQueueWaitIdle(m_device->m_queue);
22208
22209 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22210 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22211 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22212
22213 m_errorMonitor->VerifyNotFound();
22214}
22215
22216// This is a positive test. No errors should be generated.
22217TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022218 TEST_DESCRIPTION(
22219 "Two command buffers, each in a separate QueueSubmit call "
22220 "submitted on separate queues, the second having a fence"
22221 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022222
Tony Barbour1fa09702017-03-16 12:09:08 -060022223 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022224 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022225
22226 m_errorMonitor->ExpectSuccess();
22227
22228 VkFence fence;
22229 VkFenceCreateInfo fence_create_info{};
22230 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22231 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22232
22233 VkSemaphore semaphore;
22234 VkSemaphoreCreateInfo semaphore_create_info{};
22235 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22236 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22237
22238 VkCommandPool command_pool;
22239 VkCommandPoolCreateInfo pool_create_info{};
22240 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22241 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22242 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22243 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22244
22245 VkCommandBuffer command_buffer[2];
22246 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22247 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22248 command_buffer_allocate_info.commandPool = command_pool;
22249 command_buffer_allocate_info.commandBufferCount = 2;
22250 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22251 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22252
22253 VkQueue queue = VK_NULL_HANDLE;
22254 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22255
22256 {
22257 VkCommandBufferBeginInfo begin_info{};
22258 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22259 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22260
22261 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 -070022262 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022263
22264 VkViewport viewport{};
22265 viewport.maxDepth = 1.0f;
22266 viewport.minDepth = 0.0f;
22267 viewport.width = 512;
22268 viewport.height = 512;
22269 viewport.x = 0;
22270 viewport.y = 0;
22271 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22272 vkEndCommandBuffer(command_buffer[0]);
22273 }
22274 {
22275 VkCommandBufferBeginInfo begin_info{};
22276 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22277 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22278
22279 VkViewport viewport{};
22280 viewport.maxDepth = 1.0f;
22281 viewport.minDepth = 0.0f;
22282 viewport.width = 512;
22283 viewport.height = 512;
22284 viewport.x = 0;
22285 viewport.y = 0;
22286 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22287 vkEndCommandBuffer(command_buffer[1]);
22288 }
22289 {
22290 VkSubmitInfo submit_info{};
22291 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22292 submit_info.commandBufferCount = 1;
22293 submit_info.pCommandBuffers = &command_buffer[0];
22294 submit_info.signalSemaphoreCount = 1;
22295 submit_info.pSignalSemaphores = &semaphore;
22296 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22297 }
22298 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022299 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022300 VkSubmitInfo submit_info{};
22301 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22302 submit_info.commandBufferCount = 1;
22303 submit_info.pCommandBuffers = &command_buffer[1];
22304 submit_info.waitSemaphoreCount = 1;
22305 submit_info.pWaitSemaphores = &semaphore;
22306 submit_info.pWaitDstStageMask = flags;
22307 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22308 }
22309
22310 vkQueueWaitIdle(m_device->m_queue);
22311
22312 vkDestroyFence(m_device->device(), fence, nullptr);
22313 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22314 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22315 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22316
22317 m_errorMonitor->VerifyNotFound();
22318}
22319
22320// This is a positive test. No errors should be generated.
22321TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022322 TEST_DESCRIPTION(
22323 "Two command buffers, each in a separate QueueSubmit call "
22324 "submitted on separate queues, the second having a fence"
22325 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022326
Tony Barbour1fa09702017-03-16 12:09:08 -060022327 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022328 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022329
22330 m_errorMonitor->ExpectSuccess();
22331
22332 VkFence fence;
22333 VkFenceCreateInfo fence_create_info{};
22334 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22335 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22336
22337 VkSemaphore semaphore;
22338 VkSemaphoreCreateInfo semaphore_create_info{};
22339 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22340 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22341
22342 VkCommandPool command_pool;
22343 VkCommandPoolCreateInfo pool_create_info{};
22344 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22345 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22346 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22347 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22348
22349 VkCommandBuffer command_buffer[2];
22350 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22351 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22352 command_buffer_allocate_info.commandPool = command_pool;
22353 command_buffer_allocate_info.commandBufferCount = 2;
22354 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22355 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22356
22357 VkQueue queue = VK_NULL_HANDLE;
22358 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22359
22360 {
22361 VkCommandBufferBeginInfo begin_info{};
22362 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22363 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22364
22365 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 -070022366 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022367
22368 VkViewport viewport{};
22369 viewport.maxDepth = 1.0f;
22370 viewport.minDepth = 0.0f;
22371 viewport.width = 512;
22372 viewport.height = 512;
22373 viewport.x = 0;
22374 viewport.y = 0;
22375 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22376 vkEndCommandBuffer(command_buffer[0]);
22377 }
22378 {
22379 VkCommandBufferBeginInfo begin_info{};
22380 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22381 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22382
22383 VkViewport viewport{};
22384 viewport.maxDepth = 1.0f;
22385 viewport.minDepth = 0.0f;
22386 viewport.width = 512;
22387 viewport.height = 512;
22388 viewport.x = 0;
22389 viewport.y = 0;
22390 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22391 vkEndCommandBuffer(command_buffer[1]);
22392 }
22393 {
22394 VkSubmitInfo submit_info{};
22395 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22396 submit_info.commandBufferCount = 1;
22397 submit_info.pCommandBuffers = &command_buffer[0];
22398 submit_info.signalSemaphoreCount = 1;
22399 submit_info.pSignalSemaphores = &semaphore;
22400 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22401 }
22402 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022403 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022404 VkSubmitInfo submit_info{};
22405 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22406 submit_info.commandBufferCount = 1;
22407 submit_info.pCommandBuffers = &command_buffer[1];
22408 submit_info.waitSemaphoreCount = 1;
22409 submit_info.pWaitSemaphores = &semaphore;
22410 submit_info.pWaitDstStageMask = flags;
22411 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22412 }
22413
22414 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22415 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22416
22417 vkDestroyFence(m_device->device(), fence, nullptr);
22418 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22419 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22420 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22421
22422 m_errorMonitor->VerifyNotFound();
22423}
22424
22425TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060022426 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022427 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022428 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022429 return;
22430 }
22431
22432 VkResult err;
22433
22434 m_errorMonitor->ExpectSuccess();
22435
22436 VkQueue q0 = m_device->m_queue;
22437 VkQueue q1 = nullptr;
22438 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
22439 ASSERT_NE(q1, nullptr);
22440
22441 // An (empty) command buffer. We must have work in the first submission --
22442 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022443 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022444 VkCommandPool pool;
22445 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
22446 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022447 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
22448 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022449 VkCommandBuffer cb;
22450 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
22451 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022452 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022453 err = vkBeginCommandBuffer(cb, &cbbi);
22454 ASSERT_VK_SUCCESS(err);
22455 err = vkEndCommandBuffer(cb);
22456 ASSERT_VK_SUCCESS(err);
22457
22458 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022459 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022460 VkSemaphore s;
22461 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
22462 ASSERT_VK_SUCCESS(err);
22463
22464 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022465 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022466
22467 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
22468 ASSERT_VK_SUCCESS(err);
22469
22470 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022471 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022472 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022473
22474 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
22475 ASSERT_VK_SUCCESS(err);
22476
22477 // Wait for q0 idle
22478 err = vkQueueWaitIdle(q0);
22479 ASSERT_VK_SUCCESS(err);
22480
22481 // Command buffer should have been completed (it was on q0); reset the pool.
22482 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
22483
22484 m_errorMonitor->VerifyNotFound();
22485
22486 // Force device completely idle and clean up resources
22487 vkDeviceWaitIdle(m_device->device());
22488 vkDestroyCommandPool(m_device->device(), pool, nullptr);
22489 vkDestroySemaphore(m_device->device(), s, nullptr);
22490}
22491
22492// This is a positive test. No errors should be generated.
22493TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022494 TEST_DESCRIPTION(
22495 "Two command buffers, each in a separate QueueSubmit call "
22496 "submitted on separate queues, the second having a fence, "
22497 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022498
Tony Barbour1fa09702017-03-16 12:09:08 -060022499 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022500 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022501
22502 m_errorMonitor->ExpectSuccess();
22503
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022504 VkFence fence;
22505 VkFenceCreateInfo fence_create_info{};
22506 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22507 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22508
22509 VkSemaphore semaphore;
22510 VkSemaphoreCreateInfo semaphore_create_info{};
22511 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22512 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22513
22514 VkCommandPool command_pool;
22515 VkCommandPoolCreateInfo pool_create_info{};
22516 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22517 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22518 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22519 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22520
22521 VkCommandBuffer command_buffer[2];
22522 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22523 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22524 command_buffer_allocate_info.commandPool = command_pool;
22525 command_buffer_allocate_info.commandBufferCount = 2;
22526 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22527 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22528
22529 VkQueue queue = VK_NULL_HANDLE;
22530 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
22531
22532 {
22533 VkCommandBufferBeginInfo begin_info{};
22534 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22535 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22536
22537 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 -070022538 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022539
22540 VkViewport viewport{};
22541 viewport.maxDepth = 1.0f;
22542 viewport.minDepth = 0.0f;
22543 viewport.width = 512;
22544 viewport.height = 512;
22545 viewport.x = 0;
22546 viewport.y = 0;
22547 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22548 vkEndCommandBuffer(command_buffer[0]);
22549 }
22550 {
22551 VkCommandBufferBeginInfo begin_info{};
22552 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22553 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22554
22555 VkViewport viewport{};
22556 viewport.maxDepth = 1.0f;
22557 viewport.minDepth = 0.0f;
22558 viewport.width = 512;
22559 viewport.height = 512;
22560 viewport.x = 0;
22561 viewport.y = 0;
22562 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22563 vkEndCommandBuffer(command_buffer[1]);
22564 }
22565 {
22566 VkSubmitInfo submit_info{};
22567 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22568 submit_info.commandBufferCount = 1;
22569 submit_info.pCommandBuffers = &command_buffer[0];
22570 submit_info.signalSemaphoreCount = 1;
22571 submit_info.pSignalSemaphores = &semaphore;
22572 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
22573 }
22574 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022575 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022576 VkSubmitInfo submit_info{};
22577 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22578 submit_info.commandBufferCount = 1;
22579 submit_info.pCommandBuffers = &command_buffer[1];
22580 submit_info.waitSemaphoreCount = 1;
22581 submit_info.pWaitSemaphores = &semaphore;
22582 submit_info.pWaitDstStageMask = flags;
22583 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22584 }
22585
22586 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22587
22588 vkDestroyFence(m_device->device(), fence, nullptr);
22589 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22590 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22591 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22592
22593 m_errorMonitor->VerifyNotFound();
22594}
22595
22596// This is a positive test. No errors should be generated.
22597TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022598 TEST_DESCRIPTION(
22599 "Two command buffers, each in a separate QueueSubmit call "
22600 "on the same queue, sharing a signal/wait semaphore, the "
22601 "second having a fence, "
22602 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022603
22604 m_errorMonitor->ExpectSuccess();
22605
Tony Barbour1fa09702017-03-16 12:09:08 -060022606 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022607 VkFence fence;
22608 VkFenceCreateInfo fence_create_info{};
22609 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22610 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22611
22612 VkSemaphore semaphore;
22613 VkSemaphoreCreateInfo semaphore_create_info{};
22614 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22615 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22616
22617 VkCommandPool command_pool;
22618 VkCommandPoolCreateInfo pool_create_info{};
22619 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22620 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22621 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22622 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22623
22624 VkCommandBuffer command_buffer[2];
22625 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22626 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22627 command_buffer_allocate_info.commandPool = command_pool;
22628 command_buffer_allocate_info.commandBufferCount = 2;
22629 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22630 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22631
22632 {
22633 VkCommandBufferBeginInfo begin_info{};
22634 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22635 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22636
22637 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 -070022638 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022639
22640 VkViewport viewport{};
22641 viewport.maxDepth = 1.0f;
22642 viewport.minDepth = 0.0f;
22643 viewport.width = 512;
22644 viewport.height = 512;
22645 viewport.x = 0;
22646 viewport.y = 0;
22647 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22648 vkEndCommandBuffer(command_buffer[0]);
22649 }
22650 {
22651 VkCommandBufferBeginInfo begin_info{};
22652 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22653 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22654
22655 VkViewport viewport{};
22656 viewport.maxDepth = 1.0f;
22657 viewport.minDepth = 0.0f;
22658 viewport.width = 512;
22659 viewport.height = 512;
22660 viewport.x = 0;
22661 viewport.y = 0;
22662 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22663 vkEndCommandBuffer(command_buffer[1]);
22664 }
22665 {
22666 VkSubmitInfo submit_info{};
22667 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22668 submit_info.commandBufferCount = 1;
22669 submit_info.pCommandBuffers = &command_buffer[0];
22670 submit_info.signalSemaphoreCount = 1;
22671 submit_info.pSignalSemaphores = &semaphore;
22672 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22673 }
22674 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022675 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022676 VkSubmitInfo submit_info{};
22677 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22678 submit_info.commandBufferCount = 1;
22679 submit_info.pCommandBuffers = &command_buffer[1];
22680 submit_info.waitSemaphoreCount = 1;
22681 submit_info.pWaitSemaphores = &semaphore;
22682 submit_info.pWaitDstStageMask = flags;
22683 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22684 }
22685
22686 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22687
22688 vkDestroyFence(m_device->device(), fence, nullptr);
22689 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22690 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22691 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22692
22693 m_errorMonitor->VerifyNotFound();
22694}
22695
22696// This is a positive test. No errors should be generated.
22697TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022698 TEST_DESCRIPTION(
22699 "Two command buffers, each in a separate QueueSubmit call "
22700 "on the same queue, no fences, followed by a third QueueSubmit with NO "
22701 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022702
22703 m_errorMonitor->ExpectSuccess();
22704
Tony Barbour1fa09702017-03-16 12:09:08 -060022705 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022706 VkFence fence;
22707 VkFenceCreateInfo fence_create_info{};
22708 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22709 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22710
22711 VkCommandPool command_pool;
22712 VkCommandPoolCreateInfo pool_create_info{};
22713 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22714 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22715 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22716 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22717
22718 VkCommandBuffer command_buffer[2];
22719 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22720 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22721 command_buffer_allocate_info.commandPool = command_pool;
22722 command_buffer_allocate_info.commandBufferCount = 2;
22723 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22724 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22725
22726 {
22727 VkCommandBufferBeginInfo begin_info{};
22728 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22729 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22730
22731 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 -070022732 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022733
22734 VkViewport viewport{};
22735 viewport.maxDepth = 1.0f;
22736 viewport.minDepth = 0.0f;
22737 viewport.width = 512;
22738 viewport.height = 512;
22739 viewport.x = 0;
22740 viewport.y = 0;
22741 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22742 vkEndCommandBuffer(command_buffer[0]);
22743 }
22744 {
22745 VkCommandBufferBeginInfo begin_info{};
22746 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22747 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22748
22749 VkViewport viewport{};
22750 viewport.maxDepth = 1.0f;
22751 viewport.minDepth = 0.0f;
22752 viewport.width = 512;
22753 viewport.height = 512;
22754 viewport.x = 0;
22755 viewport.y = 0;
22756 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22757 vkEndCommandBuffer(command_buffer[1]);
22758 }
22759 {
22760 VkSubmitInfo submit_info{};
22761 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22762 submit_info.commandBufferCount = 1;
22763 submit_info.pCommandBuffers = &command_buffer[0];
22764 submit_info.signalSemaphoreCount = 0;
22765 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22766 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22767 }
22768 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022769 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022770 VkSubmitInfo submit_info{};
22771 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22772 submit_info.commandBufferCount = 1;
22773 submit_info.pCommandBuffers = &command_buffer[1];
22774 submit_info.waitSemaphoreCount = 0;
22775 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22776 submit_info.pWaitDstStageMask = flags;
22777 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22778 }
22779
22780 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
22781
22782 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22783 ASSERT_VK_SUCCESS(err);
22784
22785 vkDestroyFence(m_device->device(), fence, nullptr);
22786 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22787 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22788
22789 m_errorMonitor->VerifyNotFound();
22790}
22791
22792// This is a positive test. No errors should be generated.
22793TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022794 TEST_DESCRIPTION(
22795 "Two command buffers, each in a separate QueueSubmit call "
22796 "on the same queue, the second having a fence, followed "
22797 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022798
22799 m_errorMonitor->ExpectSuccess();
22800
Tony Barbour1fa09702017-03-16 12:09:08 -060022801 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022802 VkFence fence;
22803 VkFenceCreateInfo fence_create_info{};
22804 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22805 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22806
22807 VkCommandPool command_pool;
22808 VkCommandPoolCreateInfo pool_create_info{};
22809 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22810 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22811 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22812 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22813
22814 VkCommandBuffer command_buffer[2];
22815 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22816 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22817 command_buffer_allocate_info.commandPool = command_pool;
22818 command_buffer_allocate_info.commandBufferCount = 2;
22819 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22820 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22821
22822 {
22823 VkCommandBufferBeginInfo begin_info{};
22824 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22825 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22826
22827 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 -070022828 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022829
22830 VkViewport viewport{};
22831 viewport.maxDepth = 1.0f;
22832 viewport.minDepth = 0.0f;
22833 viewport.width = 512;
22834 viewport.height = 512;
22835 viewport.x = 0;
22836 viewport.y = 0;
22837 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22838 vkEndCommandBuffer(command_buffer[0]);
22839 }
22840 {
22841 VkCommandBufferBeginInfo begin_info{};
22842 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22843 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22844
22845 VkViewport viewport{};
22846 viewport.maxDepth = 1.0f;
22847 viewport.minDepth = 0.0f;
22848 viewport.width = 512;
22849 viewport.height = 512;
22850 viewport.x = 0;
22851 viewport.y = 0;
22852 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22853 vkEndCommandBuffer(command_buffer[1]);
22854 }
22855 {
22856 VkSubmitInfo submit_info{};
22857 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22858 submit_info.commandBufferCount = 1;
22859 submit_info.pCommandBuffers = &command_buffer[0];
22860 submit_info.signalSemaphoreCount = 0;
22861 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22862 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22863 }
22864 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022865 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022866 VkSubmitInfo submit_info{};
22867 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22868 submit_info.commandBufferCount = 1;
22869 submit_info.pCommandBuffers = &command_buffer[1];
22870 submit_info.waitSemaphoreCount = 0;
22871 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22872 submit_info.pWaitDstStageMask = flags;
22873 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22874 }
22875
22876 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22877
22878 vkDestroyFence(m_device->device(), fence, nullptr);
22879 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22880 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22881
22882 m_errorMonitor->VerifyNotFound();
22883}
22884
22885// This is a positive test. No errors should be generated.
22886TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022887 TEST_DESCRIPTION(
22888 "Two command buffers each in a separate SubmitInfo sent in a single "
22889 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022890 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022891
22892 m_errorMonitor->ExpectSuccess();
22893
22894 VkFence fence;
22895 VkFenceCreateInfo fence_create_info{};
22896 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22897 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22898
22899 VkSemaphore semaphore;
22900 VkSemaphoreCreateInfo semaphore_create_info{};
22901 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22902 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22903
22904 VkCommandPool command_pool;
22905 VkCommandPoolCreateInfo pool_create_info{};
22906 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22907 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22908 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22909 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22910
22911 VkCommandBuffer command_buffer[2];
22912 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22913 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22914 command_buffer_allocate_info.commandPool = command_pool;
22915 command_buffer_allocate_info.commandBufferCount = 2;
22916 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22917 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22918
22919 {
22920 VkCommandBufferBeginInfo begin_info{};
22921 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22922 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22923
22924 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 -070022925 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022926
22927 VkViewport viewport{};
22928 viewport.maxDepth = 1.0f;
22929 viewport.minDepth = 0.0f;
22930 viewport.width = 512;
22931 viewport.height = 512;
22932 viewport.x = 0;
22933 viewport.y = 0;
22934 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22935 vkEndCommandBuffer(command_buffer[0]);
22936 }
22937 {
22938 VkCommandBufferBeginInfo begin_info{};
22939 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22940 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22941
22942 VkViewport viewport{};
22943 viewport.maxDepth = 1.0f;
22944 viewport.minDepth = 0.0f;
22945 viewport.width = 512;
22946 viewport.height = 512;
22947 viewport.x = 0;
22948 viewport.y = 0;
22949 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22950 vkEndCommandBuffer(command_buffer[1]);
22951 }
22952 {
22953 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022954 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022955
22956 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22957 submit_info[0].pNext = NULL;
22958 submit_info[0].commandBufferCount = 1;
22959 submit_info[0].pCommandBuffers = &command_buffer[0];
22960 submit_info[0].signalSemaphoreCount = 1;
22961 submit_info[0].pSignalSemaphores = &semaphore;
22962 submit_info[0].waitSemaphoreCount = 0;
22963 submit_info[0].pWaitSemaphores = NULL;
22964 submit_info[0].pWaitDstStageMask = 0;
22965
22966 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22967 submit_info[1].pNext = NULL;
22968 submit_info[1].commandBufferCount = 1;
22969 submit_info[1].pCommandBuffers = &command_buffer[1];
22970 submit_info[1].waitSemaphoreCount = 1;
22971 submit_info[1].pWaitSemaphores = &semaphore;
22972 submit_info[1].pWaitDstStageMask = flags;
22973 submit_info[1].signalSemaphoreCount = 0;
22974 submit_info[1].pSignalSemaphores = NULL;
22975 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22976 }
22977
22978 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22979
22980 vkDestroyFence(m_device->device(), fence, nullptr);
22981 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22982 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22983 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22984
22985 m_errorMonitor->VerifyNotFound();
22986}
22987
22988TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22989 m_errorMonitor->ExpectSuccess();
22990
Tony Barbour1fa09702017-03-16 12:09:08 -060022991 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022992 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22993
Tony Barbour552f6c02016-12-21 14:34:07 -070022994 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022995
22996 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22997 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22998 m_errorMonitor->VerifyNotFound();
22999 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
23000 m_errorMonitor->VerifyNotFound();
23001 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
23002 m_errorMonitor->VerifyNotFound();
23003
23004 m_commandBuffer->EndCommandBuffer();
23005 m_errorMonitor->VerifyNotFound();
23006}
23007
23008TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023009 TEST_DESCRIPTION(
23010 "Positive test where we create a renderpass with an "
23011 "attachment that uses LOAD_OP_CLEAR, the first subpass "
23012 "has a valid layout, and a second subpass then uses a "
23013 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023014 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060023015 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060023016 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070023017 if (!depth_format) {
23018 printf(" No Depth + Stencil format found. Skipped.\n");
23019 return;
23020 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023021
23022 VkAttachmentReference attach[2] = {};
23023 attach[0].attachment = 0;
23024 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
23025 attach[1].attachment = 0;
23026 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
23027 VkSubpassDescription subpasses[2] = {};
23028 // First subpass clears DS attach on load
23029 subpasses[0].pDepthStencilAttachment = &attach[0];
23030 // 2nd subpass reads in DS as input attachment
23031 subpasses[1].inputAttachmentCount = 1;
23032 subpasses[1].pInputAttachments = &attach[1];
23033 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070023034 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023035 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
23036 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
23037 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
23038 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
23039 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
23040 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
23041 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
23042 VkRenderPassCreateInfo rpci = {};
23043 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
23044 rpci.attachmentCount = 1;
23045 rpci.pAttachments = &attach_desc;
23046 rpci.subpassCount = 2;
23047 rpci.pSubpasses = subpasses;
23048
23049 // Now create RenderPass and verify no errors
23050 VkRenderPass rp;
23051 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
23052 m_errorMonitor->VerifyNotFound();
23053
23054 vkDestroyRenderPass(m_device->device(), rp, NULL);
23055}
23056
Tobin Ehlis01103de2017-02-16 13:22:47 -070023057TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
23058 TEST_DESCRIPTION(
23059 "Create a render pass with depth-stencil attachment where layout transition "
23060 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
23061 "transition has correctly occurred at queue submit time with no validation errors.");
23062
Tony Barbour1fa09702017-03-16 12:09:08 -060023063 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060023064 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070023065 if (!depth_format) {
23066 printf(" No Depth + Stencil format found. Skipped.\n");
23067 return;
23068 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070023069 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070023070 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023071 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
23072 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070023073 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070023074 return;
23075 }
23076
23077 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070023078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23079
23080 // A renderpass with one depth/stencil attachment.
23081 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070023082 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023083 VK_SAMPLE_COUNT_1_BIT,
23084 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23085 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23086 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
23087 VK_ATTACHMENT_STORE_OP_DONT_CARE,
23088 VK_IMAGE_LAYOUT_UNDEFINED,
23089 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23090
23091 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
23092
23093 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
23094
23095 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
23096
23097 VkRenderPass rp;
23098 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23099 ASSERT_VK_SUCCESS(err);
23100 // A compatible ds image.
23101 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060023102 image.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis01103de2017-02-16 13:22:47 -070023103 ASSERT_TRUE(image.initialized());
23104
23105 VkImageViewCreateInfo ivci = {
23106 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
23107 nullptr,
23108 0,
23109 image.handle(),
23110 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070023111 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070023112 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
23113 VK_COMPONENT_SWIZZLE_IDENTITY},
23114 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
23115 };
23116 VkImageView view;
23117 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
23118 ASSERT_VK_SUCCESS(err);
23119
23120 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
23121 VkFramebuffer fb;
23122 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
23123 ASSERT_VK_SUCCESS(err);
23124
23125 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
23126 m_commandBuffer->BeginCommandBuffer();
23127 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
23128 vkCmdEndRenderPass(m_commandBuffer->handle());
23129 m_commandBuffer->EndCommandBuffer();
23130 QueueCommandBuffer(false);
23131 m_errorMonitor->VerifyNotFound();
23132
23133 // Cleanup
23134 vkDestroyImageView(m_device->device(), view, NULL);
23135 vkDestroyRenderPass(m_device->device(), rp, NULL);
23136 vkDestroyFramebuffer(m_device->device(), fb, NULL);
23137}
23138
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023139TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023140 TEST_DESCRIPTION(
23141 "Test that pipeline validation accepts matrices passed "
23142 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023143 m_errorMonitor->ExpectSuccess();
23144
Tony Barbour1fa09702017-03-16 12:09:08 -060023145 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23147
23148 VkVertexInputBindingDescription input_binding;
23149 memset(&input_binding, 0, sizeof(input_binding));
23150
23151 VkVertexInputAttributeDescription input_attribs[2];
23152 memset(input_attribs, 0, sizeof(input_attribs));
23153
23154 for (int i = 0; i < 2; i++) {
23155 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23156 input_attribs[i].location = i;
23157 }
23158
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023159 char const *vsSource =
23160 "#version 450\n"
23161 "\n"
23162 "layout(location=0) in mat2x4 x;\n"
23163 "out gl_PerVertex {\n"
23164 " vec4 gl_Position;\n"
23165 "};\n"
23166 "void main(){\n"
23167 " gl_Position = x[0] + x[1];\n"
23168 "}\n";
23169 char const *fsSource =
23170 "#version 450\n"
23171 "\n"
23172 "layout(location=0) out vec4 color;\n"
23173 "void main(){\n"
23174 " color = vec4(1);\n"
23175 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023176
23177 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23178 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23179
23180 VkPipelineObj pipe(m_device);
23181 pipe.AddColorAttachment();
23182 pipe.AddShader(&vs);
23183 pipe.AddShader(&fs);
23184
23185 pipe.AddVertexInputBindings(&input_binding, 1);
23186 pipe.AddVertexInputAttribs(input_attribs, 2);
23187
23188 VkDescriptorSetObj descriptorSet(m_device);
23189 descriptorSet.AppendDummy();
23190 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23191
23192 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23193
23194 /* expect success */
23195 m_errorMonitor->VerifyNotFound();
23196}
23197
23198TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
23199 m_errorMonitor->ExpectSuccess();
23200
Tony Barbour1fa09702017-03-16 12:09:08 -060023201 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023202 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23203
23204 VkVertexInputBindingDescription input_binding;
23205 memset(&input_binding, 0, sizeof(input_binding));
23206
23207 VkVertexInputAttributeDescription input_attribs[2];
23208 memset(input_attribs, 0, sizeof(input_attribs));
23209
23210 for (int i = 0; i < 2; i++) {
23211 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23212 input_attribs[i].location = i;
23213 }
23214
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023215 char const *vsSource =
23216 "#version 450\n"
23217 "\n"
23218 "layout(location=0) in vec4 x[2];\n"
23219 "out gl_PerVertex {\n"
23220 " vec4 gl_Position;\n"
23221 "};\n"
23222 "void main(){\n"
23223 " gl_Position = x[0] + x[1];\n"
23224 "}\n";
23225 char const *fsSource =
23226 "#version 450\n"
23227 "\n"
23228 "layout(location=0) out vec4 color;\n"
23229 "void main(){\n"
23230 " color = vec4(1);\n"
23231 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023232
23233 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23234 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23235
23236 VkPipelineObj pipe(m_device);
23237 pipe.AddColorAttachment();
23238 pipe.AddShader(&vs);
23239 pipe.AddShader(&fs);
23240
23241 pipe.AddVertexInputBindings(&input_binding, 1);
23242 pipe.AddVertexInputAttribs(input_attribs, 2);
23243
23244 VkDescriptorSetObj descriptorSet(m_device);
23245 descriptorSet.AppendDummy();
23246 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23247
23248 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23249
23250 m_errorMonitor->VerifyNotFound();
23251}
23252
23253TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023254 TEST_DESCRIPTION(
23255 "Test that pipeline validation accepts consuming a vertex attribute "
23256 "through multiple vertex shader inputs, each consuming a different "
23257 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023258 m_errorMonitor->ExpectSuccess();
23259
Tony Barbour1fa09702017-03-16 12:09:08 -060023260 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023261 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23262
23263 VkVertexInputBindingDescription input_binding;
23264 memset(&input_binding, 0, sizeof(input_binding));
23265
23266 VkVertexInputAttributeDescription input_attribs[3];
23267 memset(input_attribs, 0, sizeof(input_attribs));
23268
23269 for (int i = 0; i < 3; i++) {
23270 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
23271 input_attribs[i].location = i;
23272 }
23273
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023274 char const *vsSource =
23275 "#version 450\n"
23276 "\n"
23277 "layout(location=0) in vec4 x;\n"
23278 "layout(location=1) in vec3 y1;\n"
23279 "layout(location=1, component=3) in float y2;\n"
23280 "layout(location=2) in vec4 z;\n"
23281 "out gl_PerVertex {\n"
23282 " vec4 gl_Position;\n"
23283 "};\n"
23284 "void main(){\n"
23285 " gl_Position = x + vec4(y1, y2) + z;\n"
23286 "}\n";
23287 char const *fsSource =
23288 "#version 450\n"
23289 "\n"
23290 "layout(location=0) out vec4 color;\n"
23291 "void main(){\n"
23292 " color = vec4(1);\n"
23293 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023294
23295 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23296 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23297
23298 VkPipelineObj pipe(m_device);
23299 pipe.AddColorAttachment();
23300 pipe.AddShader(&vs);
23301 pipe.AddShader(&fs);
23302
23303 pipe.AddVertexInputBindings(&input_binding, 1);
23304 pipe.AddVertexInputAttribs(input_attribs, 3);
23305
23306 VkDescriptorSetObj descriptorSet(m_device);
23307 descriptorSet.AppendDummy();
23308 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23309
23310 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23311
23312 m_errorMonitor->VerifyNotFound();
23313}
23314
23315TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
23316 m_errorMonitor->ExpectSuccess();
23317
Tony Barbour1fa09702017-03-16 12:09:08 -060023318 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023319 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23320
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023321 char const *vsSource =
23322 "#version 450\n"
23323 "out gl_PerVertex {\n"
23324 " vec4 gl_Position;\n"
23325 "};\n"
23326 "void main(){\n"
23327 " gl_Position = vec4(0);\n"
23328 "}\n";
23329 char const *fsSource =
23330 "#version 450\n"
23331 "\n"
23332 "layout(location=0) out vec4 color;\n"
23333 "void main(){\n"
23334 " color = vec4(1);\n"
23335 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023336
23337 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23338 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23339
23340 VkPipelineObj pipe(m_device);
23341 pipe.AddColorAttachment();
23342 pipe.AddShader(&vs);
23343 pipe.AddShader(&fs);
23344
23345 VkDescriptorSetObj descriptorSet(m_device);
23346 descriptorSet.AppendDummy();
23347 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23348
23349 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23350
23351 m_errorMonitor->VerifyNotFound();
23352}
23353
23354TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023355 TEST_DESCRIPTION(
23356 "Test that pipeline validation accepts the relaxed type matching rules "
23357 "set out in 14.1.3: fundamental type must match, and producer side must "
23358 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023359 m_errorMonitor->ExpectSuccess();
23360
23361 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
23362
Tony Barbour1fa09702017-03-16 12:09:08 -060023363 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023364 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23365
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023366 char const *vsSource =
23367 "#version 450\n"
23368 "out gl_PerVertex {\n"
23369 " vec4 gl_Position;\n"
23370 "};\n"
23371 "layout(location=0) out vec3 x;\n"
23372 "layout(location=1) out ivec3 y;\n"
23373 "layout(location=2) out vec3 z;\n"
23374 "void main(){\n"
23375 " gl_Position = vec4(0);\n"
23376 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
23377 "}\n";
23378 char const *fsSource =
23379 "#version 450\n"
23380 "\n"
23381 "layout(location=0) out vec4 color;\n"
23382 "layout(location=0) in float x;\n"
23383 "layout(location=1) flat in int y;\n"
23384 "layout(location=2) in vec2 z;\n"
23385 "void main(){\n"
23386 " color = vec4(1 + x + y + z.x);\n"
23387 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023388
23389 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23390 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23391
23392 VkPipelineObj pipe(m_device);
23393 pipe.AddColorAttachment();
23394 pipe.AddShader(&vs);
23395 pipe.AddShader(&fs);
23396
23397 VkDescriptorSetObj descriptorSet(m_device);
23398 descriptorSet.AppendDummy();
23399 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23400
23401 VkResult err = VK_SUCCESS;
23402 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23403 ASSERT_VK_SUCCESS(err);
23404
23405 m_errorMonitor->VerifyNotFound();
23406}
23407
23408TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023409 TEST_DESCRIPTION(
23410 "Test that pipeline validation accepts per-vertex variables "
23411 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023412 m_errorMonitor->ExpectSuccess();
23413
Tony Barbour1fa09702017-03-16 12:09:08 -060023414 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23416
23417 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023418 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023419 return;
23420 }
23421
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023422 char const *vsSource =
23423 "#version 450\n"
23424 "void main(){}\n";
23425 char const *tcsSource =
23426 "#version 450\n"
23427 "layout(location=0) out int x[];\n"
23428 "layout(vertices=3) out;\n"
23429 "void main(){\n"
23430 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
23431 " gl_TessLevelInner[0] = 1;\n"
23432 " x[gl_InvocationID] = gl_InvocationID;\n"
23433 "}\n";
23434 char const *tesSource =
23435 "#version 450\n"
23436 "layout(triangles, equal_spacing, cw) in;\n"
23437 "layout(location=0) in int x[];\n"
23438 "out gl_PerVertex { vec4 gl_Position; };\n"
23439 "void main(){\n"
23440 " gl_Position.xyz = gl_TessCoord;\n"
23441 " gl_Position.w = x[0] + x[1] + x[2];\n"
23442 "}\n";
23443 char const *fsSource =
23444 "#version 450\n"
23445 "layout(location=0) out vec4 color;\n"
23446 "void main(){\n"
23447 " color = vec4(1);\n"
23448 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023449
23450 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23451 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
23452 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
23453 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23454
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023455 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
23456 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023457
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023458 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023459
23460 VkPipelineObj pipe(m_device);
23461 pipe.SetInputAssembly(&iasci);
23462 pipe.SetTessellation(&tsci);
23463 pipe.AddColorAttachment();
23464 pipe.AddShader(&vs);
23465 pipe.AddShader(&tcs);
23466 pipe.AddShader(&tes);
23467 pipe.AddShader(&fs);
23468
23469 VkDescriptorSetObj descriptorSet(m_device);
23470 descriptorSet.AppendDummy();
23471 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23472
23473 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23474
23475 m_errorMonitor->VerifyNotFound();
23476}
23477
23478TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023479 TEST_DESCRIPTION(
23480 "Test that pipeline validation accepts a user-defined "
23481 "interface block passed into the geometry shader. This "
23482 "is interesting because the 'extra' array level is not "
23483 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023484 m_errorMonitor->ExpectSuccess();
23485
Tony Barbour1fa09702017-03-16 12:09:08 -060023486 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023487 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23488
23489 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023490 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023491 return;
23492 }
23493
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023494 char const *vsSource =
23495 "#version 450\n"
23496 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
23497 "void main(){\n"
23498 " vs_out.x = vec4(1);\n"
23499 "}\n";
23500 char const *gsSource =
23501 "#version 450\n"
23502 "layout(triangles) in;\n"
23503 "layout(triangle_strip, max_vertices=3) out;\n"
23504 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
23505 "out gl_PerVertex { vec4 gl_Position; };\n"
23506 "void main() {\n"
23507 " gl_Position = gs_in[0].x;\n"
23508 " EmitVertex();\n"
23509 "}\n";
23510 char const *fsSource =
23511 "#version 450\n"
23512 "layout(location=0) out vec4 color;\n"
23513 "void main(){\n"
23514 " color = vec4(1);\n"
23515 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023516
23517 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23518 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
23519 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23520
23521 VkPipelineObj pipe(m_device);
23522 pipe.AddColorAttachment();
23523 pipe.AddShader(&vs);
23524 pipe.AddShader(&gs);
23525 pipe.AddShader(&fs);
23526
23527 VkDescriptorSetObj descriptorSet(m_device);
23528 descriptorSet.AppendDummy();
23529 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23530
23531 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23532
23533 m_errorMonitor->VerifyNotFound();
23534}
23535
23536TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023537 TEST_DESCRIPTION(
23538 "Test that pipeline validation accepts basic use of 64bit vertex "
23539 "attributes. This is interesting because they consume multiple "
23540 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023541 m_errorMonitor->ExpectSuccess();
23542
Tony Barbour1fa09702017-03-16 12:09:08 -060023543 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23545
23546 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070023547 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023548 return;
23549 }
23550
23551 VkVertexInputBindingDescription input_bindings[1];
23552 memset(input_bindings, 0, sizeof(input_bindings));
23553
23554 VkVertexInputAttributeDescription input_attribs[4];
23555 memset(input_attribs, 0, sizeof(input_attribs));
23556 input_attribs[0].location = 0;
23557 input_attribs[0].offset = 0;
23558 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23559 input_attribs[1].location = 2;
23560 input_attribs[1].offset = 32;
23561 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23562 input_attribs[2].location = 4;
23563 input_attribs[2].offset = 64;
23564 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23565 input_attribs[3].location = 6;
23566 input_attribs[3].offset = 96;
23567 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
23568
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023569 char const *vsSource =
23570 "#version 450\n"
23571 "\n"
23572 "layout(location=0) in dmat4 x;\n"
23573 "out gl_PerVertex {\n"
23574 " vec4 gl_Position;\n"
23575 "};\n"
23576 "void main(){\n"
23577 " gl_Position = vec4(x[0][0]);\n"
23578 "}\n";
23579 char const *fsSource =
23580 "#version 450\n"
23581 "\n"
23582 "layout(location=0) out vec4 color;\n"
23583 "void main(){\n"
23584 " color = vec4(1);\n"
23585 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023586
23587 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23588 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23589
23590 VkPipelineObj pipe(m_device);
23591 pipe.AddColorAttachment();
23592 pipe.AddShader(&vs);
23593 pipe.AddShader(&fs);
23594
23595 pipe.AddVertexInputBindings(input_bindings, 1);
23596 pipe.AddVertexInputAttribs(input_attribs, 4);
23597
23598 VkDescriptorSetObj descriptorSet(m_device);
23599 descriptorSet.AppendDummy();
23600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23601
23602 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
23603
23604 m_errorMonitor->VerifyNotFound();
23605}
23606
23607TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
23608 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
23609 m_errorMonitor->ExpectSuccess();
23610
Tony Barbour1fa09702017-03-16 12:09:08 -060023611 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023612
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023613 char const *vsSource =
23614 "#version 450\n"
23615 "\n"
23616 "out gl_PerVertex {\n"
23617 " vec4 gl_Position;\n"
23618 "};\n"
23619 "void main(){\n"
23620 " gl_Position = vec4(1);\n"
23621 "}\n";
23622 char const *fsSource =
23623 "#version 450\n"
23624 "\n"
23625 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
23626 "layout(location=0) out vec4 color;\n"
23627 "void main() {\n"
23628 " color = subpassLoad(x);\n"
23629 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023630
23631 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
23632 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23633
23634 VkPipelineObj pipe(m_device);
23635 pipe.AddShader(&vs);
23636 pipe.AddShader(&fs);
23637 pipe.AddColorAttachment();
23638 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23639
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023640 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
23641 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023642 VkDescriptorSetLayout dsl;
23643 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23644 ASSERT_VK_SUCCESS(err);
23645
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023646 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023647 VkPipelineLayout pl;
23648 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23649 ASSERT_VK_SUCCESS(err);
23650
23651 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023652 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23653 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23654 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
23655 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
23656 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 -060023657 };
23658 VkAttachmentReference color = {
23659 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
23660 };
23661 VkAttachmentReference input = {
23662 1, VK_IMAGE_LAYOUT_GENERAL,
23663 };
23664
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023665 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023666
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023667 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023668 VkRenderPass rp;
23669 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
23670 ASSERT_VK_SUCCESS(err);
23671
23672 // should be OK. would go wrong here if it's going to...
23673 pipe.CreateVKPipeline(pl, rp);
23674
23675 m_errorMonitor->VerifyNotFound();
23676
23677 vkDestroyRenderPass(m_device->device(), rp, nullptr);
23678 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23679 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23680}
23681
23682TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023683 TEST_DESCRIPTION(
23684 "Test that pipeline validation accepts a compute pipeline which declares a "
23685 "descriptor-backed resource which is not provided, but the shader does not "
23686 "statically use it. This is interesting because it requires compute pipelines "
23687 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023688 m_errorMonitor->ExpectSuccess();
23689
Tony Barbour1fa09702017-03-16 12:09:08 -060023690 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023691
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023692 char const *csSource =
23693 "#version 450\n"
23694 "\n"
23695 "layout(local_size_x=1) in;\n"
23696 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
23697 "void main(){\n"
23698 " // x is not used.\n"
23699 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023700
23701 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23702
23703 VkDescriptorSetObj descriptorSet(m_device);
23704 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
23705
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023706 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23707 nullptr,
23708 0,
23709 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23710 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23711 descriptorSet.GetPipelineLayout(),
23712 VK_NULL_HANDLE,
23713 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023714
23715 VkPipeline pipe;
23716 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23717
23718 m_errorMonitor->VerifyNotFound();
23719
23720 if (err == VK_SUCCESS) {
23721 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23722 }
23723}
23724
23725TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023726 TEST_DESCRIPTION(
23727 "Test that pipeline validation accepts a shader consuming only the "
23728 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023729 m_errorMonitor->ExpectSuccess();
23730
Tony Barbour1fa09702017-03-16 12:09:08 -060023731 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023732
23733 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023734 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23735 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23736 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023737 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023738 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023739 VkDescriptorSetLayout dsl;
23740 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23741 ASSERT_VK_SUCCESS(err);
23742
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023743 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023744 VkPipelineLayout pl;
23745 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23746 ASSERT_VK_SUCCESS(err);
23747
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023748 char const *csSource =
23749 "#version 450\n"
23750 "\n"
23751 "layout(local_size_x=1) in;\n"
23752 "layout(set=0, binding=0) uniform sampler s;\n"
23753 "layout(set=0, binding=1) uniform texture2D t;\n"
23754 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23755 "void main() {\n"
23756 " x = texture(sampler2D(t, s), vec2(0));\n"
23757 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023758 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23759
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023760 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23761 nullptr,
23762 0,
23763 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23764 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23765 pl,
23766 VK_NULL_HANDLE,
23767 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023768
23769 VkPipeline pipe;
23770 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23771
23772 m_errorMonitor->VerifyNotFound();
23773
23774 if (err == VK_SUCCESS) {
23775 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23776 }
23777
23778 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23779 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23780}
23781
23782TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023783 TEST_DESCRIPTION(
23784 "Test that pipeline validation accepts a shader consuming only the "
23785 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023786 m_errorMonitor->ExpectSuccess();
23787
Tony Barbour1fa09702017-03-16 12:09:08 -060023788 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023789
23790 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023791 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23792 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23793 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023794 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023795 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023796 VkDescriptorSetLayout dsl;
23797 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23798 ASSERT_VK_SUCCESS(err);
23799
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023800 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023801 VkPipelineLayout pl;
23802 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23803 ASSERT_VK_SUCCESS(err);
23804
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023805 char const *csSource =
23806 "#version 450\n"
23807 "\n"
23808 "layout(local_size_x=1) in;\n"
23809 "layout(set=0, binding=0) uniform texture2D t;\n"
23810 "layout(set=0, binding=1) uniform sampler s;\n"
23811 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23812 "void main() {\n"
23813 " x = texture(sampler2D(t, s), vec2(0));\n"
23814 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023815 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23816
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023817 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23818 nullptr,
23819 0,
23820 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23821 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23822 pl,
23823 VK_NULL_HANDLE,
23824 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023825
23826 VkPipeline pipe;
23827 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23828
23829 m_errorMonitor->VerifyNotFound();
23830
23831 if (err == VK_SUCCESS) {
23832 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23833 }
23834
23835 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23836 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23837}
23838
23839TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023840 TEST_DESCRIPTION(
23841 "Test that pipeline validation accepts a shader consuming "
23842 "both the sampler and the image of a combined image+sampler "
23843 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023844 m_errorMonitor->ExpectSuccess();
23845
Tony Barbour1fa09702017-03-16 12:09:08 -060023846 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023847
23848 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023849 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23850 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023851 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023852 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023853 VkDescriptorSetLayout dsl;
23854 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23855 ASSERT_VK_SUCCESS(err);
23856
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023857 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023858 VkPipelineLayout pl;
23859 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23860 ASSERT_VK_SUCCESS(err);
23861
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023862 char const *csSource =
23863 "#version 450\n"
23864 "\n"
23865 "layout(local_size_x=1) in;\n"
23866 "layout(set=0, binding=0) uniform texture2D t;\n"
23867 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23868 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23869 "void main() {\n"
23870 " x = texture(sampler2D(t, s), vec2(0));\n"
23871 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023872 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23873
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023874 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23875 nullptr,
23876 0,
23877 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23878 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23879 pl,
23880 VK_NULL_HANDLE,
23881 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023882
23883 VkPipeline pipe;
23884 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23885
23886 m_errorMonitor->VerifyNotFound();
23887
23888 if (err == VK_SUCCESS) {
23889 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23890 }
23891
23892 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23893 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23894}
23895
Tony Barbour3ed87a02017-03-15 16:19:02 -060023896TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023897 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23898
Tony Barbour3ed87a02017-03-15 16:19:02 -060023899 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023900 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023901
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023902 // Ensure that extension is available and enabled.
23903 uint32_t extension_count = 0;
23904 bool supports_maintenance1_extension = false;
23905 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23906 ASSERT_VK_SUCCESS(err);
23907 if (extension_count > 0) {
23908 std::vector<VkExtensionProperties> available_extensions(extension_count);
23909
23910 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23911 ASSERT_VK_SUCCESS(err);
23912 for (const auto &extension_props : available_extensions) {
23913 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23914 supports_maintenance1_extension = true;
23915 }
23916 }
23917 }
23918
23919 // Proceed if extension is supported by hardware
23920 if (!supports_maintenance1_extension) {
23921 printf(" Maintenance1 Extension not supported, skipping tests\n");
23922 return;
23923 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023924
23925 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023926 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023927 VkCommandBuffer cmd_buf;
23928 VkCommandBufferAllocateInfo alloc_info;
23929 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23930 alloc_info.pNext = NULL;
23931 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023932 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023933 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23934 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23935
23936 VkCommandBufferBeginInfo cb_binfo;
23937 cb_binfo.pNext = NULL;
23938 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23939 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23940 cb_binfo.flags = 0;
23941 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23942 // Set Negative height, should give error if Maintenance 1 is not enabled
23943 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23944 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23945 vkEndCommandBuffer(cmd_buf);
23946
23947 m_errorMonitor->VerifyNotFound();
23948}
23949
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023950TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23951 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23952
23953 ASSERT_NO_FATAL_FAILURE(Init());
23954
23955 uint32_t extension_count = 0;
23956 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23957 ASSERT_VK_SUCCESS(err);
23958
23959 if (extension_count > 0) {
23960 std::vector<VkExtensionProperties> available_extensions(extension_count);
23961 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23962 ASSERT_VK_SUCCESS(err);
23963
23964 for (const auto &extension_props : available_extensions) {
23965 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23966 // Create two pNext structures which by themselves would be valid
23967 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23968 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23969 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23970 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23971 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23972
23973 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23974 dedicated_buffer_create_info_2.pNext = nullptr;
23975 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23976
23977 uint32_t queue_family_index = 0;
23978 VkBufferCreateInfo buffer_create_info = {};
23979 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23980 buffer_create_info.pNext = &dedicated_buffer_create_info;
23981 buffer_create_info.size = 1024;
23982 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23983 buffer_create_info.queueFamilyIndexCount = 1;
23984 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23985
23986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23987 VkBuffer buffer;
23988 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23989 m_errorMonitor->VerifyFound();
23990 }
23991 }
23992 }
23993}
23994
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023995TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23996 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23997
Tony Barbour1fa09702017-03-16 12:09:08 -060023998 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023999
24000 // Positive test to check parameter_validation and unique_objects support
24001 // for NV_dedicated_allocation
24002 uint32_t extension_count = 0;
24003 bool supports_nv_dedicated_allocation = false;
24004 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
24005 ASSERT_VK_SUCCESS(err);
24006
24007 if (extension_count > 0) {
24008 std::vector<VkExtensionProperties> available_extensions(extension_count);
24009
24010 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
24011 ASSERT_VK_SUCCESS(err);
24012
24013 for (const auto &extension_props : available_extensions) {
24014 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
24015 supports_nv_dedicated_allocation = true;
24016 }
24017 }
24018 }
24019
24020 if (supports_nv_dedicated_allocation) {
24021 m_errorMonitor->ExpectSuccess();
24022
24023 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
24024 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
24025 dedicated_buffer_create_info.pNext = nullptr;
24026 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
24027
24028 uint32_t queue_family_index = 0;
24029 VkBufferCreateInfo buffer_create_info = {};
24030 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
24031 buffer_create_info.pNext = &dedicated_buffer_create_info;
24032 buffer_create_info.size = 1024;
24033 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
24034 buffer_create_info.queueFamilyIndexCount = 1;
24035 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
24036
24037 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070024038 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024039 ASSERT_VK_SUCCESS(err);
24040
24041 VkMemoryRequirements memory_reqs;
24042 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
24043
24044 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
24045 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
24046 dedicated_memory_info.pNext = nullptr;
24047 dedicated_memory_info.buffer = buffer;
24048 dedicated_memory_info.image = VK_NULL_HANDLE;
24049
24050 VkMemoryAllocateInfo memory_info = {};
24051 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
24052 memory_info.pNext = &dedicated_memory_info;
24053 memory_info.allocationSize = memory_reqs.size;
24054
24055 bool pass;
24056 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
24057 ASSERT_TRUE(pass);
24058
24059 VkDeviceMemory buffer_memory;
24060 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
24061 ASSERT_VK_SUCCESS(err);
24062
24063 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
24064 ASSERT_VK_SUCCESS(err);
24065
24066 vkDestroyBuffer(m_device->device(), buffer, NULL);
24067 vkFreeMemory(m_device->device(), buffer_memory, NULL);
24068
24069 m_errorMonitor->VerifyNotFound();
24070 }
24071}
24072
24073TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
24074 VkResult err;
24075
24076 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
24077
Tony Barbour1fa09702017-03-16 12:09:08 -060024078 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024079 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
24080
24081 std::vector<const char *> device_extension_names;
24082 auto features = m_device->phy().features();
24083 // Artificially disable support for non-solid fill modes
24084 features.fillModeNonSolid = false;
24085 // The sacrificial device object
24086 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
24087
24088 VkRenderpassObj render_pass(&test_device);
24089
24090 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
24091 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
24092 pipeline_layout_ci.setLayoutCount = 0;
24093 pipeline_layout_ci.pSetLayouts = NULL;
24094
24095 VkPipelineLayout pipeline_layout;
24096 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
24097 ASSERT_VK_SUCCESS(err);
24098
24099 VkPipelineRasterizationStateCreateInfo rs_ci = {};
24100 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
24101 rs_ci.pNext = nullptr;
24102 rs_ci.lineWidth = 1.0f;
24103 rs_ci.rasterizerDiscardEnable = true;
24104
24105 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
24106 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
24107
24108 // Set polygonMode=FILL. No error is expected
24109 m_errorMonitor->ExpectSuccess();
24110 {
24111 VkPipelineObj pipe(&test_device);
24112 pipe.AddShader(&vs);
24113 pipe.AddShader(&fs);
24114 pipe.AddColorAttachment();
24115 // Set polygonMode to a good value
24116 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
24117 pipe.SetRasterization(&rs_ci);
24118 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
24119 }
24120 m_errorMonitor->VerifyNotFound();
24121
24122 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
24123}
24124
Dave Houlton1150cf52017-04-27 14:38:11 -060024125TEST_F(VkPositiveLayerTest, LongSemaphoreChain) {
Chris Forbes94196952017-04-06 16:30:59 -070024126 m_errorMonitor->ExpectSuccess();
24127
24128 ASSERT_NO_FATAL_FAILURE(Init());
24129 VkResult err;
24130
24131 std::vector<VkSemaphore> semaphores;
24132
24133 const int chainLength = 32768;
24134 VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
24135
24136 for (int i = 0; i < chainLength; i++) {
Dave Houlton1150cf52017-04-27 14:38:11 -060024137 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024138 VkSemaphore semaphore;
24139 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &semaphore);
24140 ASSERT_VK_SUCCESS(err);
24141
24142 semaphores.push_back(semaphore);
24143
Chris Forbesfc50aaa2017-05-01 10:20:17 -070024144 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO,
24145 nullptr,
24146 semaphores.size() > 1 ? 1u : 0u,
24147 semaphores.size() > 1 ? &semaphores[semaphores.size() - 2] : nullptr,
24148 &flags,
24149 0,
24150 nullptr,
24151 1,
24152 &semaphores[semaphores.size() - 1]};
Chris Forbes94196952017-04-06 16:30:59 -070024153 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
24154 ASSERT_VK_SUCCESS(err);
24155 }
24156
Dave Houlton1150cf52017-04-27 14:38:11 -060024157 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070024158 VkFence fence;
24159 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24160 ASSERT_VK_SUCCESS(err);
Dave Houlton1150cf52017-04-27 14:38:11 -060024161 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &semaphores.back(), &flags, 0, nullptr, 0, nullptr};
Chris Forbes94196952017-04-06 16:30:59 -070024162 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24163 ASSERT_VK_SUCCESS(err);
24164
24165 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
24166
Dave Houlton1150cf52017-04-27 14:38:11 -060024167 for (auto semaphore : semaphores) vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Chris Forbes94196952017-04-06 16:30:59 -070024168
24169 vkDestroyFence(m_device->device(), fence, nullptr);
24170
24171 m_errorMonitor->VerifyNotFound();
24172}
24173
Mike Stroyanca855662017-05-02 11:06:27 -060024174extern "C" void *ReleaseNullFence(void *arg) {
24175 struct thread_data_struct *data = (struct thread_data_struct *)arg;
24176
24177 for (int i = 0; i < 40000; i++) {
24178 vkDestroyFence(data->device, VK_NULL_HANDLE, NULL);
24179 if (data->bailout) {
24180 break;
24181 }
24182 }
24183 return NULL;
24184}
24185
24186TEST_F(VkPositiveLayerTest, ThreadNullFenceCollision) {
24187 test_platform_thread thread;
24188
24189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
24190
24191 ASSERT_NO_FATAL_FAILURE(Init());
24192
24193 struct thread_data_struct data;
24194 data.device = m_device->device();
24195 data.bailout = false;
24196 m_errorMonitor->SetBailout(&data.bailout);
24197
24198 // Call vkDestroyFence of VK_NULL_HANDLE repeatedly using multiple threads.
24199 // There should be no validation error from collision of that non-object.
24200 test_platform_thread_create(&thread, ReleaseNullFence, (void *)&data);
24201 for (int i = 0; i < 40000; i++) {
24202 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
24203 }
24204 test_platform_thread_join(thread, NULL);
24205
24206 m_errorMonitor->SetBailout(NULL);
24207
24208 m_errorMonitor->VerifyNotFound();
24209}
24210
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024211#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024212TEST_F(VkPositiveLayerTest, LongFenceChain)
24213{
24214 m_errorMonitor->ExpectSuccess();
24215
Tony Barbour1fa09702017-03-16 12:09:08 -060024216 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060024217 VkResult err;
24218
24219 std::vector<VkFence> fences;
24220
24221 const int chainLength = 32768;
24222
24223 for (int i = 0; i < chainLength; i++) {
24224 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
24225 VkFence fence;
24226 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
24227 ASSERT_VK_SUCCESS(err);
24228
24229 fences.push_back(fence);
24230
24231 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
24232 0, nullptr, 0, nullptr };
24233 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
24234 ASSERT_VK_SUCCESS(err);
24235
24236 }
24237
24238 // BOOM, stack overflow.
24239 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
24240
24241 for (auto fence : fences)
24242 vkDestroyFence(m_device->device(), fence, nullptr);
24243
24244 m_errorMonitor->VerifyNotFound();
24245}
24246#endif
24247
Cody Northrop1242dfd2016-07-13 17:24:59 -060024248#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060024249const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060024250static bool initialized = false;
24251static bool active = false;
24252
24253// Convert Intents to argv
24254// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024255std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024256 std::vector<std::string> args;
24257 JavaVM &vm = *app.activity->vm;
24258 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024259 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024260
24261 JNIEnv &env = *p_env;
24262 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024263 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024264 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024265 jmethodID get_string_extra_method =
24266 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060024267 jvalue get_string_extra_args;
24268 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024269 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060024270
24271 std::string args_str;
24272 if (extra_str) {
24273 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
24274 args_str = extra_utf;
24275 env.ReleaseStringUTFChars(extra_str, extra_utf);
24276 env.DeleteLocalRef(extra_str);
24277 }
24278
24279 env.DeleteLocalRef(get_string_extra_args.l);
24280 env.DeleteLocalRef(intent);
24281 vm.DetachCurrentThread();
24282
24283 // split args_str
24284 std::stringstream ss(args_str);
24285 std::string arg;
24286 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024287 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024288 }
24289
24290 return args;
24291}
24292
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024293void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
24294 const char *const type_param = test_info.type_param();
24295 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060024296
24297 if (type_param != NULL || value_param != NULL) {
24298 error_message.append(", where ");
24299 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024300 error_message.append("TypeParam = ").append(type_param);
24301 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060024302 }
24303 if (value_param != NULL) {
24304 error_message.append("GetParam() = ").append(value_param);
24305 }
24306 }
24307}
24308
24309// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
24310class LogcatPrinter : public ::testing::EmptyTestEventListener {
24311 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024312 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024313 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
24314 }
24315
24316 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024317 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060024318 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024319 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060024320
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024321 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
24322 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060024323 }
24324
24325 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024326 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060024327 std::string result;
24328 if (info.result()->Passed()) {
24329 result.append("[ OK ]");
24330 } else {
24331 result.append("[ FAILED ]");
24332 }
24333 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024334 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060024335
24336 if (::testing::GTEST_FLAG(print_time)) {
24337 std::ostringstream os;
24338 os << info.result()->elapsed_time();
24339 result.append(" (").append(os.str()).append(" ms)");
24340 }
24341
24342 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
24343 };
24344};
24345
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024346static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024348static void processCommand(struct android_app *app, int32_t cmd) {
24349 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024350 case APP_CMD_INIT_WINDOW: {
24351 if (app->window) {
24352 initialized = true;
24353 }
24354 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024355 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024356 case APP_CMD_GAINED_FOCUS: {
24357 active = true;
24358 break;
24359 }
24360 case APP_CMD_LOST_FOCUS: {
24361 active = false;
24362 break;
24363 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024364 }
24365}
24366
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024367void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024368 app_dummy();
24369
Cody Northrop1242dfd2016-07-13 17:24:59 -060024370 int vulkanSupport = InitVulkan();
24371 if (vulkanSupport == 0) {
24372 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
24373 return;
24374 }
24375
24376 app->onAppCmd = processCommand;
24377 app->onInputEvent = processInput;
24378
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024379 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024380 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024381 struct android_poll_source *source;
24382 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060024383 if (source) {
24384 source->process(app, source);
24385 }
24386
24387 if (app->destroyRequested != 0) {
24388 VkTestFramework::Finish();
24389 return;
24390 }
24391 }
24392
24393 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024394 // Use the following key to send arguments to gtest, i.e.
24395 // --es args "--gtest_filter=-VkLayerTest.foo"
24396 const char key[] = "args";
24397 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024398
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024399 std::string filter = "";
24400 if (args.size() > 0) {
24401 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
24402 filter += args[0];
24403 } else {
24404 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
24405 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024406
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024407 int argc = 2;
24408 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
24409 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024410
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024411 // Route output to files until we can override the gtest output
24412 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
24413 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024414
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024415 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060024416
Dave Houlton11dcd5e2017-04-25 16:00:10 -060024417 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060024418 listeners.Append(new LogcatPrinter);
24419
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024420 VkTestFramework::InitArgs(&argc, argv);
24421 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024422
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024423 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024424
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024425 if (result != 0) {
24426 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
24427 } else {
24428 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
24429 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060024430
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024431 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060024432
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024433 fclose(stdout);
24434 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060024435
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024436 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060024437 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060024438 }
24439 }
24440}
24441#endif
24442
Tony Barbour300a6082015-04-07 13:44:53 -060024443int main(int argc, char **argv) {
24444 int result;
24445
Cody Northrop8e54a402016-03-08 22:25:52 -070024446#ifdef ANDROID
24447 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070024448 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070024449#endif
24450
Tony Barbour300a6082015-04-07 13:44:53 -060024451 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060024452 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060024453
24454 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
24455
24456 result = RUN_ALL_TESTS();
24457
Tony Barbour6918cd52015-04-09 12:58:51 -060024458 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060024459 return result;
24460}