blob: 4693063df2e39ee483725625e31af960736d1c8c [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
1060TEST_F(VkLayerTest, FailedReturnValue) {
1061 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1062
Tony Barbour1fa09702017-03-16 12:09:08 -06001063 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001064
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 // Find an unsupported image format
1066 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1067 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1068 VkFormat format = static_cast<VkFormat>(f);
1069 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001070 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001071 unsupported = format;
1072 break;
1073 }
1074 }
1075
1076 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1078 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001079 // Specify an unsupported VkFormat value to generate a
1080 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1081 // Expected to trigger a warning from
1082 // parameter_validation::validate_result
1083 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001084 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1085 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001086 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1087 m_errorMonitor->VerifyFound();
1088 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001089}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090
1091TEST_F(VkLayerTest, UpdateBufferAlignment) {
1092 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094
Tony Barbour1fa09702017-03-16 12:09:08 -06001095 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096
1097 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1098 vk_testing::Buffer buffer;
1099 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1100
Tony Barbour552f6c02016-12-21 14:34:07 -07001101 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001102 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1105 m_errorMonitor->VerifyFound();
1106
1107 // Introduce failure by using dataSize 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->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using dataSize that is < 0
1113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001114 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1116 m_errorMonitor->VerifyFound();
1117
1118 // Introduce failure by using dataSize that is > 65536
1119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001120 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001121 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1122 m_errorMonitor->VerifyFound();
1123
Tony Barbour552f6c02016-12-21 14:34:07 -07001124 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125}
1126
1127TEST_F(VkLayerTest, FillBufferAlignment) {
1128 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1129
Tony Barbour1fa09702017-03-16 12:09:08 -06001130 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001131
1132 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1133 vk_testing::Buffer buffer;
1134 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1135
Tony Barbour552f6c02016-12-21 14:34:07 -07001136 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001137
1138 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001140 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1141 m_errorMonitor->VerifyFound();
1142
1143 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001145 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1146 m_errorMonitor->VerifyFound();
1147
1148 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001149 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001150 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1151 m_errorMonitor->VerifyFound();
1152
Tony Barbour552f6c02016-12-21 14:34:07 -07001153 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001154}
Dustin Graves40f35822016-06-23 11:12:53 -06001155
Cortd889ff92016-07-27 09:51:27 -07001156TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1157 VkResult err;
1158
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001159 TEST_DESCRIPTION(
1160 "Attempt to use a non-solid polygon fill mode in a "
1161 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001162
Tony Barbour1fa09702017-03-16 12:09:08 -06001163 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1165
1166 std::vector<const char *> device_extension_names;
1167 auto features = m_device->phy().features();
1168 // Artificially disable support for non-solid fill modes
1169 features.fillModeNonSolid = false;
1170 // The sacrificial device object
1171 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1172
1173 VkRenderpassObj render_pass(&test_device);
1174
1175 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1176 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1177 pipeline_layout_ci.setLayoutCount = 0;
1178 pipeline_layout_ci.pSetLayouts = NULL;
1179
1180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001181 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001182 ASSERT_VK_SUCCESS(err);
1183
1184 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1185 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1186 rs_ci.pNext = nullptr;
1187 rs_ci.lineWidth = 1.0f;
1188 rs_ci.rasterizerDiscardEnable = true;
1189
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001190 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1191 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001192
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001193 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1195 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001196 {
1197 VkPipelineObj pipe(&test_device);
1198 pipe.AddShader(&vs);
1199 pipe.AddShader(&fs);
1200 pipe.AddColorAttachment();
1201 // Introduce failure by setting unsupported polygon mode
1202 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1203 pipe.SetRasterization(&rs_ci);
1204 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1205 }
1206 m_errorMonitor->VerifyFound();
1207
1208 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1210 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001211 {
1212 VkPipelineObj pipe(&test_device);
1213 pipe.AddShader(&vs);
1214 pipe.AddShader(&fs);
1215 pipe.AddColorAttachment();
1216 // Introduce failure by setting unsupported polygon mode
1217 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1218 pipe.SetRasterization(&rs_ci);
1219 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1220 }
1221 m_errorMonitor->VerifyFound();
1222
Cortd889ff92016-07-27 09:51:27 -07001223 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1224}
1225
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001226#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001227TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001228{
1229 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001230 VkFenceCreateInfo fenceInfo = {};
1231 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1232 fenceInfo.pNext = NULL;
1233 fenceInfo.flags = 0;
1234
Mike Weiblencce7ec72016-10-17 19:33:05 -06001235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001236
Tony Barbour1fa09702017-03-16 12:09:08 -06001237 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001238
1239 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1240 vk_testing::Buffer buffer;
1241 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242
Tony Barbourfe3351b2015-07-28 10:17:20 -06001243 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001244 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001245 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
1247 testFence.init(*m_device, fenceInfo);
1248
1249 // Bypass framework since it does the waits automatically
1250 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001251 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001252 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1253 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001254 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001255 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001256 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001257 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001258 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001259 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001260 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001261
1262 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263 ASSERT_VK_SUCCESS( err );
1264
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001265 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001266 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001268 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001269}
1270
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001271TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001272{
1273 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001274 VkFenceCreateInfo fenceInfo = {};
1275 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1276 fenceInfo.pNext = NULL;
1277 fenceInfo.flags = 0;
1278
Mike Weiblencce7ec72016-10-17 19:33:05 -06001279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001280
Tony Barbour1fa09702017-03-16 12:09:08 -06001281 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001282 ASSERT_NO_FATAL_FAILURE(InitViewport());
1283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1284
Tony Barbourfe3351b2015-07-28 10:17:20 -06001285 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001286 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001287 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001288
1289 testFence.init(*m_device, fenceInfo);
1290
1291 // Bypass framework since it does the waits automatically
1292 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001293 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001294 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1295 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001296 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001297 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001298 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001299 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001300 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001301 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001302 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001303
1304 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001305 ASSERT_VK_SUCCESS( err );
1306
Jon Ashburnf19916e2016-01-11 13:12:43 -07001307 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001308 VkCommandBufferBeginInfo info = {};
1309 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1310 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001311 info.renderPass = VK_NULL_HANDLE;
1312 info.subpass = 0;
1313 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001314 info.occlusionQueryEnable = VK_FALSE;
1315 info.queryFlags = 0;
1316 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001317
1318 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001319 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001320
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001321 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001322}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001323#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001324
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001325TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1326 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1327
Tony Barbour1fa09702017-03-16 12:09:08 -06001328 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001329
1330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1331 VkBuffer buffer;
1332 VkBufferCreateInfo buf_info = {};
1333 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1334 buf_info.pNext = NULL;
1335 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1336 buf_info.size = 2048;
1337 buf_info.queueFamilyIndexCount = 0;
1338 buf_info.pQueueFamilyIndices = NULL;
1339 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1340 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1341 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1342 m_errorMonitor->VerifyFound();
1343
1344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1345 VkImage image;
1346 VkImageCreateInfo image_create_info = {};
1347 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1348 image_create_info.pNext = NULL;
1349 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1350 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1351 image_create_info.extent.width = 512;
1352 image_create_info.extent.height = 64;
1353 image_create_info.extent.depth = 1;
1354 image_create_info.mipLevels = 1;
1355 image_create_info.arrayLayers = 1;
1356 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1357 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1358 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1359 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1360 image_create_info.queueFamilyIndexCount = 0;
1361 image_create_info.pQueueFamilyIndices = NULL;
1362 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1363 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1364 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1365 m_errorMonitor->VerifyFound();
1366}
1367
Dave Houlton829c0d82017-01-24 15:09:17 -07001368TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1369 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1370
1371 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001372 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001373 ASSERT_NO_FATAL_FAILURE(
1374 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001375 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001376
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001377 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001378 device_features.sparseResidencyImage2D = VK_FALSE;
1379 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001380 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001381
1382 VkImage image = VK_NULL_HANDLE;
1383 VkResult result = VK_RESULT_MAX_ENUM;
1384 VkImageCreateInfo image_create_info = {};
1385 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1386 image_create_info.pNext = NULL;
1387 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1388 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1389 image_create_info.extent.width = 512;
1390 image_create_info.extent.height = 1;
1391 image_create_info.extent.depth = 1;
1392 image_create_info.mipLevels = 1;
1393 image_create_info.arrayLayers = 1;
1394 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1395 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1396 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1397 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1398 image_create_info.queueFamilyIndexCount = 0;
1399 image_create_info.pQueueFamilyIndices = NULL;
1400 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1401 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1402
1403 // 1D image w/ sparse residency is an error
1404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1405 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1406 m_errorMonitor->VerifyFound();
1407 if (VK_SUCCESS == result) {
1408 vkDestroyImage(m_device->device(), image, NULL);
1409 image = VK_NULL_HANDLE;
1410 }
1411
1412 // 2D image w/ sparse residency when feature isn't available
1413 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1414 image_create_info.extent.height = 64;
1415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1416 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1417 m_errorMonitor->VerifyFound();
1418 if (VK_SUCCESS == result) {
1419 vkDestroyImage(m_device->device(), image, NULL);
1420 image = VK_NULL_HANDLE;
1421 }
1422
1423 // 3D image w/ sparse residency when feature isn't available
1424 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1425 image_create_info.extent.depth = 8;
1426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1427 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1428 m_errorMonitor->VerifyFound();
1429 if (VK_SUCCESS == result) {
1430 vkDestroyImage(m_device->device(), image, NULL);
1431 image = VK_NULL_HANDLE;
1432 }
1433}
1434
1435TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1436 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1437
1438 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001439 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001440 ASSERT_NO_FATAL_FAILURE(
1441 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001442 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001443
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001444 // These tests require that the device support sparse residency for 2D images
1445 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1446 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001447 return;
1448 }
1449
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001450 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001451 device_features.sparseResidency2Samples = VK_FALSE;
1452 device_features.sparseResidency4Samples = VK_FALSE;
1453 device_features.sparseResidency8Samples = VK_FALSE;
1454 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001455 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001456
1457 VkImage image = VK_NULL_HANDLE;
1458 VkResult result = VK_RESULT_MAX_ENUM;
1459 VkImageCreateInfo image_create_info = {};
1460 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1461 image_create_info.pNext = NULL;
1462 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1463 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1464 image_create_info.extent.width = 64;
1465 image_create_info.extent.height = 64;
1466 image_create_info.extent.depth = 1;
1467 image_create_info.mipLevels = 1;
1468 image_create_info.arrayLayers = 1;
1469 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1470 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1471 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1472 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1473 image_create_info.queueFamilyIndexCount = 0;
1474 image_create_info.pQueueFamilyIndices = NULL;
1475 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1476 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1477
1478 // 2D image w/ sparse residency and linear tiling is an error
1479 m_errorMonitor->SetDesiredFailureMsg(
1480 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1481 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1482 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1483 m_errorMonitor->VerifyFound();
1484 if (VK_SUCCESS == result) {
1485 vkDestroyImage(m_device->device(), image, NULL);
1486 image = VK_NULL_HANDLE;
1487 }
1488 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1489
1490 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1491 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1493 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1494 m_errorMonitor->VerifyFound();
1495 if (VK_SUCCESS == result) {
1496 vkDestroyImage(m_device->device(), image, NULL);
1497 image = VK_NULL_HANDLE;
1498 }
1499
1500 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1502 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1503 m_errorMonitor->VerifyFound();
1504 if (VK_SUCCESS == result) {
1505 vkDestroyImage(m_device->device(), image, NULL);
1506 image = VK_NULL_HANDLE;
1507 }
1508
1509 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1511 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1512 m_errorMonitor->VerifyFound();
1513 if (VK_SUCCESS == result) {
1514 vkDestroyImage(m_device->device(), image, NULL);
1515 image = VK_NULL_HANDLE;
1516 }
1517
1518 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1520 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1521 m_errorMonitor->VerifyFound();
1522 if (VK_SUCCESS == result) {
1523 vkDestroyImage(m_device->device(), image, NULL);
1524 image = VK_NULL_HANDLE;
1525 }
1526}
1527
Tobin Ehlisf11be982016-05-11 13:52:53 -06001528TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001529 TEST_DESCRIPTION(
1530 "Create a buffer and image, allocate memory, and bind the "
1531 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001532 VkResult err;
1533 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001534 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
Tobin Ehlis077ded32016-05-12 17:39:13 -06001536 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001537 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001538 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001539 VkDeviceMemory mem; // buffer will be bound first
1540 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001541 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001542 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001543
1544 VkBufferCreateInfo buf_info = {};
1545 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1546 buf_info.pNext = NULL;
1547 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1548 buf_info.size = 256;
1549 buf_info.queueFamilyIndexCount = 0;
1550 buf_info.pQueueFamilyIndices = NULL;
1551 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1552 buf_info.flags = 0;
1553 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1554 ASSERT_VK_SUCCESS(err);
1555
Tobin Ehlis077ded32016-05-12 17:39:13 -06001556 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001557
1558 VkImageCreateInfo image_create_info = {};
1559 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1560 image_create_info.pNext = NULL;
1561 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1562 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1563 image_create_info.extent.width = 64;
1564 image_create_info.extent.height = 64;
1565 image_create_info.extent.depth = 1;
1566 image_create_info.mipLevels = 1;
1567 image_create_info.arrayLayers = 1;
1568 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001569 // Image tiling must be optimal to trigger error when aliasing linear buffer
1570 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1572 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1573 image_create_info.queueFamilyIndexCount = 0;
1574 image_create_info.pQueueFamilyIndices = NULL;
1575 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1576 image_create_info.flags = 0;
1577
Tobin Ehlisf11be982016-05-11 13:52:53 -06001578 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1579 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001580 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1581 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001582
Tobin Ehlis077ded32016-05-12 17:39:13 -06001583 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1584
1585 VkMemoryAllocateInfo alloc_info = {};
1586 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1587 alloc_info.pNext = NULL;
1588 alloc_info.memoryTypeIndex = 0;
1589 // Ensure memory is big enough for both bindings
1590 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001591 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1592 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001596 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001597 return;
1598 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1600 ASSERT_VK_SUCCESS(err);
1601 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1602 ASSERT_VK_SUCCESS(err);
1603
Rene Lindsayd14f5572016-12-16 14:57:18 -07001604 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1605
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001606 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001607 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001608 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1609 m_errorMonitor->VerifyFound();
1610
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001611 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001612 // aliasing buffer2
1613 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1614 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001615 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1616 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001617 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001618 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001620 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001621 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001622 m_errorMonitor->VerifyFound();
1623
1624 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001625 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001626 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001627 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001628 vkFreeMemory(m_device->device(), mem, NULL);
1629 vkFreeMemory(m_device->device(), mem_img, NULL);
1630}
1631
Tobin Ehlis35372522016-05-12 08:32:31 -06001632TEST_F(VkLayerTest, InvalidMemoryMapping) {
1633 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1634 VkResult err;
1635 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001636 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001637
1638 VkBuffer buffer;
1639 VkDeviceMemory mem;
1640 VkMemoryRequirements mem_reqs;
1641
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001642 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1643
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 VkBufferCreateInfo buf_info = {};
1645 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1646 buf_info.pNext = NULL;
1647 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1648 buf_info.size = 256;
1649 buf_info.queueFamilyIndexCount = 0;
1650 buf_info.pQueueFamilyIndices = NULL;
1651 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1652 buf_info.flags = 0;
1653 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1654 ASSERT_VK_SUCCESS(err);
1655
1656 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1657 VkMemoryAllocateInfo alloc_info = {};
1658 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1659 alloc_info.pNext = NULL;
1660 alloc_info.memoryTypeIndex = 0;
1661
1662 // Ensure memory is big enough for both bindings
1663 static const VkDeviceSize allocation_size = 0x10000;
1664 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001665 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 -06001666 if (!pass) {
1667 vkDestroyBuffer(m_device->device(), buffer, NULL);
1668 return;
1669 }
1670 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1671 ASSERT_VK_SUCCESS(err);
1672
1673 uint8_t *pData;
1674 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001675 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 -06001676 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1677 m_errorMonitor->VerifyFound();
1678 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001679 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1682 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1683 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001684 m_errorMonitor->VerifyFound();
1685
1686 // Unmap the memory to avoid re-map error
1687 vkUnmapMemory(m_device->device(), mem);
1688 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1690 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1691 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001692 m_errorMonitor->VerifyFound();
1693 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1695 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001696 m_errorMonitor->VerifyFound();
1697 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001699 vkUnmapMemory(m_device->device(), mem);
1700 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001701
Tobin Ehlis35372522016-05-12 08:32:31 -06001702 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001704 ASSERT_VK_SUCCESS(err);
1705 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001706 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001707 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001708 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001710 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1711 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001712
Tobin Ehlis35372522016-05-12 08:32:31 -06001713 // Now flush range that oversteps mapped range
1714 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001715 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001716 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001717 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001718 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1720 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1721 m_errorMonitor->VerifyFound();
1722
1723 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1724 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001725 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001726 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001727 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001728 mmr.size = VK_WHOLE_SIZE;
1729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001730 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1731 m_errorMonitor->VerifyFound();
1732
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001733#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001734 // Some platforms have an atomsize of 1 which makes the test meaningless
1735 if (atom_size > 3) {
1736 // Now with an offset NOT a multiple of the device limit
1737 vkUnmapMemory(m_device->device(), mem);
1738 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1739 ASSERT_VK_SUCCESS(err);
1740 mmr.offset = 3; // Not a multiple of atom_size
1741 mmr.size = VK_WHOLE_SIZE;
1742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1743 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1744 m_errorMonitor->VerifyFound();
1745
1746 // Now with a size NOT a multiple of the device limit
1747 vkUnmapMemory(m_device->device(), mem);
1748 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1749 ASSERT_VK_SUCCESS(err);
1750 mmr.offset = atom_size;
1751 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1753 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1754 m_errorMonitor->VerifyFound();
1755 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001756#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001757 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1758 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001759 if (!pass) {
1760 vkFreeMemory(m_device->device(), mem, NULL);
1761 vkDestroyBuffer(m_device->device(), buffer, NULL);
1762 return;
1763 }
1764 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1765 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1766
1767 vkDestroyBuffer(m_device->device(), buffer, NULL);
1768 vkFreeMemory(m_device->device(), mem, NULL);
1769}
1770
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001771#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001772TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1773 VkResult err;
1774 bool pass;
1775
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001776 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1777 // following declaration (which is temporarily being moved below):
1778 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001779 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001780 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001781 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001782 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001783 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001784 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001785
Tony Barbour1fa09702017-03-16 12:09:08 -06001786 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001787
Ian Elliott3f06ce52016-04-29 14:46:21 -06001788#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1789#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1790 // Use the functions from the VK_KHR_android_surface extension without
1791 // enabling that extension:
1792
1793 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001794 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1796 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001797 pass = (err != VK_SUCCESS);
1798 ASSERT_TRUE(pass);
1799 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001800#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001801
Ian Elliott3f06ce52016-04-29 14:46:21 -06001802#if defined(VK_USE_PLATFORM_MIR_KHR)
1803 // Use the functions from the VK_KHR_mir_surface extension without enabling
1804 // that extension:
1805
1806 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001807 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1810 pass = (err != VK_SUCCESS);
1811 ASSERT_TRUE(pass);
1812 m_errorMonitor->VerifyFound();
1813
1814 // Tell whether an mir_connection supports presentation:
1815 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1817 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001819#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001820
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1822 // Use the functions from the VK_KHR_wayland_surface extension without
1823 // enabling that extension:
1824
1825 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001826 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1828 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001829 pass = (err != VK_SUCCESS);
1830 ASSERT_TRUE(pass);
1831 m_errorMonitor->VerifyFound();
1832
1833 // Tell whether an wayland_display supports presentation:
1834 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1836 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001838#endif // VK_USE_PLATFORM_WAYLAND_KHR
1839#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001840
Ian Elliott3f06ce52016-04-29 14:46:21 -06001841#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001845 // Use the functions from the VK_KHR_win32_surface extension without
1846 // enabling that extension:
1847
1848 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001849 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1851 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001852 pass = (err != VK_SUCCESS);
1853 ASSERT_TRUE(pass);
1854 m_errorMonitor->VerifyFound();
1855
1856 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001858 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001860// Set this (for now, until all platforms are supported and tested):
1861#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001862#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001863#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001864 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1865 // TO NON-LINUX PLATFORMS:
1866 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001867#endif
1868#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001869 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001875 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001881 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001882 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1884 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001889
Ian Elliott12630812016-04-29 14:35:43 -06001890#if defined(VK_USE_PLATFORM_XLIB_KHR)
1891 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1892 // that extension:
1893
1894 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001895 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001897 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1898 pass = (err != VK_SUCCESS);
1899 ASSERT_TRUE(pass);
1900 m_errorMonitor->VerifyFound();
1901
1902 // Tell whether an Xlib VisualID supports presentation:
1903 Display *dpy = NULL;
1904 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001905 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001906 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1907 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001908// Set this (for now, until all platforms are supported and tested):
1909#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001910#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001911
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001912// Use the functions from the VK_KHR_surface extension without enabling
1913// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001914
Ian Elliott489eec02016-05-05 14:12:44 -06001915#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001916 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001918 vkDestroySurfaceKHR(instance(), surface, NULL);
1919 m_errorMonitor->VerifyFound();
1920
1921 // Check if surface supports presentation:
1922 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001924 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1925 pass = (err != VK_SUCCESS);
1926 ASSERT_TRUE(pass);
1927 m_errorMonitor->VerifyFound();
1928
1929 // Check surface capabilities:
1930 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1932 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001933 pass = (err != VK_SUCCESS);
1934 ASSERT_TRUE(pass);
1935 m_errorMonitor->VerifyFound();
1936
1937 // Check surface formats:
1938 uint32_t format_count = 0;
1939 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1941 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Check surface present modes:
1947 uint32_t present_mode_count = 0;
1948 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1950 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001951 pass = (err != VK_SUCCESS);
1952 ASSERT_TRUE(pass);
1953 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001954#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001955
Ian Elliott1c32c772016-04-28 14:47:13 -06001956 // Use the functions from the VK_KHR_swapchain extension without enabling
1957 // that extension:
1958
1959 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1962 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001963 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001964 pass = (err != VK_SUCCESS);
1965 ASSERT_TRUE(pass);
1966 m_errorMonitor->VerifyFound();
1967
1968 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1970 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001971 pass = (err != VK_SUCCESS);
1972 ASSERT_TRUE(pass);
1973 m_errorMonitor->VerifyFound();
1974
Chris Forbeseb7d5502016-09-13 18:19:21 +12001975 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1976 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1977 VkFence fence;
1978 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1979
Ian Elliott1c32c772016-04-28 14:47:13 -06001980 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001982 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001983 pass = (err != VK_SUCCESS);
1984 ASSERT_TRUE(pass);
1985 m_errorMonitor->VerifyFound();
1986
Chris Forbeseb7d5502016-09-13 18:19:21 +12001987 vkDestroyFence(m_device->device(), fence, nullptr);
1988
Ian Elliott1c32c772016-04-28 14:47:13 -06001989 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001990 //
1991 // NOTE: Currently can't test this because a real swapchain is needed (as
1992 // opposed to the fake one we created) in order for the layer to lookup the
1993 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001994
1995 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001997 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1998 m_errorMonitor->VerifyFound();
1999}
Chris Forbes09368e42016-10-13 11:59:22 +13002000#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06002001
Karl Schultz6addd812016-02-02 17:17:23 -07002002TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
2003 VkResult err;
2004 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002005
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2007 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002008
Tony Barbour1fa09702017-03-16 12:09:08 -06002009 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002010
2011 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002012 VkImage image;
2013 VkDeviceMemory mem;
2014 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002015
Karl Schultz6addd812016-02-02 17:17:23 -07002016 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2017 const int32_t tex_width = 32;
2018 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002019
Tony Barboureb254902015-07-15 12:50:33 -06002020 VkImageCreateInfo image_create_info = {};
2021 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002022 image_create_info.pNext = NULL;
2023 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2024 image_create_info.format = tex_format;
2025 image_create_info.extent.width = tex_width;
2026 image_create_info.extent.height = tex_height;
2027 image_create_info.extent.depth = 1;
2028 image_create_info.mipLevels = 1;
2029 image_create_info.arrayLayers = 1;
2030 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2031 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2032 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2033 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002034 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002035
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002036 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002037 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002038 mem_alloc.pNext = NULL;
2039 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002040
Chia-I Wuf7458c52015-10-26 21:10:41 +08002041 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002042 ASSERT_VK_SUCCESS(err);
2043
Karl Schultz6addd812016-02-02 17:17:23 -07002044 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002045
Mark Lobodzinski23065352015-05-29 09:32:35 -05002046 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002047
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002048 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 -07002049 if (!pass) { // If we can't find any unmappable memory this test doesn't
2050 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002051 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002052 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002053 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002054
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002055 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002056 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002057 ASSERT_VK_SUCCESS(err);
2058
2059 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002060 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002061 ASSERT_VK_SUCCESS(err);
2062
2063 // Map memory as if to initialize the image
2064 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002065 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002066
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002067 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002068
Chia-I Wuf7458c52015-10-26 21:10:41 +08002069 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002070 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002071}
2072
Karl Schultz6addd812016-02-02 17:17:23 -07002073TEST_F(VkLayerTest, RebindMemory) {
2074 VkResult err;
2075 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002078
Tony Barbour1fa09702017-03-16 12:09:08 -06002079 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002080
2081 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002082 VkImage image;
2083 VkDeviceMemory mem1;
2084 VkDeviceMemory mem2;
2085 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002086
Karl Schultz6addd812016-02-02 17:17:23 -07002087 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2088 const int32_t tex_width = 32;
2089 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002090
Tony Barboureb254902015-07-15 12:50:33 -06002091 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002092 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2093 image_create_info.pNext = NULL;
2094 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2095 image_create_info.format = tex_format;
2096 image_create_info.extent.width = tex_width;
2097 image_create_info.extent.height = tex_height;
2098 image_create_info.extent.depth = 1;
2099 image_create_info.mipLevels = 1;
2100 image_create_info.arrayLayers = 1;
2101 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2102 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2103 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2104 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002105
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002106 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002107 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2108 mem_alloc.pNext = NULL;
2109 mem_alloc.allocationSize = 0;
2110 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce failure, do NOT set memProps to
2113 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002114 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002115 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002116 ASSERT_VK_SUCCESS(err);
2117
Karl Schultz6addd812016-02-02 17:17:23 -07002118 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002119
2120 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002121 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002122 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002123
2124 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002125 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002126 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002127 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002128 ASSERT_VK_SUCCESS(err);
2129
2130 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002131 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002132 ASSERT_VK_SUCCESS(err);
2133
Karl Schultz6addd812016-02-02 17:17:23 -07002134 // Introduce validation failure, try to bind a different memory object to
2135 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002136 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002137
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002138 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002139
Chia-I Wuf7458c52015-10-26 21:10:41 +08002140 vkDestroyImage(m_device->device(), image, NULL);
2141 vkFreeMemory(m_device->device(), mem1, NULL);
2142 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002143}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002144
Karl Schultz6addd812016-02-02 17:17:23 -07002145TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002146 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002147
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2149 "submitted in SIGNALED state. Fences "
2150 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002151
2152 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002153 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2154 fenceInfo.pNext = NULL;
2155 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002156
Tony Barbour1fa09702017-03-16 12:09:08 -06002157 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002158 ASSERT_NO_FATAL_FAILURE(InitViewport());
2159 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2160
Tony Barbour552f6c02016-12-21 14:34:07 -07002161 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002163 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002164
2165 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002166
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002167 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002168 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2169 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002170 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002171 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002172 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002173 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002174 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002175 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002176 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002177
2178 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002179 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002180
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002181 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002182}
Chris Forbes4e44c912016-06-16 10:20:00 +12002183
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002184TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002185 TEST_DESCRIPTION(
2186 "Specify wrong usage for image then create conflicting view of image "
2187 "Initialize buffer with wrong usage then perform copy expecting errors "
2188 "from both the image and the buffer (2 calls)");
Mark Lobodzinski33826372017-04-13 11:10:11 -06002189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for Image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002190
Tony Barbour1fa09702017-03-16 12:09:08 -06002191 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002192 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002193 if (!format) {
2194 printf(" No Depth + Stencil format found. Skipped.\n");
2195 return;
2196 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002197
Tony Barbourf92621a2016-05-02 14:28:12 -06002198 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002199 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002200 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002201 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002202
Tony Barbourf92621a2016-05-02 14:28:12 -06002203 VkImageView dsv;
2204 VkImageViewCreateInfo dsvci = {};
2205 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2206 dsvci.image = image.handle();
2207 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002208 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002209 dsvci.subresourceRange.layerCount = 1;
2210 dsvci.subresourceRange.baseMipLevel = 0;
2211 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002212 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002213
Tony Barbourf92621a2016-05-02 14:28:12 -06002214 // Create a view with depth / stencil aspect for image with different usage
2215 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002216
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002217 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002218
2219 // Initialize buffer with TRANSFER_DST usage
2220 vk_testing::Buffer buffer;
2221 VkMemoryPropertyFlags reqs = 0;
2222 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2223 VkBufferImageCopy region = {};
2224 region.bufferRowLength = 128;
2225 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002226 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002227 region.imageSubresource.layerCount = 1;
2228 region.imageExtent.height = 16;
2229 region.imageExtent.width = 16;
2230 region.imageExtent.depth = 1;
2231
Mark Lobodzinski80871462017-02-16 10:37:27 -07002232 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002233 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002234
Chris Forbesda581202016-10-06 18:25:26 +13002235 // two separate errors from this call:
Mark Lobodzinski33826372017-04-13 11:10:11 -06002236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2237 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 +13002238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002239 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2240 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002241 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002242}
Tony Barbour75d79f02016-08-30 09:39:07 -06002243
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002244TEST_F(VkLayerTest, LeakAnObject) {
2245 VkResult err;
2246
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002247 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002248
2249 // Note that we have to create a new device since destroying the
2250 // framework's device causes Teardown() to fail and just calling Teardown
2251 // will destroy the errorMonitor.
2252
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002254
Tony Barbour1fa09702017-03-16 12:09:08 -06002255 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002256
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002257 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002258 std::vector<VkDeviceQueueCreateInfo> queue_info;
2259 queue_info.reserve(queue_props.size());
2260 std::vector<std::vector<float>> queue_priorities;
2261 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2262 VkDeviceQueueCreateInfo qi = {};
2263 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2264 qi.pNext = NULL;
2265 qi.queueFamilyIndex = i;
2266 qi.queueCount = queue_props[i].queueCount;
2267 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2268 qi.pQueuePriorities = queue_priorities[i].data();
2269 queue_info.push_back(qi);
2270 }
2271
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002272 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002273
2274 // The sacrificial device object
2275 VkDevice testDevice;
2276 VkDeviceCreateInfo device_create_info = {};
2277 auto features = m_device->phy().features();
2278 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2279 device_create_info.pNext = NULL;
2280 device_create_info.queueCreateInfoCount = queue_info.size();
2281 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002282 device_create_info.enabledLayerCount = 0;
2283 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284 device_create_info.pEnabledFeatures = &features;
2285 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2286 ASSERT_VK_SUCCESS(err);
2287
2288 VkFence fence;
2289 VkFenceCreateInfo fence_create_info = {};
2290 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2291 fence_create_info.pNext = NULL;
2292 fence_create_info.flags = 0;
2293 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2294 ASSERT_VK_SUCCESS(err);
2295
2296 // Induce failure by not calling vkDestroyFence
2297 vkDestroyDevice(testDevice, NULL);
2298 m_errorMonitor->VerifyFound();
2299}
2300
2301TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002302 TEST_DESCRIPTION(
2303 "Allocate command buffers from one command pool and "
2304 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Tony Barbour1fa09702017-03-16 12:09:08 -06002308 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309 VkCommandPool command_pool_one;
2310 VkCommandPool command_pool_two;
2311
2312 VkCommandPoolCreateInfo pool_create_info{};
2313 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2314 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2315 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2316
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002317 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002318
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002319 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002320
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002321 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002325 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002327 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002328
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002329 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002330
2331 m_errorMonitor->VerifyFound();
2332
2333 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2334 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2335}
2336
2337TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2338 VkResult err;
2339
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002340 TEST_DESCRIPTION(
2341 "Allocate descriptor sets from one DS pool and "
2342 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002343
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002345
Tony Barbour1fa09702017-03-16 12:09:08 -06002346 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2348
2349 VkDescriptorPoolSize ds_type_count = {};
2350 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2351 ds_type_count.descriptorCount = 1;
2352
2353 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2354 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2355 ds_pool_ci.pNext = NULL;
2356 ds_pool_ci.flags = 0;
2357 ds_pool_ci.maxSets = 1;
2358 ds_pool_ci.poolSizeCount = 1;
2359 ds_pool_ci.pPoolSizes = &ds_type_count;
2360
2361 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002362 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002363 ASSERT_VK_SUCCESS(err);
2364
2365 // Create a second descriptor pool
2366 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002367 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002368 ASSERT_VK_SUCCESS(err);
2369
2370 VkDescriptorSetLayoutBinding dsl_binding = {};
2371 dsl_binding.binding = 0;
2372 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2373 dsl_binding.descriptorCount = 1;
2374 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2375 dsl_binding.pImmutableSamplers = NULL;
2376
2377 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2378 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2379 ds_layout_ci.pNext = NULL;
2380 ds_layout_ci.bindingCount = 1;
2381 ds_layout_ci.pBindings = &dsl_binding;
2382
2383 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002384 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002385 ASSERT_VK_SUCCESS(err);
2386
2387 VkDescriptorSet descriptorSet;
2388 VkDescriptorSetAllocateInfo alloc_info = {};
2389 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2390 alloc_info.descriptorSetCount = 1;
2391 alloc_info.descriptorPool = ds_pool_one;
2392 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002393 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002394 ASSERT_VK_SUCCESS(err);
2395
2396 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2397
2398 m_errorMonitor->VerifyFound();
2399
2400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2401 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2402 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2403}
2404
2405TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002407
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002408 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002409
Tony Barbour1fa09702017-03-16 12:09:08 -06002410 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002411
2412 // Pass bogus handle into GetImageMemoryRequirements
2413 VkMemoryRequirements mem_reqs;
2414 uint64_t fakeImageHandle = 0xCADECADE;
2415 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2416
2417 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2418
2419 m_errorMonitor->VerifyFound();
2420}
2421
Mike Schuchardt17838902017-02-21 09:48:06 -07002422TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2423 TEST_DESCRIPTION(
2424 "Try to destroy a render pass object using a device other than the one it was created on. "
2425 "This should generate a distinct error from the invalid handle error.");
2426 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002427 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2429
2430 // Create second device
2431 float priorities[] = {1.0f};
2432 VkDeviceQueueCreateInfo queue_info{};
2433 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2434 queue_info.pNext = NULL;
2435 queue_info.flags = 0;
2436 queue_info.queueFamilyIndex = 0;
2437 queue_info.queueCount = 1;
2438 queue_info.pQueuePriorities = &priorities[0];
2439
2440 VkDeviceCreateInfo device_create_info = {};
2441 auto features = m_device->phy().features();
2442 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2443 device_create_info.pNext = NULL;
2444 device_create_info.queueCreateInfoCount = 1;
2445 device_create_info.pQueueCreateInfos = &queue_info;
2446 device_create_info.enabledLayerCount = 0;
2447 device_create_info.ppEnabledLayerNames = NULL;
2448 device_create_info.pEnabledFeatures = &features;
2449
2450 VkDevice second_device;
2451 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2452
2453 // Try to destroy the renderpass from the first device using the second device
2454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2455 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2456 m_errorMonitor->VerifyFound();
2457
2458 vkDestroyDevice(second_device, NULL);
2459}
2460
Karl Schultz6addd812016-02-02 17:17:23 -07002461TEST_F(VkLayerTest, PipelineNotBound) {
2462 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002464 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002465
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002467
Tony Barbour1fa09702017-03-16 12:09:08 -06002468 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002470
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002471 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002472 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2473 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002474
2475 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002476 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2477 ds_pool_ci.pNext = NULL;
2478 ds_pool_ci.maxSets = 1;
2479 ds_pool_ci.poolSizeCount = 1;
2480 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002481
2482 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002483 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002484 ASSERT_VK_SUCCESS(err);
2485
2486 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002487 dsl_binding.binding = 0;
2488 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2489 dsl_binding.descriptorCount = 1;
2490 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2491 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
2493 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002494 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2495 ds_layout_ci.pNext = NULL;
2496 ds_layout_ci.bindingCount = 1;
2497 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002498
2499 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002500 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002501 ASSERT_VK_SUCCESS(err);
2502
2503 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002504 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002505 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002506 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002507 alloc_info.descriptorPool = ds_pool;
2508 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002509 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002510 ASSERT_VK_SUCCESS(err);
2511
2512 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002513 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2514 pipeline_layout_ci.pNext = NULL;
2515 pipeline_layout_ci.setLayoutCount = 1;
2516 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002517
2518 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002519 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002520 ASSERT_VK_SUCCESS(err);
2521
Mark Youngad779052016-01-06 14:26:04 -07002522 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002523
Tony Barbour552f6c02016-12-21 14:34:07 -07002524 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002525 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002526
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002527 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002528
Chia-I Wuf7458c52015-10-26 21:10:41 +08002529 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2530 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2531 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002532}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002533
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002534TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2535 VkResult err;
2536
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002537 TEST_DESCRIPTION(
2538 "Test validation check for an invalid memory type index "
2539 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002540
Tony Barbour1fa09702017-03-16 12:09:08 -06002541 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002542
2543 // Create an image, allocate memory, set a bad typeIndex and then try to
2544 // bind it
2545 VkImage image;
2546 VkDeviceMemory mem;
2547 VkMemoryRequirements mem_reqs;
2548 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2549 const int32_t tex_width = 32;
2550 const int32_t tex_height = 32;
2551
2552 VkImageCreateInfo image_create_info = {};
2553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2554 image_create_info.pNext = NULL;
2555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2556 image_create_info.format = tex_format;
2557 image_create_info.extent.width = tex_width;
2558 image_create_info.extent.height = tex_height;
2559 image_create_info.extent.depth = 1;
2560 image_create_info.mipLevels = 1;
2561 image_create_info.arrayLayers = 1;
2562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2563 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2564 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2565 image_create_info.flags = 0;
2566
2567 VkMemoryAllocateInfo mem_alloc = {};
2568 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2569 mem_alloc.pNext = NULL;
2570 mem_alloc.allocationSize = 0;
2571 mem_alloc.memoryTypeIndex = 0;
2572
2573 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2574 ASSERT_VK_SUCCESS(err);
2575
2576 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2577 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002578
2579 // Introduce Failure, select invalid TypeIndex
2580 VkPhysicalDeviceMemoryProperties memory_info;
2581
2582 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2583 unsigned int i;
2584 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2585 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2586 mem_alloc.memoryTypeIndex = i;
2587 break;
2588 }
2589 }
2590 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002591 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002592 vkDestroyImage(m_device->device(), image, NULL);
2593 return;
2594 }
2595
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002596 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 -06002597
2598 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2599 ASSERT_VK_SUCCESS(err);
2600
2601 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2602 (void)err;
2603
2604 m_errorMonitor->VerifyFound();
2605
2606 vkDestroyImage(m_device->device(), image, NULL);
2607 vkFreeMemory(m_device->device(), mem, NULL);
2608}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002609
Karl Schultz6addd812016-02-02 17:17:23 -07002610TEST_F(VkLayerTest, BindInvalidMemory) {
2611 VkResult err;
2612 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Tony Barbour1fa09702017-03-16 12:09:08 -06002614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002615
Cortf801b982017-01-17 18:10:21 -08002616 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002617 const int32_t tex_width = 256;
2618 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002619
2620 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002621 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2622 image_create_info.pNext = NULL;
2623 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2624 image_create_info.format = tex_format;
2625 image_create_info.extent.width = tex_width;
2626 image_create_info.extent.height = tex_height;
2627 image_create_info.extent.depth = 1;
2628 image_create_info.mipLevels = 1;
2629 image_create_info.arrayLayers = 1;
2630 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002631 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002632 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2633 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002634
Cortf801b982017-01-17 18:10:21 -08002635 VkBufferCreateInfo buffer_create_info = {};
2636 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2637 buffer_create_info.pNext = NULL;
2638 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002639 buffer_create_info.size = 4 * 1024 * 1024;
2640 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002641 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002642
Cortf801b982017-01-17 18:10:21 -08002643 // Create an image/buffer, allocate memory, free it, and then try to bind it
2644 {
2645 VkImage image = VK_NULL_HANDLE;
2646 VkBuffer buffer = VK_NULL_HANDLE;
2647 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2648 ASSERT_VK_SUCCESS(err);
2649 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2650 ASSERT_VK_SUCCESS(err);
2651 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2652 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2653 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002654
Cortf801b982017-01-17 18:10:21 -08002655 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2656 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2657 image_mem_alloc.allocationSize = image_mem_reqs.size;
2658 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2659 ASSERT_TRUE(pass);
2660 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2661 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2662 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2663 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002664
Cortf801b982017-01-17 18:10:21 -08002665 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2666 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2667 ASSERT_VK_SUCCESS(err);
2668 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2669 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002670
Cortf801b982017-01-17 18:10:21 -08002671 vkFreeMemory(device(), image_mem, NULL);
2672 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002673
Cortf801b982017-01-17 18:10:21 -08002674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2675 err = vkBindImageMemory(device(), image, image_mem, 0);
2676 (void)err; // This may very well return an error.
2677 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002678
Cortf801b982017-01-17 18:10:21 -08002679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2680 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2681 (void)err; // This may very well return an error.
2682 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002683
Cortf801b982017-01-17 18:10:21 -08002684 vkDestroyImage(m_device->device(), image, NULL);
2685 vkDestroyBuffer(m_device->device(), buffer, NULL);
2686 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002687
2688 // Try to bind memory to an object that already has a memory binding
2689 {
2690 VkImage image = VK_NULL_HANDLE;
2691 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2692 ASSERT_VK_SUCCESS(err);
2693 VkBuffer buffer = VK_NULL_HANDLE;
2694 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2695 ASSERT_VK_SUCCESS(err);
2696 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2697 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2698 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2699 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2700 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2701 image_alloc_info.allocationSize = image_mem_reqs.size;
2702 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2703 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2704 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2705 ASSERT_TRUE(pass);
2706 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2707 ASSERT_TRUE(pass);
2708 VkDeviceMemory image_mem, buffer_mem;
2709 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2710 ASSERT_VK_SUCCESS(err);
2711 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2712 ASSERT_VK_SUCCESS(err);
2713
2714 err = vkBindImageMemory(device(), image, image_mem, 0);
2715 ASSERT_VK_SUCCESS(err);
2716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2717 err = vkBindImageMemory(device(), image, image_mem, 0);
2718 (void)err; // This may very well return an error.
2719 m_errorMonitor->VerifyFound();
2720
2721 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2722 ASSERT_VK_SUCCESS(err);
2723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2724 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2725 (void)err; // This may very well return an error.
2726 m_errorMonitor->VerifyFound();
2727
2728 vkFreeMemory(device(), image_mem, NULL);
2729 vkFreeMemory(device(), buffer_mem, NULL);
2730 vkDestroyImage(device(), image, NULL);
2731 vkDestroyBuffer(device(), buffer, NULL);
2732 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002733
Cort Strattonde748202017-02-17 12:50:01 -08002734 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002735 {
2736 VkImage image = VK_NULL_HANDLE;
2737 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2738 ASSERT_VK_SUCCESS(err);
2739 VkBuffer buffer = VK_NULL_HANDLE;
2740 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2741 ASSERT_VK_SUCCESS(err);
2742 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2743 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2744 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2745 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2746 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002747 // Leave some extra space for alignment wiggle room
2748 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002749 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002750 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002751 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2752 ASSERT_TRUE(pass);
2753 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2754 ASSERT_TRUE(pass);
2755 VkDeviceMemory image_mem, buffer_mem;
2756 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2757 ASSERT_VK_SUCCESS(err);
2758 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2759 ASSERT_VK_SUCCESS(err);
2760
Cort Strattonde748202017-02-17 12:50:01 -08002761 // Test unaligned memory offset
2762 {
2763 if (image_mem_reqs.alignment > 1) {
2764 VkDeviceSize image_offset = 1;
2765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2766 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2767 (void)err; // This may very well return an error.
2768 m_errorMonitor->VerifyFound();
2769 }
Cort6c7dff72017-01-27 18:34:50 -08002770
Cort Strattonde748202017-02-17 12:50:01 -08002771 if (buffer_mem_reqs.alignment > 1) {
2772 VkDeviceSize buffer_offset = 1;
2773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2774 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2775 (void)err; // This may very well return an error.
2776 m_errorMonitor->VerifyFound();
2777 }
2778 }
2779
2780 // Test memory offsets outside the memory allocation
2781 {
2782 VkDeviceSize image_offset =
2783 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2785 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2786 (void)err; // This may very well return an error.
2787 m_errorMonitor->VerifyFound();
2788
2789 VkDeviceSize buffer_offset =
2790 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2792 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2793 (void)err; // This may very well return an error.
2794 m_errorMonitor->VerifyFound();
2795 }
2796
2797 // Test memory offsets within the memory allocation, but which leave too little memory for
2798 // the resource.
2799 {
2800 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002801 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2803 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2804 (void)err; // This may very well return an error.
2805 m_errorMonitor->VerifyFound();
2806 }
2807
2808 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2809 if (buffer_offset > 0) {
2810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2811 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2812 (void)err; // This may very well return an error.
2813 m_errorMonitor->VerifyFound();
2814 }
2815 }
Cort6c7dff72017-01-27 18:34:50 -08002816
2817 vkFreeMemory(device(), image_mem, NULL);
2818 vkFreeMemory(device(), buffer_mem, NULL);
2819 vkDestroyImage(device(), image, NULL);
2820 vkDestroyBuffer(device(), buffer, NULL);
2821 }
2822
Cort Stratton4c38bb52017-01-28 13:33:10 -08002823 // Try to bind memory to an object with an invalid memory type
2824 {
2825 VkImage image = VK_NULL_HANDLE;
2826 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2827 ASSERT_VK_SUCCESS(err);
2828 VkBuffer buffer = VK_NULL_HANDLE;
2829 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2830 ASSERT_VK_SUCCESS(err);
2831 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2832 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2833 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2834 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2835 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2836 image_alloc_info.allocationSize = image_mem_reqs.size;
2837 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2838 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 // Create a mask of available memory types *not* supported by these resources,
2840 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002841 VkPhysicalDeviceMemoryProperties memory_properties = {};
2842 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002843 VkDeviceMemory image_mem, buffer_mem;
2844
Cort Stratton4c38bb52017-01-28 13:33:10 -08002845 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002846 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002847 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2848 ASSERT_TRUE(pass);
2849 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2850 ASSERT_VK_SUCCESS(err);
2851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2852 err = vkBindImageMemory(device(), image, image_mem, 0);
2853 (void)err; // This may very well return an error.
2854 m_errorMonitor->VerifyFound();
2855 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002856 }
2857
Cort Stratton4c38bb52017-01-28 13:33:10 -08002858 uint32_t buffer_unsupported_mem_type_bits =
2859 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002860 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002861 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2862 ASSERT_TRUE(pass);
2863 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2864 ASSERT_VK_SUCCESS(err);
2865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2866 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2867 (void)err; // This may very well return an error.
2868 m_errorMonitor->VerifyFound();
2869 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002870 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002871
Cort Stratton4c38bb52017-01-28 13:33:10 -08002872 vkDestroyImage(device(), image, NULL);
2873 vkDestroyBuffer(device(), buffer, NULL);
2874 }
2875
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002876 // Try to bind memory to an image created with sparse memory flags
2877 {
2878 VkImageCreateInfo sparse_image_create_info = image_create_info;
2879 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2880 VkImageFormatProperties image_format_properties = {};
2881 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2882 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2883 sparse_image_create_info.usage, sparse_image_create_info.flags,
2884 &image_format_properties);
2885 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2886 // most likely means sparse formats aren't supported here; skip this test.
2887 } else {
2888 ASSERT_VK_SUCCESS(err);
2889 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002890 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002891 return;
2892 } else {
2893 VkImage sparse_image = VK_NULL_HANDLE;
2894 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2895 ASSERT_VK_SUCCESS(err);
2896 VkMemoryRequirements sparse_mem_reqs = {};
2897 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2898 if (sparse_mem_reqs.memoryTypeBits != 0) {
2899 VkMemoryAllocateInfo sparse_mem_alloc = {};
2900 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2901 sparse_mem_alloc.pNext = NULL;
2902 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2903 sparse_mem_alloc.memoryTypeIndex = 0;
2904 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2905 ASSERT_TRUE(pass);
2906 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2907 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2908 ASSERT_VK_SUCCESS(err);
2909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2910 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2911 // This may very well return an error.
2912 (void)err;
2913 m_errorMonitor->VerifyFound();
2914 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2915 }
2916 vkDestroyImage(m_device->device(), sparse_image, NULL);
2917 }
2918 }
2919 }
2920
2921 // Try to bind memory to a buffer created with sparse memory flags
2922 {
2923 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2924 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2925 if (!m_device->phy().features().sparseResidencyBuffer) {
2926 // most likely means sparse formats aren't supported here; skip this test.
2927 } else {
2928 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2929 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2930 ASSERT_VK_SUCCESS(err);
2931 VkMemoryRequirements sparse_mem_reqs = {};
2932 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2933 if (sparse_mem_reqs.memoryTypeBits != 0) {
2934 VkMemoryAllocateInfo sparse_mem_alloc = {};
2935 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2936 sparse_mem_alloc.pNext = NULL;
2937 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2938 sparse_mem_alloc.memoryTypeIndex = 0;
2939 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2940 ASSERT_TRUE(pass);
2941 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2942 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2943 ASSERT_VK_SUCCESS(err);
2944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2945 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2946 // This may very well return an error.
2947 (void)err;
2948 m_errorMonitor->VerifyFound();
2949 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2950 }
2951 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2952 }
2953 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002954}
2955
Karl Schultz6addd812016-02-02 17:17:23 -07002956TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2957 VkResult err;
2958 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002959
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002961
Tony Barbour1fa09702017-03-16 12:09:08 -06002962 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 // Create an image object, allocate memory, destroy the object and then try
2965 // to bind it
2966 VkImage image;
2967 VkDeviceMemory mem;
2968 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002969
Karl Schultz6addd812016-02-02 17:17:23 -07002970 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2971 const int32_t tex_width = 32;
2972 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
2974 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002975 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2976 image_create_info.pNext = NULL;
2977 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2978 image_create_info.format = tex_format;
2979 image_create_info.extent.width = tex_width;
2980 image_create_info.extent.height = tex_height;
2981 image_create_info.extent.depth = 1;
2982 image_create_info.mipLevels = 1;
2983 image_create_info.arrayLayers = 1;
2984 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2985 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2986 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2987 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002988
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002989 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002990 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2991 mem_alloc.pNext = NULL;
2992 mem_alloc.allocationSize = 0;
2993 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002994
Chia-I Wuf7458c52015-10-26 21:10:41 +08002995 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002996 ASSERT_VK_SUCCESS(err);
2997
Karl Schultz6addd812016-02-02 17:17:23 -07002998 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002999
3000 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003001 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06003002 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06003003
3004 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08003005 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003006 ASSERT_VK_SUCCESS(err);
3007
3008 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003009 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003010 ASSERT_VK_SUCCESS(err);
3011
3012 // Now Try to bind memory to this destroyed object
3013 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3014 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003015 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003016
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003017 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003018
Chia-I Wuf7458c52015-10-26 21:10:41 +08003019 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003020}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003021
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003022TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3023 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3024
Tony Barbour1fa09702017-03-16 12:09:08 -06003025 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3027
3028 VkVertexInputBindingDescription input_binding;
3029 memset(&input_binding, 0, sizeof(input_binding));
3030
3031 VkVertexInputAttributeDescription input_attribs;
3032 memset(&input_attribs, 0, sizeof(input_attribs));
3033
3034 // Pick a really bad format for this purpose and make sure it should fail
3035 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3036 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3037 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003038 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003039 return;
3040 }
3041
3042 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003043 char const *vsSource =
3044 "#version 450\n"
3045 "\n"
3046 "out gl_PerVertex {\n"
3047 " vec4 gl_Position;\n"
3048 "};\n"
3049 "void main(){\n"
3050 " gl_Position = vec4(1);\n"
3051 "}\n";
3052 char const *fsSource =
3053 "#version 450\n"
3054 "\n"
3055 "layout(location=0) out vec4 color;\n"
3056 "void main(){\n"
3057 " color = vec4(1);\n"
3058 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003059
3060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3061 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3062 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3063
3064 VkPipelineObj pipe(m_device);
3065 pipe.AddColorAttachment();
3066 pipe.AddShader(&vs);
3067 pipe.AddShader(&fs);
3068
3069 pipe.AddVertexInputBindings(&input_binding, 1);
3070 pipe.AddVertexInputAttribs(&input_attribs, 1);
3071
3072 VkDescriptorSetObj descriptorSet(m_device);
3073 descriptorSet.AppendDummy();
3074 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3075
3076 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3077
3078 m_errorMonitor->VerifyFound();
3079}
3080
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003081TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003082 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003083 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003084
3085 VkMemoryPropertyFlags reqs = 0;
3086 VkImageCreateInfo image_create_info = {};
3087 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3088 image_create_info.pNext = NULL;
3089 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3090 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3091 image_create_info.extent.width = 256;
3092 image_create_info.extent.height = 256;
3093 image_create_info.extent.depth = 1;
3094 image_create_info.mipLevels = 1;
3095 image_create_info.arrayLayers = 1;
3096 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3097 image_create_info.flags = 0;
3098
3099 VkImageBlit blit_region = {};
3100 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3101 blit_region.srcSubresource.baseArrayLayer = 0;
3102 blit_region.srcSubresource.layerCount = 1;
3103 blit_region.srcSubresource.mipLevel = 0;
3104 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3105 blit_region.dstSubresource.baseArrayLayer = 0;
3106 blit_region.dstSubresource.layerCount = 1;
3107 blit_region.dstSubresource.mipLevel = 0;
3108
3109 // Create two images, the source with sampleCount = 2, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "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 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 // Create two images, the dest with sampleCount = 4, and attempt to blit
3131 // between them
3132 {
3133 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003134 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003135 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003136 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003137 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003138 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003139 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003140 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003141 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003142 m_errorMonitor->SetDesiredFailureMsg(
3143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3144 "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 -06003145 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3146 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003147 m_errorMonitor->VerifyFound();
3148 m_commandBuffer->EndCommandBuffer();
3149 }
3150
3151 VkBufferImageCopy copy_region = {};
3152 copy_region.bufferRowLength = 128;
3153 copy_region.bufferImageHeight = 128;
3154 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3155 copy_region.imageSubresource.layerCount = 1;
3156 copy_region.imageExtent.height = 64;
3157 copy_region.imageExtent.width = 64;
3158 copy_region.imageExtent.depth = 1;
3159
3160 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3161 // buffer to image
3162 {
3163 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003164 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3165 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003168 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003169 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003170 m_errorMonitor->SetDesiredFailureMsg(
3171 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3172 "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 -06003173 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3174 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003175 m_errorMonitor->VerifyFound();
3176 m_commandBuffer->EndCommandBuffer();
3177 }
3178
3179 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3180 // image to buffer
3181 {
3182 vk_testing::Buffer dst_buffer;
3183 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3184 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003185 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003186 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003187 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003188 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003189 m_errorMonitor->SetDesiredFailureMsg(
3190 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3191 "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 -06003192 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003193 dst_buffer.handle(), 1, &copy_region);
3194 m_errorMonitor->VerifyFound();
3195 m_commandBuffer->EndCommandBuffer();
3196 }
3197}
3198
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003199TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003200 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003201
3202 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003203 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 -06003204 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003205 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 -06003206 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003207 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 -06003208
3209 VkImageBlit blitRegion = {};
3210 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3211 blitRegion.srcSubresource.baseArrayLayer = 0;
3212 blitRegion.srcSubresource.layerCount = 1;
3213 blitRegion.srcSubresource.mipLevel = 0;
3214 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3215 blitRegion.dstSubresource.baseArrayLayer = 0;
3216 blitRegion.dstSubresource.layerCount = 1;
3217 blitRegion.dstSubresource.mipLevel = 0;
3218
Dave Houlton34df4cb2016-12-01 16:43:06 -07003219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3220
3221 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3222 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223
3224 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003225 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003226 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003227 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003228
3229 m_errorMonitor->VerifyFound();
3230
Dave Houlton34df4cb2016-12-01 16:43:06 -07003231 // Test should generate 2 VU failures
3232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003234
3235 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003236 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003237 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003238
Dave Houlton34df4cb2016-12-01 16:43:06 -07003239 // TODO: Note that this only verifies that at least one of the VU enums was found
3240 // 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 -06003241 m_errorMonitor->VerifyFound();
3242
Tony Barbour552f6c02016-12-21 14:34:07 -07003243 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003244}
3245
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003246TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3247 VkResult err;
3248 bool pass;
3249
3250 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003251 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003252
3253 // If w/d/h granularity is 1, test is not meaningful
3254 // TODO: When virtual device limits are available, create a set of limits for this test that
3255 // will always have a granularity of > 1 for w, h, and d
3256 auto index = m_device->graphics_queue_node_index_;
3257 auto queue_family_properties = m_device->phy().queue_properties();
3258
3259 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3260 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3261 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3262 return;
3263 }
3264
3265 // Create two images of different types and try to copy between them
3266 VkImage srcImage;
3267 VkImage dstImage;
3268 VkDeviceMemory srcMem;
3269 VkDeviceMemory destMem;
3270 VkMemoryRequirements memReqs;
3271
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003272 VkImageCreateInfo image_create_info = {};
3273 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3274 image_create_info.pNext = NULL;
3275 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3276 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3277 image_create_info.extent.width = 32;
3278 image_create_info.extent.height = 32;
3279 image_create_info.extent.depth = 1;
3280 image_create_info.mipLevels = 1;
3281 image_create_info.arrayLayers = 4;
3282 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3283 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3284 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3285 image_create_info.flags = 0;
3286
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003287 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003288 ASSERT_VK_SUCCESS(err);
3289
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003290 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003291 ASSERT_VK_SUCCESS(err);
3292
3293 // Allocate memory
3294 VkMemoryAllocateInfo memAlloc = {};
3295 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3296 memAlloc.pNext = NULL;
3297 memAlloc.allocationSize = 0;
3298 memAlloc.memoryTypeIndex = 0;
3299
3300 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3301 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003302 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003303 ASSERT_TRUE(pass);
3304 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3305 ASSERT_VK_SUCCESS(err);
3306
3307 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3308 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003309 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003310 ASSERT_VK_SUCCESS(err);
3311 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3312 ASSERT_VK_SUCCESS(err);
3313
3314 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3315 ASSERT_VK_SUCCESS(err);
3316 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3317 ASSERT_VK_SUCCESS(err);
3318
Tony Barbour552f6c02016-12-21 14:34:07 -07003319 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003320 VkImageCopy copyRegion;
3321 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3322 copyRegion.srcSubresource.mipLevel = 0;
3323 copyRegion.srcSubresource.baseArrayLayer = 0;
3324 copyRegion.srcSubresource.layerCount = 1;
3325 copyRegion.srcOffset.x = 0;
3326 copyRegion.srcOffset.y = 0;
3327 copyRegion.srcOffset.z = 0;
3328 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3329 copyRegion.dstSubresource.mipLevel = 0;
3330 copyRegion.dstSubresource.baseArrayLayer = 0;
3331 copyRegion.dstSubresource.layerCount = 1;
3332 copyRegion.dstOffset.x = 0;
3333 copyRegion.dstOffset.y = 0;
3334 copyRegion.dstOffset.z = 0;
3335 copyRegion.extent.width = 1;
3336 copyRegion.extent.height = 1;
3337 copyRegion.extent.depth = 1;
3338
3339 // Introduce failure by setting srcOffset to a bad granularity value
3340 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3342 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003343 m_errorMonitor->VerifyFound();
3344
3345 // Introduce failure by setting extent to a bad granularity value
3346 copyRegion.srcOffset.y = 0;
3347 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3349 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003350 m_errorMonitor->VerifyFound();
3351
3352 // Now do some buffer/image copies
3353 vk_testing::Buffer buffer;
3354 VkMemoryPropertyFlags reqs = 0;
3355 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3356 VkBufferImageCopy region = {};
3357 region.bufferOffset = 0;
3358 region.bufferRowLength = 3;
3359 region.bufferImageHeight = 128;
3360 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3361 region.imageSubresource.layerCount = 1;
3362 region.imageExtent.height = 16;
3363 region.imageExtent.width = 16;
3364 region.imageExtent.depth = 1;
3365 region.imageOffset.x = 0;
3366 region.imageOffset.y = 0;
3367 region.imageOffset.z = 0;
3368
3369 // Introduce failure by setting bufferRowLength to a bad granularity value
3370 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3372 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3373 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003374 m_errorMonitor->VerifyFound();
3375 region.bufferRowLength = 128;
3376
3377 // Introduce failure by setting bufferOffset to a bad granularity value
3378 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3381 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003382 m_errorMonitor->VerifyFound();
3383 region.bufferOffset = 0;
3384
3385 // Introduce failure by setting bufferImageHeight to a bad granularity value
3386 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3389 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003390 m_errorMonitor->VerifyFound();
3391 region.bufferImageHeight = 128;
3392
3393 // Introduce failure by setting imageExtent to a bad granularity value
3394 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3396 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3397 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003398 m_errorMonitor->VerifyFound();
3399 region.imageExtent.width = 16;
3400
3401 // Introduce failure by setting imageOffset to a bad granularity value
3402 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3404 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3405 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003406 m_errorMonitor->VerifyFound();
3407
Tony Barbour552f6c02016-12-21 14:34:07 -07003408 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003409
3410 vkDestroyImage(m_device->device(), srcImage, NULL);
3411 vkDestroyImage(m_device->device(), dstImage, NULL);
3412 vkFreeMemory(m_device->device(), srcMem, NULL);
3413 vkFreeMemory(m_device->device(), destMem, NULL);
3414}
3415
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003416TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003417 TEST_DESCRIPTION(
3418 "Submit command buffer created using one queue family and "
3419 "attempt to submit them on a queue created in a different "
3420 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003421
Tony Barbour1fa09702017-03-16 12:09:08 -06003422 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003423
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003424 // This test is meaningless unless we have multiple queue families
3425 auto queue_family_properties = m_device->phy().queue_properties();
3426 if (queue_family_properties.size() < 2) {
3427 return;
3428 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430 // Get safe index of another queue family
3431 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003432 VkQueue other_queue;
3433 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3434
3435 // Record an empty cmd buffer
3436 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3437 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3438 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3439 vkEndCommandBuffer(m_commandBuffer->handle());
3440
3441 // And submit on the wrong queue
3442 VkSubmitInfo submit_info = {};
3443 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3444 submit_info.commandBufferCount = 1;
3445 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003446 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003447
3448 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003449}
3450
Chris Forbes4c24a922016-11-16 08:59:10 +13003451TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003453
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003454 // There are no attachments, but refer to attachment 0.
3455 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003456 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003457 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003458 };
3459
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003461 VkRenderPass rp;
3462
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003463 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003465 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3466 m_errorMonitor->VerifyFound();
3467}
3468
Chris Forbesa58c4522016-09-28 15:19:39 +13003469TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3470 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003471 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003472
3473 // A renderpass with two subpasses, both writing the same attachment.
3474 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003475 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3476 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3477 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003478 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003479 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003480 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3482 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003483 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003484 VkSubpassDependency dep = {0,
3485 1,
3486 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3487 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3488 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3489 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3490 VK_DEPENDENCY_BY_REGION_BIT};
3491 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003492 VkRenderPass rp;
3493 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3494 ASSERT_VK_SUCCESS(err);
3495
3496 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003497 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 +13003498 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3499
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003500 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003501 VkFramebuffer fb;
3502 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3503 ASSERT_VK_SUCCESS(err);
3504
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003505 char const *vsSource =
3506 "#version 450\n"
3507 "void main() { gl_Position = vec4(1); }\n";
3508 char const *fsSource =
3509 "#version 450\n"
3510 "layout(location=0) out vec4 color;\n"
3511 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003512
3513 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3514 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3515 VkPipelineObj pipe(m_device);
3516 pipe.AddColorAttachment();
3517 pipe.AddShader(&vs);
3518 pipe.AddShader(&fs);
3519 VkViewport view_port = {};
3520 m_viewports.push_back(view_port);
3521 pipe.SetViewport(m_viewports);
3522 VkRect2D rect = {};
3523 m_scissors.push_back(rect);
3524 pipe.SetScissor(m_scissors);
3525
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003526 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003527 VkPipelineLayout pl;
3528 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3529 ASSERT_VK_SUCCESS(err);
3530 pipe.CreateVKPipeline(pl, rp);
3531
Tony Barbour552f6c02016-12-21 14:34:07 -07003532 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003533
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003534 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3535 nullptr,
3536 rp,
3537 fb,
3538 {{
3539 0, 0,
3540 },
3541 {32, 32}},
3542 0,
3543 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003544
3545 // subtest 1: bind in the wrong subpass
3546 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3547 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003548 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 +13003549 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3550 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3551 m_errorMonitor->VerifyFound();
3552
3553 vkCmdEndRenderPass(m_commandBuffer->handle());
3554
3555 // subtest 2: bind in correct subpass, then transition to next subpass
3556 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3557 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3558 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003559 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 +13003560 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3561 m_errorMonitor->VerifyFound();
3562
3563 vkCmdEndRenderPass(m_commandBuffer->handle());
3564
Tony Barbour552f6c02016-12-21 14:34:07 -07003565 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003566
3567 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3568 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3569 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3570}
3571
Tony Barbour4e919972016-08-09 13:27:40 -06003572TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3575 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003576 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3578
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3580 "Cannot execute a render pass with renderArea "
3581 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003582
3583 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3584 m_renderPassBeginInfo.renderArea.extent.width = 257;
3585 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003586 m_commandBuffer->BeginCommandBuffer();
3587 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003588 m_errorMonitor->VerifyFound();
3589}
3590
3591TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003592 TEST_DESCRIPTION(
3593 "Generate INDEPENDENT_BLEND by disabling independent "
3594 "blend and then specifying different blend states for two "
3595 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003596 VkPhysicalDeviceFeatures features = {};
3597 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003598 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003599
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3601 "Invalid Pipeline CreateInfo: If independent blend feature not "
3602 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003603
Cody Northropc31a84f2016-08-22 10:41:47 -06003604 VkDescriptorSetObj descriptorSet(m_device);
3605 descriptorSet.AppendDummy();
3606 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003607
Cody Northropc31a84f2016-08-22 10:41:47 -06003608 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003609 // Create a renderPass with two color attachments
3610 VkAttachmentReference attachments[2] = {};
3611 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003612 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003613 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3614
3615 VkSubpassDescription subpass = {};
3616 subpass.pColorAttachments = attachments;
3617 subpass.colorAttachmentCount = 2;
3618
3619 VkRenderPassCreateInfo rpci = {};
3620 rpci.subpassCount = 1;
3621 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003622 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003623
Tony Barbourffd60bd2017-03-09 12:04:55 -07003624 VkAttachmentDescription attach_desc[2] = {};
3625 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3626 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3627 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3628 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3629 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3630 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3631 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3632 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003633
Tony Barbourffd60bd2017-03-09 12:04:55 -07003634 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003635 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3636
3637 VkRenderPass renderpass;
3638 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003639 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003640 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003641
Cody Northropc31a84f2016-08-22 10:41:47 -06003642 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3643 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3644 att_state1.blendEnable = VK_TRUE;
3645 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3646 att_state2.blendEnable = VK_FALSE;
3647 pipeline.AddColorAttachment(0, &att_state1);
3648 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003649 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003650 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003651 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003652}
3653
Mike Weiblen40b160e2017-02-06 19:21:52 -07003654// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3655TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3656 TEST_DESCRIPTION(
3657 "Create a graphics pipeline that is incompatible with the requirements "
3658 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003659 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003660
3661 VkDescriptorSetObj ds_obj(m_device);
3662 ds_obj.AppendDummy();
3663 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3664
3665 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3666
3667 VkPipelineColorBlendAttachmentState att_state1 = {};
3668 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3669 att_state1.blendEnable = VK_TRUE;
3670
3671 VkRenderpassObj rp_obj(m_device);
3672
3673 {
3674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3675 VkPipelineObj pipeline(m_device);
3676 pipeline.AddShader(&vs_obj);
3677 pipeline.AddColorAttachment(0, &att_state1);
3678
3679 VkGraphicsPipelineCreateInfo info = {};
3680 pipeline.InitGraphicsPipelineCreateInfo(&info);
3681 info.pColorBlendState = nullptr;
3682
3683 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3684 m_errorMonitor->VerifyFound();
3685 }
3686}
3687
Chris Forbes26ec2122016-11-29 08:58:33 +13003688#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003689TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3690 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3691 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003692 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003693
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3695 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003696
3697 // Create a renderPass with a single color attachment
3698 VkAttachmentReference attach = {};
3699 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3700 VkSubpassDescription subpass = {};
3701 VkRenderPassCreateInfo rpci = {};
3702 rpci.subpassCount = 1;
3703 rpci.pSubpasses = &subpass;
3704 rpci.attachmentCount = 1;
3705 VkAttachmentDescription attach_desc = {};
3706 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3707 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3708 rpci.pAttachments = &attach_desc;
3709 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3710 VkRenderPass rp;
3711 subpass.pDepthStencilAttachment = &attach;
3712 subpass.pColorAttachments = NULL;
3713 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3714 m_errorMonitor->VerifyFound();
3715}
Chris Forbes26ec2122016-11-29 08:58:33 +13003716#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003717
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003718TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003719 TEST_DESCRIPTION(
3720 "Create a framebuffer where a subpass has a preserve "
3721 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003722
Tony Barbour1fa09702017-03-16 12:09:08 -06003723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3725
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003726 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003727
3728 VkAttachmentReference color_attach = {};
3729 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3730 color_attach.attachment = 0;
3731 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3732 VkSubpassDescription subpass = {};
3733 subpass.colorAttachmentCount = 1;
3734 subpass.pColorAttachments = &color_attach;
3735 subpass.preserveAttachmentCount = 1;
3736 subpass.pPreserveAttachments = &preserve_attachment;
3737
3738 VkRenderPassCreateInfo rpci = {};
3739 rpci.subpassCount = 1;
3740 rpci.pSubpasses = &subpass;
3741 rpci.attachmentCount = 1;
3742 VkAttachmentDescription attach_desc = {};
3743 attach_desc.format = VK_FORMAT_UNDEFINED;
3744 rpci.pAttachments = &attach_desc;
3745 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3746 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003747 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003748
3749 m_errorMonitor->VerifyFound();
3750
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003751 if (result == VK_SUCCESS) {
3752 vkDestroyRenderPass(m_device->device(), rp, NULL);
3753 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003754}
3755
Chris Forbesc5389742016-06-29 11:49:23 +12003756TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003757 TEST_DESCRIPTION(
3758 "Ensure that CreateRenderPass produces a validation error "
3759 "when the source of a subpass multisample resolve "
3760 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003761
Tony Barbour1fa09702017-03-16 12:09:08 -06003762 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003763
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3765 "Subpass 0 requests multisample resolve from attachment 0 which has "
3766 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003767
3768 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003769 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3770 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3771 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3772 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3773 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3774 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003775 };
3776
3777 VkAttachmentReference color = {
3778 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3779 };
3780
3781 VkAttachmentReference resolve = {
3782 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3783 };
3784
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003785 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003788
3789 VkRenderPass rp;
3790 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3791
3792 m_errorMonitor->VerifyFound();
3793
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003794 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003795}
3796
3797TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003798 TEST_DESCRIPTION(
3799 "Ensure CreateRenderPass produces a validation error "
3800 "when a subpass multisample resolve operation is "
3801 "requested, and the destination of that resolve has "
3802 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003803
Tony Barbour1fa09702017-03-16 12:09:08 -06003804 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003805
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3807 "Subpass 0 requests multisample resolve into attachment 1, which "
3808 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003809
3810 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003811 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3812 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3813 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3814 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3815 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3816 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003817 };
3818
3819 VkAttachmentReference color = {
3820 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3821 };
3822
3823 VkAttachmentReference resolve = {
3824 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3825 };
3826
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003827 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003828
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003829 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003830
3831 VkRenderPass rp;
3832 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3833
3834 m_errorMonitor->VerifyFound();
3835
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003836 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003837}
3838
Chris Forbes3f128ef2016-06-29 14:58:53 +12003839TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003840 TEST_DESCRIPTION(
3841 "Ensure CreateRenderPass produces a validation error "
3842 "when the color and depth attachments used by a subpass "
3843 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003844
Tony Barbour1fa09702017-03-16 12:09:08 -06003845 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003846
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3848 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003849
3850 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3852 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3853 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3854 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3855 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3856 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003857 };
3858
3859 VkAttachmentReference color[] = {
3860 {
3861 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3862 },
3863 {
3864 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3865 },
3866 };
3867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003868 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003869
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003870 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003871
3872 VkRenderPass rp;
3873 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3874
3875 m_errorMonitor->VerifyFound();
3876
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003877 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003878}
3879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003881 TEST_DESCRIPTION(
3882 "Hit errors when attempting to create a framebuffer :\n"
3883 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3884 " 2. Use a color image as depthStencil attachment\n"
3885 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3886 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3887 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3888 " 6. Framebuffer attachment where dimensions don't match\n"
Cort Stratton8133ec22017-04-27 16:25:03 +02003889 " 7. Framebuffer attachment where dimensions don't match\n"
3890 " 8. Framebuffer attachment w/o identity swizzle\n"
3891 " 9. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892
Tony Barbour1fa09702017-03-16 12:09:08 -06003893 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003894 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3895
Cort Stratton8133ec22017-04-27 16:25:03 +02003896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00404);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003897
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003898 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003899 VkAttachmentReference attach = {};
3900 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3901 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003902 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003903 VkRenderPassCreateInfo rpci = {};
3904 rpci.subpassCount = 1;
3905 rpci.pSubpasses = &subpass;
3906 rpci.attachmentCount = 1;
3907 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003908 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003909 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003910 rpci.pAttachments = &attach_desc;
3911 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3912 VkRenderPass rp;
3913 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3914 ASSERT_VK_SUCCESS(err);
3915
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003916 VkImageView ivs[2];
3917 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3918 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003919 VkFramebufferCreateInfo fb_info = {};
3920 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3921 fb_info.pNext = NULL;
3922 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003923 // Set mis-matching attachmentCount
3924 fb_info.attachmentCount = 2;
3925 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003926 fb_info.width = 100;
3927 fb_info.height = 100;
3928 fb_info.layers = 1;
3929
3930 VkFramebuffer fb;
3931 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3932
3933 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003934 if (err == VK_SUCCESS) {
3935 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3936 }
3937 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003938
3939 // Create a renderPass with a depth-stencil attachment created with
3940 // IMAGE_USAGE_COLOR_ATTACHMENT
3941 // Add our color attachment to pDepthStencilAttachment
3942 subpass.pDepthStencilAttachment = &attach;
3943 subpass.pColorAttachments = NULL;
3944 VkRenderPass rp_ds;
3945 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3946 ASSERT_VK_SUCCESS(err);
3947 // Set correct attachment count, but attachment has COLOR usage bit set
3948 fb_info.attachmentCount = 1;
3949 fb_info.renderPass = rp_ds;
3950
Cort Stratton8133ec22017-04-27 16:25:03 +02003951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00406);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003952 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3953
3954 m_errorMonitor->VerifyFound();
3955 if (err == VK_SUCCESS) {
3956 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3957 }
3958 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003959
3960 // Create new renderpass with alternate attachment format from fb
3961 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3962 subpass.pDepthStencilAttachment = NULL;
3963 subpass.pColorAttachments = &attach;
3964 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3965 ASSERT_VK_SUCCESS(err);
3966
3967 // Cause error due to mis-matched formats between rp & fb
3968 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3969 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00408);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003971 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3972
3973 m_errorMonitor->VerifyFound();
3974 if (err == VK_SUCCESS) {
3975 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3976 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003977 vkDestroyRenderPass(m_device->device(), rp, NULL);
3978
3979 // Create new renderpass with alternate sample count from fb
3980 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3981 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3982 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3983 ASSERT_VK_SUCCESS(err);
3984
3985 // Cause error due to mis-matched sample count between rp & fb
3986 fb_info.renderPass = rp;
Cort Stratton8133ec22017-04-27 16:25:03 +02003987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00409);
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003988 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3989
3990 m_errorMonitor->VerifyFound();
3991 if (err == VK_SUCCESS) {
3992 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3993 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003994
3995 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003996
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003997 {
3998 // Create an image with 2 mip levels.
3999 VkImageObj image(m_device);
4000 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4001 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004002
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004003 // Create a image view with two mip levels.
4004 VkImageView view;
4005 VkImageViewCreateInfo ivci = {};
4006 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4007 ivci.image = image.handle();
4008 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4009 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4010 ivci.subresourceRange.layerCount = 1;
4011 ivci.subresourceRange.baseMipLevel = 0;
4012 // Set level count to 2 (only 1 is allowed for FB attachment)
4013 ivci.subresourceRange.levelCount = 2;
4014 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4015 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4016 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004017
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004018 // Re-create renderpass to have matching sample count
4019 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4020 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4021 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004022
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004023 fb_info.renderPass = rp;
4024 fb_info.pAttachments = &view;
Cort Stratton8133ec22017-04-27 16:25:03 +02004025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00411);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004026 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4027
4028 m_errorMonitor->VerifyFound();
4029 if (err == VK_SUCCESS) {
4030 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4031 }
4032 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004033 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004034
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004035 // Update view to original color buffer and grow FB dimensions too big
4036 fb_info.pAttachments = ivs;
4037 fb_info.height = 1024;
4038 fb_info.width = 1024;
4039 fb_info.layers = 2;
Cort Stratton8133ec22017-04-27 16:25:03 +02004040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004041 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4042
4043 m_errorMonitor->VerifyFound();
4044 if (err == VK_SUCCESS) {
4045 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4046 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004047
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004048 {
4049 // Create an image with one mip level.
4050 VkImageObj image(m_device);
4051 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4052 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004053
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004054 // Create view attachment with non-identity swizzle
4055 VkImageView view;
4056 VkImageViewCreateInfo ivci = {};
4057 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4058 ivci.image = image.handle();
4059 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4060 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4061 ivci.subresourceRange.layerCount = 1;
4062 ivci.subresourceRange.baseMipLevel = 0;
4063 ivci.subresourceRange.levelCount = 1;
4064 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4065 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4066 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4067 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4068 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4069 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4070 ASSERT_VK_SUCCESS(err);
4071
4072 fb_info.pAttachments = &view;
4073 fb_info.height = 100;
4074 fb_info.width = 100;
4075 fb_info.layers = 1;
4076
Cort Stratton8133ec22017-04-27 16:25:03 +02004077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00412);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004078 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4079
4080 m_errorMonitor->VerifyFound();
4081 if (err == VK_SUCCESS) {
4082 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4083 }
4084 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004085 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004086
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004087 // reset attachment to color attachment
4088 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004089
4090 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004091 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004092 fb_info.height = 100;
4093 fb_info.layers = 1;
4094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Cort Stratton8133ec22017-04-27 16:25:03 +02004095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004096 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004097 m_errorMonitor->VerifyFound();
4098 if (err == VK_SUCCESS) {
4099 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4100 }
4101 // and width=0
4102 fb_info.width = 0;
4103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02806);
4104 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004105 m_errorMonitor->VerifyFound();
4106 if (err == VK_SUCCESS) {
4107 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4108 }
4109
4110 // Request fb that exceeds max height
4111 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004112 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004113 fb_info.layers = 1;
4114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Cort Stratton8133ec22017-04-27 16:25:03 +02004115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004116 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004117 m_errorMonitor->VerifyFound();
4118 if (err == VK_SUCCESS) {
4119 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4120 }
4121 // and height=0
4122 fb_info.height = 0;
4123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02807);
4124 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004125 m_errorMonitor->VerifyFound();
4126 if (err == VK_SUCCESS) {
4127 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4128 }
4129
4130 // Request fb that exceeds max layers
4131 fb_info.width = 100;
4132 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004133 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Cort Stratton8133ec22017-04-27 16:25:03 +02004135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00410);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004136 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Cort Stratton8133ec22017-04-27 16:25:03 +02004137 m_errorMonitor->VerifyFound();
4138 if (err == VK_SUCCESS) {
4139 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4140 }
4141 // and layers=0
4142 fb_info.layers = 0;
4143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02808);
4144 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004145 m_errorMonitor->VerifyFound();
4146 if (err == VK_SUCCESS) {
4147 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4148 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004149
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004150 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004151}
4152
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004153TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004154 TEST_DESCRIPTION(
4155 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4156 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004157
Tony Barbour1fa09702017-03-16 12:09:08 -06004158 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4161 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004162 m_errorMonitor->VerifyFound();
4163}
4164
4165TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004166 TEST_DESCRIPTION(
4167 "Run a simple draw calls to validate failure when Line Width dynamic "
4168 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004169
Tony Barbour1fa09702017-03-16 12:09:08 -06004170 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004171 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4173 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004174 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004175}
4176
4177TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004178 TEST_DESCRIPTION(
4179 "Run a simple draw calls to validate failure when Viewport dynamic "
4180 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004181
Tony Barbour1fa09702017-03-16 12:09:08 -06004182 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004183 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4185 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004186 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004187 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004188}
4189
4190TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004191 TEST_DESCRIPTION(
4192 "Run a simple draw calls to validate failure when Scissor dynamic "
4193 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004194
Tony Barbour1fa09702017-03-16 12:09:08 -06004195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004196 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4198 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004199 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004200 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004201}
4202
Cortd713fe82016-07-27 09:51:27 -07004203TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004204 TEST_DESCRIPTION(
4205 "Run a simple draw calls to validate failure when Blend Constants "
4206 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004207
Tony Barbour1fa09702017-03-16 12:09:08 -06004208 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004209 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4211 "Dynamic blend constants state not set for this command buffer");
4212 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004213 m_errorMonitor->VerifyFound();
4214}
4215
4216TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004217 TEST_DESCRIPTION(
4218 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4219 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004220
Tony Barbour1fa09702017-03-16 12:09:08 -06004221 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004222 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004223 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004224 return;
4225 }
4226 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4228 "Dynamic depth bounds state not set for this command buffer");
4229 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004230 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004231}
4232
4233TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004234 TEST_DESCRIPTION(
4235 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4236 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004237
Tony Barbour1fa09702017-03-16 12:09:08 -06004238 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004239 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4241 "Dynamic stencil read mask state not set for this command buffer");
4242 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004243 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004244}
4245
4246TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004247 TEST_DESCRIPTION(
4248 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4249 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004250
Tony Barbour1fa09702017-03-16 12:09:08 -06004251 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004252 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4254 "Dynamic stencil write mask state not set for this command buffer");
4255 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004256 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004257}
4258
4259TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004260 TEST_DESCRIPTION(
4261 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4262 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004263
Tony Barbour1fa09702017-03-16 12:09:08 -06004264 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004265 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4267 "Dynamic stencil reference state not set for this command buffer");
4268 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004269 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004270}
4271
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004272TEST_F(VkLayerTest, IndexBufferNotBound) {
4273 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004274
Tony Barbour1fa09702017-03-16 12:09:08 -06004275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4277 "Index buffer object not bound to this command buffer when Indexed ");
4278 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004279 m_errorMonitor->VerifyFound();
4280}
4281
Karl Schultz6addd812016-02-02 17:17:23 -07004282TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4284 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4285 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004286
Tony Barbour1fa09702017-03-16 12:09:08 -06004287 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004288 ASSERT_NO_FATAL_FAILURE(InitViewport());
4289 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4290
Karl Schultz6addd812016-02-02 17:17:23 -07004291 // We luck out b/c by default the framework creates CB w/ the
4292 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004293 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004294 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004295 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004296
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004297 // Bypass framework since it does the waits automatically
4298 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004299 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004300 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4301 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004302 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004303 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004304 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004305 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004306 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004307 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004308 submit_info.pSignalSemaphores = NULL;
4309
Chris Forbes40028e22016-06-13 09:59:34 +12004310 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004311 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004312 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004313
Karl Schultz6addd812016-02-02 17:17:23 -07004314 // Cause validation error by re-submitting cmd buffer that should only be
4315 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004316 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004317 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004318
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004319 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004320}
4321
Karl Schultz6addd812016-02-02 17:17:23 -07004322TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004323 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004324 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004325
Tony Barbour1fa09702017-03-16 12:09:08 -06004326 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004328
Karl Schultz6addd812016-02-02 17:17:23 -07004329 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4330 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004331 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004332 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004333 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004334
4335 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004336 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4337 ds_pool_ci.pNext = NULL;
4338 ds_pool_ci.flags = 0;
4339 ds_pool_ci.maxSets = 1;
4340 ds_pool_ci.poolSizeCount = 1;
4341 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
4343 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004344 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345 ASSERT_VK_SUCCESS(err);
4346
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004347 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4348 dsl_binding_samp.binding = 0;
4349 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4350 dsl_binding_samp.descriptorCount = 1;
4351 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4352 dsl_binding_samp.pImmutableSamplers = NULL;
4353
4354 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4355 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4356 ds_layout_ci.pNext = NULL;
4357 ds_layout_ci.bindingCount = 1;
4358 ds_layout_ci.pBindings = &dsl_binding_samp;
4359
4360 VkDescriptorSetLayout ds_layout_samp;
4361 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4362 ASSERT_VK_SUCCESS(err);
4363
4364 // Try to allocate 2 sets when pool only has 1 set
4365 VkDescriptorSet descriptor_sets[2];
4366 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4367 VkDescriptorSetAllocateInfo alloc_info = {};
4368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4369 alloc_info.descriptorSetCount = 2;
4370 alloc_info.descriptorPool = ds_pool;
4371 alloc_info.pSetLayouts = set_layouts;
4372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4373 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4374 m_errorMonitor->VerifyFound();
4375
4376 alloc_info.descriptorSetCount = 1;
4377 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004378 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004379 dsl_binding.binding = 0;
4380 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4381 dsl_binding.descriptorCount = 1;
4382 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4383 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004384
Karl Schultz6addd812016-02-02 17:17:23 -07004385 ds_layout_ci.bindingCount = 1;
4386 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004387
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004388 VkDescriptorSetLayout ds_layout_ub;
4389 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004390 ASSERT_VK_SUCCESS(err);
4391
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004392 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004393 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004394 alloc_info.pSetLayouts = &ds_layout_ub;
4395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4396 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004397
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004398 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004399
Karl Schultz2825ab92016-12-02 08:23:14 -07004400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004401 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004402 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004403}
4404
Karl Schultz6addd812016-02-02 17:17:23 -07004405TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4406 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004407
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004409
Tony Barbour1fa09702017-03-16 12:09:08 -06004410 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004412
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004413 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004414 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4415 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004416
4417 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004418 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4419 ds_pool_ci.pNext = NULL;
4420 ds_pool_ci.maxSets = 1;
4421 ds_pool_ci.poolSizeCount = 1;
4422 ds_pool_ci.flags = 0;
4423 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4424 // app can only call vkResetDescriptorPool on this pool.;
4425 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004426
4427 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004428 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004429 ASSERT_VK_SUCCESS(err);
4430
4431 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004432 dsl_binding.binding = 0;
4433 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4434 dsl_binding.descriptorCount = 1;
4435 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4436 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004437
4438 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004439 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4440 ds_layout_ci.pNext = NULL;
4441 ds_layout_ci.bindingCount = 1;
4442 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004443
4444 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004445 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004446 ASSERT_VK_SUCCESS(err);
4447
4448 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004449 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004450 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004451 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004452 alloc_info.descriptorPool = ds_pool;
4453 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004454 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004455 ASSERT_VK_SUCCESS(err);
4456
4457 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004458 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004459
Chia-I Wuf7458c52015-10-26 21:10:41 +08004460 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4461 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004462}
4463
Karl Schultz6addd812016-02-02 17:17:23 -07004464TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004465 // Attempt to clear Descriptor Pool with bad object.
4466 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004467
Tony Barbour1fa09702017-03-16 12:09:08 -06004468 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004469 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004470 uint64_t fake_pool_handle = 0xbaad6001;
4471 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4472 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004473 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004474}
4475
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004476TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4478 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004480 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004481
4482 uint64_t fake_set_handle = 0xbaad6001;
4483 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004484 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004486
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488
4489 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4490 layout_bindings[0].binding = 0;
4491 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4492 layout_bindings[0].descriptorCount = 1;
4493 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4494 layout_bindings[0].pImmutableSamplers = NULL;
4495
4496 VkDescriptorSetLayout descriptor_set_layout;
4497 VkDescriptorSetLayoutCreateInfo dslci = {};
4498 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4499 dslci.pNext = NULL;
4500 dslci.bindingCount = 1;
4501 dslci.pBindings = layout_bindings;
4502 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004503 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004504
4505 VkPipelineLayout pipeline_layout;
4506 VkPipelineLayoutCreateInfo plci = {};
4507 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4508 plci.pNext = NULL;
4509 plci.setLayoutCount = 1;
4510 plci.pSetLayouts = &descriptor_set_layout;
4511 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004512 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004513
Tony Barbour552f6c02016-12-21 14:34:07 -07004514 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004515 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4516 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004517 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004518 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004519 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4520 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004521}
4522
Karl Schultz6addd812016-02-02 17:17:23 -07004523TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004524 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4525 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004526 uint64_t fake_layout_handle = 0xbaad6001;
4527 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004529 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004530 VkPipelineLayout pipeline_layout;
4531 VkPipelineLayoutCreateInfo plci = {};
4532 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4533 plci.pNext = NULL;
4534 plci.setLayoutCount = 1;
4535 plci.pSetLayouts = &bad_layout;
4536 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4537
4538 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004539}
4540
Mark Muellerd4914412016-06-13 17:52:06 -06004541TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004542 TEST_DESCRIPTION(
4543 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4544 "1) A uniform buffer update must have a valid buffer index."
4545 "2) When using an array of descriptors in a single WriteDescriptor,"
4546 " the descriptor types and stageflags must all be the same."
4547 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004548
Mike Weiblena6666382017-01-05 15:16:11 -07004549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004550
Tony Barbour1fa09702017-03-16 12:09:08 -06004551 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004552 VkDescriptorPoolSize ds_type_count[4] = {};
4553 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4554 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004555 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004556 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004557 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004558 ds_type_count[2].descriptorCount = 1;
4559 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4560 ds_type_count[3].descriptorCount = 1;
4561
4562 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4563 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4564 ds_pool_ci.maxSets = 1;
4565 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4566 ds_pool_ci.pPoolSizes = ds_type_count;
4567
4568 VkDescriptorPool ds_pool;
4569 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4570 ASSERT_VK_SUCCESS(err);
4571
Mark Muellerb9896722016-06-16 09:54:29 -06004572 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004573 layout_binding[0].binding = 0;
4574 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4575 layout_binding[0].descriptorCount = 1;
4576 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4577 layout_binding[0].pImmutableSamplers = NULL;
4578
4579 layout_binding[1].binding = 1;
4580 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4581 layout_binding[1].descriptorCount = 1;
4582 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4583 layout_binding[1].pImmutableSamplers = NULL;
4584
4585 VkSamplerCreateInfo sampler_ci = {};
4586 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4587 sampler_ci.pNext = NULL;
4588 sampler_ci.magFilter = VK_FILTER_NEAREST;
4589 sampler_ci.minFilter = VK_FILTER_NEAREST;
4590 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4591 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4592 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4593 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4594 sampler_ci.mipLodBias = 1.0;
4595 sampler_ci.anisotropyEnable = VK_FALSE;
4596 sampler_ci.maxAnisotropy = 1;
4597 sampler_ci.compareEnable = VK_FALSE;
4598 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4599 sampler_ci.minLod = 1.0;
4600 sampler_ci.maxLod = 1.0;
4601 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4602 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4603 VkSampler sampler;
4604
4605 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4606 ASSERT_VK_SUCCESS(err);
4607
4608 layout_binding[2].binding = 2;
4609 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4610 layout_binding[2].descriptorCount = 1;
4611 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4612 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4613
Mark Muellerd4914412016-06-13 17:52:06 -06004614 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4615 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4616 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4617 ds_layout_ci.pBindings = layout_binding;
4618 VkDescriptorSetLayout ds_layout;
4619 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4620 ASSERT_VK_SUCCESS(err);
4621
4622 VkDescriptorSetAllocateInfo alloc_info = {};
4623 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4624 alloc_info.descriptorSetCount = 1;
4625 alloc_info.descriptorPool = ds_pool;
4626 alloc_info.pSetLayouts = &ds_layout;
4627 VkDescriptorSet descriptorSet;
4628 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4629 ASSERT_VK_SUCCESS(err);
4630
4631 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4632 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4633 pipeline_layout_ci.pNext = NULL;
4634 pipeline_layout_ci.setLayoutCount = 1;
4635 pipeline_layout_ci.pSetLayouts = &ds_layout;
4636
4637 VkPipelineLayout pipeline_layout;
4638 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4639 ASSERT_VK_SUCCESS(err);
4640
Mark Mueller5c838ce2016-06-16 09:54:29 -06004641 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004642 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4643 descriptor_write.dstSet = descriptorSet;
4644 descriptor_write.dstBinding = 0;
4645 descriptor_write.descriptorCount = 1;
4646 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4647
Mark Mueller5c838ce2016-06-16 09:54:29 -06004648 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
4652 // Create a buffer to update the descriptor with
4653 uint32_t qfi = 0;
4654 VkBufferCreateInfo buffCI = {};
4655 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4656 buffCI.size = 1024;
4657 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4658 buffCI.queueFamilyIndexCount = 1;
4659 buffCI.pQueueFamilyIndices = &qfi;
4660
4661 VkBuffer dyub;
4662 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4663 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004664
Tony Barboure132c5f2016-12-12 11:50:20 -07004665 VkDeviceMemory mem;
4666 VkMemoryRequirements mem_reqs;
4667 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4668
4669 VkMemoryAllocateInfo mem_alloc_info = {};
4670 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4671 mem_alloc_info.allocationSize = mem_reqs.size;
4672 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4673 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4674 ASSERT_VK_SUCCESS(err);
4675
4676 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4677 ASSERT_VK_SUCCESS(err);
4678
4679 VkDescriptorBufferInfo buffInfo[2] = {};
4680 buffInfo[0].buffer = dyub;
4681 buffInfo[0].offset = 0;
4682 buffInfo[0].range = 1024;
4683 buffInfo[1].buffer = dyub;
4684 buffInfo[1].offset = 0;
4685 buffInfo[1].range = 1024;
4686 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004687 descriptor_write.descriptorCount = 2;
4688
Mark Mueller5c838ce2016-06-16 09:54:29 -06004689 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4692 m_errorMonitor->VerifyFound();
4693
Mark Mueller5c838ce2016-06-16 09:54:29 -06004694 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4695 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004696 descriptor_write.dstBinding = 1;
4697 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004698
Mark Mueller5c838ce2016-06-16 09:54:29 -06004699 // Make pImageInfo index non-null to avoid complaints of it missing
4700 VkDescriptorImageInfo imageInfo = {};
4701 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4702 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004704 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4705 m_errorMonitor->VerifyFound();
4706
Mark Muellerd4914412016-06-13 17:52:06 -06004707 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004708 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004709 vkDestroySampler(m_device->device(), sampler, NULL);
4710 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4713}
4714
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004715TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004716 TEST_DESCRIPTION(
4717 "Attempt to draw with a command buffer that is invalid "
4718 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004719 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004720
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004721 VkBuffer buffer;
4722 VkDeviceMemory mem;
4723 VkMemoryRequirements mem_reqs;
4724
4725 VkBufferCreateInfo buf_info = {};
4726 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004727 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004728 buf_info.size = 256;
4729 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4730 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4731 ASSERT_VK_SUCCESS(err);
4732
4733 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4734
4735 VkMemoryAllocateInfo alloc_info = {};
4736 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4737 alloc_info.allocationSize = 256;
4738 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004739 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 -06004740 if (!pass) {
4741 vkDestroyBuffer(m_device->device(), buffer, NULL);
4742 return;
4743 }
4744 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4748 ASSERT_VK_SUCCESS(err);
4749
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004750 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004751 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004752 m_commandBuffer->EndCommandBuffer();
4753
Mark Lobodzinski33826372017-04-13 11:10:11 -06004754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004755 // Destroy buffer dependency prior to submit to cause ERROR
4756 vkDestroyBuffer(m_device->device(), buffer, NULL);
4757
4758 VkSubmitInfo submit_info = {};
4759 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4760 submit_info.commandBufferCount = 1;
4761 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4762 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4763
4764 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004765 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004766 vkFreeMemory(m_device->handle(), mem, NULL);
4767}
4768
Tobin Ehlisea413442016-09-28 10:23:59 -06004769TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4770 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4771
Tony Barbour1fa09702017-03-16 12:09:08 -06004772 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4774
4775 VkDescriptorPoolSize ds_type_count;
4776 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4777 ds_type_count.descriptorCount = 1;
4778
4779 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4780 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4781 ds_pool_ci.maxSets = 1;
4782 ds_pool_ci.poolSizeCount = 1;
4783 ds_pool_ci.pPoolSizes = &ds_type_count;
4784
4785 VkDescriptorPool ds_pool;
4786 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4787 ASSERT_VK_SUCCESS(err);
4788
4789 VkDescriptorSetLayoutBinding layout_binding;
4790 layout_binding.binding = 0;
4791 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4792 layout_binding.descriptorCount = 1;
4793 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4794 layout_binding.pImmutableSamplers = NULL;
4795
4796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4797 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4798 ds_layout_ci.bindingCount = 1;
4799 ds_layout_ci.pBindings = &layout_binding;
4800 VkDescriptorSetLayout ds_layout;
4801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4802 ASSERT_VK_SUCCESS(err);
4803
4804 VkDescriptorSetAllocateInfo alloc_info = {};
4805 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4806 alloc_info.descriptorSetCount = 1;
4807 alloc_info.descriptorPool = ds_pool;
4808 alloc_info.pSetLayouts = &ds_layout;
4809 VkDescriptorSet descriptor_set;
4810 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4811 ASSERT_VK_SUCCESS(err);
4812
4813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4814 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4815 pipeline_layout_ci.pNext = NULL;
4816 pipeline_layout_ci.setLayoutCount = 1;
4817 pipeline_layout_ci.pSetLayouts = &ds_layout;
4818
4819 VkPipelineLayout pipeline_layout;
4820 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4821 ASSERT_VK_SUCCESS(err);
4822
4823 VkBuffer buffer;
4824 uint32_t queue_family_index = 0;
4825 VkBufferCreateInfo buffer_create_info = {};
4826 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4827 buffer_create_info.size = 1024;
4828 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4829 buffer_create_info.queueFamilyIndexCount = 1;
4830 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4831
4832 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4833 ASSERT_VK_SUCCESS(err);
4834
4835 VkMemoryRequirements memory_reqs;
4836 VkDeviceMemory buffer_memory;
4837
4838 VkMemoryAllocateInfo memory_info = {};
4839 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4840 memory_info.allocationSize = 0;
4841 memory_info.memoryTypeIndex = 0;
4842
4843 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4844 memory_info.allocationSize = memory_reqs.size;
4845 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4846 ASSERT_TRUE(pass);
4847
4848 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4849 ASSERT_VK_SUCCESS(err);
4850 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4851 ASSERT_VK_SUCCESS(err);
4852
4853 VkBufferView view;
4854 VkBufferViewCreateInfo bvci = {};
4855 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4856 bvci.buffer = buffer;
4857 bvci.format = VK_FORMAT_R8_UNORM;
4858 bvci.range = VK_WHOLE_SIZE;
4859
4860 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4861 ASSERT_VK_SUCCESS(err);
4862
4863 VkWriteDescriptorSet descriptor_write = {};
4864 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4865 descriptor_write.dstSet = descriptor_set;
4866 descriptor_write.dstBinding = 0;
4867 descriptor_write.descriptorCount = 1;
4868 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4869 descriptor_write.pTexelBufferView = &view;
4870
4871 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4872
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004873 char const *vsSource =
4874 "#version 450\n"
4875 "\n"
4876 "out gl_PerVertex { \n"
4877 " vec4 gl_Position;\n"
4878 "};\n"
4879 "void main(){\n"
4880 " gl_Position = vec4(1);\n"
4881 "}\n";
4882 char const *fsSource =
4883 "#version 450\n"
4884 "\n"
4885 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4886 "layout(location=0) out vec4 x;\n"
4887 "void main(){\n"
4888 " x = imageLoad(s, 0);\n"
4889 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004890 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4891 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4892 VkPipelineObj pipe(m_device);
4893 pipe.AddShader(&vs);
4894 pipe.AddShader(&fs);
4895 pipe.AddColorAttachment();
4896 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4897
Mark Lobodzinski33826372017-04-13 11:10:11 -06004898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound BufferView ");
Tobin Ehlisea413442016-09-28 10:23:59 -06004899
Tony Barbour552f6c02016-12-21 14:34:07 -07004900 m_commandBuffer->BeginCommandBuffer();
4901 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4902
Tobin Ehlisea413442016-09-28 10:23:59 -06004903 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4904 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4905 VkRect2D scissor = {{0, 0}, {16, 16}};
4906 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4907 // Bind pipeline to cmd buffer
4908 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4909 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4910 &descriptor_set, 0, nullptr);
4911 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004912 m_commandBuffer->EndRenderPass();
4913 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004914
4915 // Delete BufferView in order to invalidate cmd buffer
4916 vkDestroyBufferView(m_device->device(), view, NULL);
4917 // Now attempt submit of cmd buffer
4918 VkSubmitInfo submit_info = {};
4919 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4920 submit_info.commandBufferCount = 1;
4921 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4922 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4923 m_errorMonitor->VerifyFound();
4924
4925 // Clean-up
4926 vkDestroyBuffer(m_device->device(), buffer, NULL);
4927 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4928 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4929 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4930 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4931}
4932
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004933TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004934 TEST_DESCRIPTION(
4935 "Attempt to draw with a command buffer that is invalid "
4936 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004937 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004938
4939 VkImage image;
4940 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4941 VkImageCreateInfo image_create_info = {};
4942 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4943 image_create_info.pNext = NULL;
4944 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4945 image_create_info.format = tex_format;
4946 image_create_info.extent.width = 32;
4947 image_create_info.extent.height = 32;
4948 image_create_info.extent.depth = 1;
4949 image_create_info.mipLevels = 1;
4950 image_create_info.arrayLayers = 1;
4951 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4952 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004953 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004954 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004955 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004956 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004957 // Have to bind memory to image before recording cmd in cmd buffer using it
4958 VkMemoryRequirements mem_reqs;
4959 VkDeviceMemory image_mem;
4960 bool pass;
4961 VkMemoryAllocateInfo mem_alloc = {};
4962 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4963 mem_alloc.pNext = NULL;
4964 mem_alloc.memoryTypeIndex = 0;
4965 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4966 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004967 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004968 ASSERT_TRUE(pass);
4969 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4970 ASSERT_VK_SUCCESS(err);
4971 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4972 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004973
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004974 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004975 VkClearColorValue ccv;
4976 ccv.float32[0] = 1.0f;
4977 ccv.float32[1] = 1.0f;
4978 ccv.float32[2] = 1.0f;
4979 ccv.float32[3] = 1.0f;
4980 VkImageSubresourceRange isr = {};
4981 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004982 isr.baseArrayLayer = 0;
4983 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004984 isr.layerCount = 1;
4985 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004986 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004987 m_commandBuffer->EndCommandBuffer();
4988
Mark Lobodzinski33826372017-04-13 11:10:11 -06004989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004990 // Destroy image dependency prior to submit to cause ERROR
4991 vkDestroyImage(m_device->device(), image, NULL);
4992
4993 VkSubmitInfo submit_info = {};
4994 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4995 submit_info.commandBufferCount = 1;
4996 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4997 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4998
4999 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06005000 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06005001}
5002
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005003TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005004 TEST_DESCRIPTION(
5005 "Attempt to draw with a command buffer that is invalid "
5006 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005007 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005008 VkFormatProperties format_properties;
5009 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005010 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5011 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005012 return;
5013 }
5014
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005015 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5016
5017 VkImageCreateInfo image_ci = {};
5018 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5019 image_ci.pNext = NULL;
5020 image_ci.imageType = VK_IMAGE_TYPE_2D;
5021 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5022 image_ci.extent.width = 32;
5023 image_ci.extent.height = 32;
5024 image_ci.extent.depth = 1;
5025 image_ci.mipLevels = 1;
5026 image_ci.arrayLayers = 1;
5027 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5028 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005029 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005030 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5031 image_ci.flags = 0;
5032 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005033 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005034
5035 VkMemoryRequirements memory_reqs;
5036 VkDeviceMemory image_memory;
5037 bool pass;
5038 VkMemoryAllocateInfo memory_info = {};
5039 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5040 memory_info.pNext = NULL;
5041 memory_info.allocationSize = 0;
5042 memory_info.memoryTypeIndex = 0;
5043 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5044 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005045 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005046 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005047 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005048 ASSERT_VK_SUCCESS(err);
5049 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5050 ASSERT_VK_SUCCESS(err);
5051
5052 VkImageViewCreateInfo ivci = {
5053 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5054 nullptr,
5055 0,
5056 image,
5057 VK_IMAGE_VIEW_TYPE_2D,
5058 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005059 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005060 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5061 };
5062 VkImageView view;
5063 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5064 ASSERT_VK_SUCCESS(err);
5065
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005066 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005067 VkFramebuffer fb;
5068 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5069 ASSERT_VK_SUCCESS(err);
5070
5071 // Just use default renderpass with our framebuffer
5072 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005073 m_renderPassBeginInfo.renderArea.extent.width = 32;
5074 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005075 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005076 m_commandBuffer->BeginCommandBuffer();
5077 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5078 m_commandBuffer->EndRenderPass();
5079 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005080 // Destroy image attached to framebuffer to invalidate cmd buffer
5081 vkDestroyImage(m_device->device(), image, NULL);
5082 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinski33826372017-04-13 11:10:11 -06005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005084 QueueCommandBuffer(false);
5085 m_errorMonitor->VerifyFound();
5086
5087 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5088 vkDestroyImageView(m_device->device(), view, nullptr);
5089 vkFreeMemory(m_device->device(), image_memory, nullptr);
5090}
5091
Tobin Ehlisb329f992016-10-12 13:20:29 -06005092TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5093 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005094 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005095 VkFormatProperties format_properties;
5096 VkResult err = VK_SUCCESS;
5097 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5098
Tobin Ehlisb329f992016-10-12 13:20:29 -06005099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5100
5101 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005102 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 -06005103 ASSERT_TRUE(image.initialized());
5104 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5105
5106 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5107 VkFramebuffer fb;
5108 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5109 ASSERT_VK_SUCCESS(err);
5110
5111 // Just use default renderpass with our framebuffer
5112 m_renderPassBeginInfo.framebuffer = fb;
5113 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005114 m_commandBuffer->BeginCommandBuffer();
5115 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5116 m_commandBuffer->EndRenderPass();
5117 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005118 // Submit cmd buffer to put it in-flight
5119 VkSubmitInfo submit_info = {};
5120 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5121 submit_info.commandBufferCount = 1;
5122 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5123 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5124 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005126 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5127 m_errorMonitor->VerifyFound();
5128 // Wait for queue to complete so we can safely destroy everything
5129 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005130 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5131 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005132 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5133}
5134
Tobin Ehlis88becd72016-09-21 14:33:41 -06005135TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5136 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005137 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005138 VkFormatProperties format_properties;
5139 VkResult err = VK_SUCCESS;
5140 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005141
Tobin Ehlis88becd72016-09-21 14:33:41 -06005142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5143
5144 VkImageCreateInfo image_ci = {};
5145 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5146 image_ci.pNext = NULL;
5147 image_ci.imageType = VK_IMAGE_TYPE_2D;
5148 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5149 image_ci.extent.width = 256;
5150 image_ci.extent.height = 256;
5151 image_ci.extent.depth = 1;
5152 image_ci.mipLevels = 1;
5153 image_ci.arrayLayers = 1;
5154 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5155 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005156 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005157 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5158 image_ci.flags = 0;
5159 VkImage image;
5160 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5161
5162 VkMemoryRequirements memory_reqs;
5163 VkDeviceMemory image_memory;
5164 bool pass;
5165 VkMemoryAllocateInfo memory_info = {};
5166 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5167 memory_info.pNext = NULL;
5168 memory_info.allocationSize = 0;
5169 memory_info.memoryTypeIndex = 0;
5170 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5171 memory_info.allocationSize = memory_reqs.size;
5172 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5173 ASSERT_TRUE(pass);
5174 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5175 ASSERT_VK_SUCCESS(err);
5176 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5177 ASSERT_VK_SUCCESS(err);
5178
5179 VkImageViewCreateInfo ivci = {
5180 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5181 nullptr,
5182 0,
5183 image,
5184 VK_IMAGE_VIEW_TYPE_2D,
5185 VK_FORMAT_B8G8R8A8_UNORM,
5186 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5187 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5188 };
5189 VkImageView view;
5190 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5191 ASSERT_VK_SUCCESS(err);
5192
5193 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5194 VkFramebuffer fb;
5195 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5196 ASSERT_VK_SUCCESS(err);
5197
5198 // Just use default renderpass with our framebuffer
5199 m_renderPassBeginInfo.framebuffer = fb;
5200 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005201 m_commandBuffer->BeginCommandBuffer();
5202 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5203 m_commandBuffer->EndRenderPass();
5204 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005205 // Submit cmd buffer to put it (and attached imageView) in-flight
5206 VkSubmitInfo submit_info = {};
5207 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5208 submit_info.commandBufferCount = 1;
5209 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5210 // Submit cmd buffer to put framebuffer and children in-flight
5211 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5212 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005214 vkDestroyImage(m_device->device(), image, NULL);
5215 m_errorMonitor->VerifyFound();
5216 // Wait for queue to complete so we can safely destroy image and other objects
5217 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005218 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5219 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005220 vkDestroyImage(m_device->device(), image, NULL);
5221 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5222 vkDestroyImageView(m_device->device(), view, nullptr);
5223 vkFreeMemory(m_device->device(), image_memory, nullptr);
5224}
5225
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005226TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5227 TEST_DESCRIPTION("Delete in-use renderPass.");
5228
Tony Barbour1fa09702017-03-16 12:09:08 -06005229 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5231
5232 // Create simple renderpass
5233 VkAttachmentReference attach = {};
5234 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5235 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005236 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005237 subpass.pColorAttachments = &attach;
5238 VkRenderPassCreateInfo rpci = {};
5239 rpci.subpassCount = 1;
5240 rpci.pSubpasses = &subpass;
5241 rpci.attachmentCount = 1;
5242 VkAttachmentDescription attach_desc = {};
5243 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5244 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5245 rpci.pAttachments = &attach_desc;
5246 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5247 VkRenderPass rp;
5248 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5249 ASSERT_VK_SUCCESS(err);
5250
5251 // Create a pipeline that uses the given renderpass
5252 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5253 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5254
5255 VkPipelineLayout pipeline_layout;
5256 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5257 ASSERT_VK_SUCCESS(err);
5258
5259 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5260 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5261 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005262 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005263 vp_state_ci.pViewports = &vp;
5264 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005265 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005266 vp_state_ci.pScissors = &scissors;
5267
5268 VkPipelineShaderStageCreateInfo shaderStages[2];
5269 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5270
5271 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005272 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 -06005273 // but add it to be able to run on more devices
5274 shaderStages[0] = vs.GetStageCreateInfo();
5275 shaderStages[1] = fs.GetStageCreateInfo();
5276
5277 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5278 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5279
5280 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5281 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5282 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5283
5284 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5285 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5286 rs_ci.rasterizerDiscardEnable = true;
5287 rs_ci.lineWidth = 1.0f;
5288
5289 VkPipelineColorBlendAttachmentState att = {};
5290 att.blendEnable = VK_FALSE;
5291 att.colorWriteMask = 0xf;
5292
5293 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5294 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5295 cb_ci.attachmentCount = 1;
5296 cb_ci.pAttachments = &att;
5297
5298 VkGraphicsPipelineCreateInfo gp_ci = {};
5299 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5300 gp_ci.stageCount = 2;
5301 gp_ci.pStages = shaderStages;
5302 gp_ci.pVertexInputState = &vi_ci;
5303 gp_ci.pInputAssemblyState = &ia_ci;
5304 gp_ci.pViewportState = &vp_state_ci;
5305 gp_ci.pRasterizationState = &rs_ci;
5306 gp_ci.pColorBlendState = &cb_ci;
5307 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5308 gp_ci.layout = pipeline_layout;
5309 gp_ci.renderPass = rp;
5310
5311 VkPipelineCacheCreateInfo pc_ci = {};
5312 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5313
Dave Houlton756e6742017-03-23 14:33:22 -06005314 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005315 VkPipeline pipeline;
5316 VkPipelineCache pipe_cache;
5317 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5318 ASSERT_VK_SUCCESS(err);
5319
5320 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5321 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005322
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005323 // Bind pipeline to cmd buffer, will also bind renderpass
5324 m_commandBuffer->BeginCommandBuffer();
5325 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5326 m_commandBuffer->EndCommandBuffer();
5327
5328 VkSubmitInfo submit_info = {};
5329 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5330 submit_info.commandBufferCount = 1;
5331 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5332 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005333 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005334
5335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5336 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5337 m_errorMonitor->VerifyFound();
5338
5339 // Wait for queue to complete so we can safely destroy everything
5340 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005341 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005342 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005343 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5344 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5345 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5346 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5347}
5348
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005349TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005350 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005351 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005352
5353 VkImage image;
5354 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5355 VkImageCreateInfo image_create_info = {};
5356 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5357 image_create_info.pNext = NULL;
5358 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5359 image_create_info.format = tex_format;
5360 image_create_info.extent.width = 32;
5361 image_create_info.extent.height = 32;
5362 image_create_info.extent.depth = 1;
5363 image_create_info.mipLevels = 1;
5364 image_create_info.arrayLayers = 1;
5365 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5366 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005367 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005368 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005370 ASSERT_VK_SUCCESS(err);
5371 // Have to bind memory to image before recording cmd in cmd buffer using it
5372 VkMemoryRequirements mem_reqs;
5373 VkDeviceMemory image_mem;
5374 bool pass;
5375 VkMemoryAllocateInfo mem_alloc = {};
5376 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5377 mem_alloc.pNext = NULL;
5378 mem_alloc.memoryTypeIndex = 0;
5379 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5380 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005381 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005382 ASSERT_TRUE(pass);
5383 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5384 ASSERT_VK_SUCCESS(err);
5385
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005386 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005388 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005389
5390 m_commandBuffer->BeginCommandBuffer();
5391 VkClearColorValue ccv;
5392 ccv.float32[0] = 1.0f;
5393 ccv.float32[1] = 1.0f;
5394 ccv.float32[2] = 1.0f;
5395 ccv.float32[3] = 1.0f;
5396 VkImageSubresourceRange isr = {};
5397 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5398 isr.baseArrayLayer = 0;
5399 isr.baseMipLevel = 0;
5400 isr.layerCount = 1;
5401 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005402 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005403 m_commandBuffer->EndCommandBuffer();
5404
5405 m_errorMonitor->VerifyFound();
5406 vkDestroyImage(m_device->device(), image, NULL);
5407 vkFreeMemory(m_device->device(), image_mem, nullptr);
5408}
5409
5410TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005411 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005412 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005413
5414 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005415 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 -06005416 VK_IMAGE_TILING_OPTIMAL, 0);
5417 ASSERT_TRUE(image.initialized());
5418
5419 VkBuffer buffer;
5420 VkDeviceMemory mem;
5421 VkMemoryRequirements mem_reqs;
5422
5423 VkBufferCreateInfo buf_info = {};
5424 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005425 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005426 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005427 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5428 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5429 ASSERT_VK_SUCCESS(err);
5430
5431 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5432
5433 VkMemoryAllocateInfo alloc_info = {};
5434 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005435 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005436 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005437 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 -06005438 if (!pass) {
5439 vkDestroyBuffer(m_device->device(), buffer, NULL);
5440 return;
5441 }
5442 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5443 ASSERT_VK_SUCCESS(err);
5444
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005445 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005447 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005448 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005449 region.bufferRowLength = 16;
5450 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005451 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5452
5453 region.imageSubresource.layerCount = 1;
5454 region.imageExtent.height = 4;
5455 region.imageExtent.width = 4;
5456 region.imageExtent.depth = 1;
5457 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005458 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5459 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005460 m_commandBuffer->EndCommandBuffer();
5461
5462 m_errorMonitor->VerifyFound();
5463
5464 vkDestroyBuffer(m_device->device(), buffer, NULL);
5465 vkFreeMemory(m_device->handle(), mem, NULL);
5466}
5467
Tobin Ehlis85940f52016-07-07 16:57:21 -06005468TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005469 TEST_DESCRIPTION(
5470 "Attempt to draw with a command buffer that is invalid "
5471 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005472 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005473
5474 VkEvent event;
5475 VkEventCreateInfo evci = {};
5476 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5477 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5478 ASSERT_VK_SUCCESS(result);
5479
5480 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005481 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005482 m_commandBuffer->EndCommandBuffer();
5483
Mark Lobodzinski33826372017-04-13 11:10:11 -06005484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005485 // Destroy event dependency prior to submit to cause ERROR
5486 vkDestroyEvent(m_device->device(), event, NULL);
5487
5488 VkSubmitInfo submit_info = {};
5489 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5490 submit_info.commandBufferCount = 1;
5491 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5492 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5493
5494 m_errorMonitor->VerifyFound();
5495}
5496
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005497TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005498 TEST_DESCRIPTION(
5499 "Attempt to draw with a command buffer that is invalid "
5500 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005501 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005502
5503 VkQueryPool query_pool;
5504 VkQueryPoolCreateInfo qpci{};
5505 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5506 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5507 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005508 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005509 ASSERT_VK_SUCCESS(result);
5510
5511 m_commandBuffer->BeginCommandBuffer();
5512 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5513 m_commandBuffer->EndCommandBuffer();
5514
Mark Lobodzinski33826372017-04-13 11:10:11 -06005515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound QueryPool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005516 // Destroy query pool dependency prior to submit to cause ERROR
5517 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5518
5519 VkSubmitInfo submit_info = {};
5520 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5521 submit_info.commandBufferCount = 1;
5522 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5523 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5524
5525 m_errorMonitor->VerifyFound();
5526}
5527
Tobin Ehlis24130d92016-07-08 15:50:53 -06005528TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005529 TEST_DESCRIPTION(
5530 "Attempt to draw with a command buffer that is invalid "
5531 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005532 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005533 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5534
5535 VkResult err;
5536
5537 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5538 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5539
5540 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005541 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005542 ASSERT_VK_SUCCESS(err);
5543
5544 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5545 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5546 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005547 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005548 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005549 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005550 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005551 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005552
5553 VkPipelineShaderStageCreateInfo shaderStages[2];
5554 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5555
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005556 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005557 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 -06005558 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005559 shaderStages[0] = vs.GetStageCreateInfo();
5560 shaderStages[1] = fs.GetStageCreateInfo();
5561
5562 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5563 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5564
5565 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5566 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5567 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5568
5569 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5570 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005571 rs_ci.rasterizerDiscardEnable = true;
5572 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005573
5574 VkPipelineColorBlendAttachmentState att = {};
5575 att.blendEnable = VK_FALSE;
5576 att.colorWriteMask = 0xf;
5577
5578 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5579 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5580 cb_ci.attachmentCount = 1;
5581 cb_ci.pAttachments = &att;
5582
5583 VkGraphicsPipelineCreateInfo gp_ci = {};
5584 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5585 gp_ci.stageCount = 2;
5586 gp_ci.pStages = shaderStages;
5587 gp_ci.pVertexInputState = &vi_ci;
5588 gp_ci.pInputAssemblyState = &ia_ci;
5589 gp_ci.pViewportState = &vp_state_ci;
5590 gp_ci.pRasterizationState = &rs_ci;
5591 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005592 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5593 gp_ci.layout = pipeline_layout;
5594 gp_ci.renderPass = renderPass();
5595
5596 VkPipelineCacheCreateInfo pc_ci = {};
5597 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5598
5599 VkPipeline pipeline;
5600 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005601 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005602 ASSERT_VK_SUCCESS(err);
5603
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005604 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005605 ASSERT_VK_SUCCESS(err);
5606
5607 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005608 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005609 m_commandBuffer->EndCommandBuffer();
5610 // Now destroy pipeline in order to cause error when submitting
5611 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5612
Mark Lobodzinski33826372017-04-13 11:10:11 -06005613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005614
5615 VkSubmitInfo submit_info = {};
5616 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5617 submit_info.commandBufferCount = 1;
5618 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5619 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5620
5621 m_errorMonitor->VerifyFound();
5622 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5623 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5624}
5625
Tobin Ehlis31289162016-08-17 14:57:58 -06005626TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005627 TEST_DESCRIPTION(
5628 "Attempt to draw with a command buffer that is invalid "
5629 "due to a bound descriptor set with a buffer dependency "
5630 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005631 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005632 ASSERT_NO_FATAL_FAILURE(InitViewport());
5633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5634
5635 VkDescriptorPoolSize ds_type_count = {};
5636 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5637 ds_type_count.descriptorCount = 1;
5638
5639 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5640 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5641 ds_pool_ci.pNext = NULL;
5642 ds_pool_ci.maxSets = 1;
5643 ds_pool_ci.poolSizeCount = 1;
5644 ds_pool_ci.pPoolSizes = &ds_type_count;
5645
5646 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005647 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005648 ASSERT_VK_SUCCESS(err);
5649
5650 VkDescriptorSetLayoutBinding dsl_binding = {};
5651 dsl_binding.binding = 0;
5652 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5653 dsl_binding.descriptorCount = 1;
5654 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5655 dsl_binding.pImmutableSamplers = NULL;
5656
5657 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5658 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5659 ds_layout_ci.pNext = NULL;
5660 ds_layout_ci.bindingCount = 1;
5661 ds_layout_ci.pBindings = &dsl_binding;
5662 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005663 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005664 ASSERT_VK_SUCCESS(err);
5665
5666 VkDescriptorSet descriptorSet;
5667 VkDescriptorSetAllocateInfo alloc_info = {};
5668 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5669 alloc_info.descriptorSetCount = 1;
5670 alloc_info.descriptorPool = ds_pool;
5671 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005672 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005673 ASSERT_VK_SUCCESS(err);
5674
5675 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5676 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5677 pipeline_layout_ci.pNext = NULL;
5678 pipeline_layout_ci.setLayoutCount = 1;
5679 pipeline_layout_ci.pSetLayouts = &ds_layout;
5680
5681 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005682 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005683 ASSERT_VK_SUCCESS(err);
5684
5685 // Create a buffer to update the descriptor with
5686 uint32_t qfi = 0;
5687 VkBufferCreateInfo buffCI = {};
5688 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5689 buffCI.size = 1024;
5690 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5691 buffCI.queueFamilyIndexCount = 1;
5692 buffCI.pQueueFamilyIndices = &qfi;
5693
5694 VkBuffer buffer;
5695 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5696 ASSERT_VK_SUCCESS(err);
5697 // Allocate memory and bind to buffer so we can make it to the appropriate
5698 // error
5699 VkMemoryAllocateInfo mem_alloc = {};
5700 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5701 mem_alloc.pNext = NULL;
5702 mem_alloc.allocationSize = 1024;
5703 mem_alloc.memoryTypeIndex = 0;
5704
5705 VkMemoryRequirements memReqs;
5706 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005707 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005708 if (!pass) {
5709 vkDestroyBuffer(m_device->device(), buffer, NULL);
5710 return;
5711 }
5712
5713 VkDeviceMemory mem;
5714 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5715 ASSERT_VK_SUCCESS(err);
5716 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5717 ASSERT_VK_SUCCESS(err);
5718 // Correctly update descriptor to avoid "NOT_UPDATED" error
5719 VkDescriptorBufferInfo buffInfo = {};
5720 buffInfo.buffer = buffer;
5721 buffInfo.offset = 0;
5722 buffInfo.range = 1024;
5723
5724 VkWriteDescriptorSet descriptor_write;
5725 memset(&descriptor_write, 0, sizeof(descriptor_write));
5726 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5727 descriptor_write.dstSet = descriptorSet;
5728 descriptor_write.dstBinding = 0;
5729 descriptor_write.descriptorCount = 1;
5730 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5731 descriptor_write.pBufferInfo = &buffInfo;
5732
5733 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5734
5735 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005736 char const *vsSource =
5737 "#version 450\n"
5738 "\n"
5739 "out gl_PerVertex { \n"
5740 " vec4 gl_Position;\n"
5741 "};\n"
5742 "void main(){\n"
5743 " gl_Position = vec4(1);\n"
5744 "}\n";
5745 char const *fsSource =
5746 "#version 450\n"
5747 "\n"
5748 "layout(location=0) out vec4 x;\n"
5749 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5750 "void main(){\n"
5751 " x = vec4(bar.y);\n"
5752 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5754 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5755 VkPipelineObj pipe(m_device);
5756 pipe.AddShader(&vs);
5757 pipe.AddShader(&fs);
5758 pipe.AddColorAttachment();
5759 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5760
Tony Barbour552f6c02016-12-21 14:34:07 -07005761 m_commandBuffer->BeginCommandBuffer();
5762 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005763 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5764 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5765 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005766
5767 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5768 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5769
Tobin Ehlis31289162016-08-17 14:57:58 -06005770 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005771 m_commandBuffer->EndRenderPass();
5772 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski33826372017-04-13 11:10:11 -06005773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005774 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5775 vkDestroyBuffer(m_device->device(), buffer, NULL);
5776 // Attempt to submit cmd buffer
5777 VkSubmitInfo submit_info = {};
5778 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5779 submit_info.commandBufferCount = 1;
5780 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5781 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5782 m_errorMonitor->VerifyFound();
5783 // Cleanup
5784 vkFreeMemory(m_device->device(), mem, NULL);
5785
5786 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5787 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5788 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5789}
5790
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005792 TEST_DESCRIPTION(
5793 "Attempt to draw with a command buffer that is invalid "
5794 "due to a bound descriptor sets with a combined image "
5795 "sampler having their image, sampler, and descriptor set "
5796 "each respectively destroyed and then attempting to "
5797 "submit associated cmd buffers. Attempt to destroy a "
5798 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005799 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_NO_FATAL_FAILURE(InitViewport());
5801 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5802
5803 VkDescriptorPoolSize ds_type_count = {};
5804 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5805 ds_type_count.descriptorCount = 1;
5806
5807 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5808 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5809 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005810 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005811 ds_pool_ci.maxSets = 1;
5812 ds_pool_ci.poolSizeCount = 1;
5813 ds_pool_ci.pPoolSizes = &ds_type_count;
5814
5815 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005816 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005817 ASSERT_VK_SUCCESS(err);
5818
5819 VkDescriptorSetLayoutBinding dsl_binding = {};
5820 dsl_binding.binding = 0;
5821 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5822 dsl_binding.descriptorCount = 1;
5823 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5824 dsl_binding.pImmutableSamplers = NULL;
5825
5826 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5827 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5828 ds_layout_ci.pNext = NULL;
5829 ds_layout_ci.bindingCount = 1;
5830 ds_layout_ci.pBindings = &dsl_binding;
5831 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005833 ASSERT_VK_SUCCESS(err);
5834
5835 VkDescriptorSet descriptorSet;
5836 VkDescriptorSetAllocateInfo alloc_info = {};
5837 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5838 alloc_info.descriptorSetCount = 1;
5839 alloc_info.descriptorPool = ds_pool;
5840 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005841 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005842 ASSERT_VK_SUCCESS(err);
5843
5844 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5845 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5846 pipeline_layout_ci.pNext = NULL;
5847 pipeline_layout_ci.setLayoutCount = 1;
5848 pipeline_layout_ci.pSetLayouts = &ds_layout;
5849
5850 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005851 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005852 ASSERT_VK_SUCCESS(err);
5853
5854 // Create images to update the descriptor with
5855 VkImage image;
5856 VkImage image2;
5857 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5858 const int32_t tex_width = 32;
5859 const int32_t tex_height = 32;
5860 VkImageCreateInfo image_create_info = {};
5861 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5862 image_create_info.pNext = NULL;
5863 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5864 image_create_info.format = tex_format;
5865 image_create_info.extent.width = tex_width;
5866 image_create_info.extent.height = tex_height;
5867 image_create_info.extent.depth = 1;
5868 image_create_info.mipLevels = 1;
5869 image_create_info.arrayLayers = 1;
5870 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5871 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5872 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5873 image_create_info.flags = 0;
5874 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5875 ASSERT_VK_SUCCESS(err);
5876 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5877 ASSERT_VK_SUCCESS(err);
5878
5879 VkMemoryRequirements memory_reqs;
5880 VkDeviceMemory image_memory;
5881 bool pass;
5882 VkMemoryAllocateInfo memory_info = {};
5883 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5884 memory_info.pNext = NULL;
5885 memory_info.allocationSize = 0;
5886 memory_info.memoryTypeIndex = 0;
5887 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5888 // Allocate enough memory for both images
5889 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005890 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005891 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005892 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005893 ASSERT_VK_SUCCESS(err);
5894 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5895 ASSERT_VK_SUCCESS(err);
5896 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005897 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005898 ASSERT_VK_SUCCESS(err);
5899
5900 VkImageViewCreateInfo image_view_create_info = {};
5901 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5902 image_view_create_info.image = image;
5903 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5904 image_view_create_info.format = tex_format;
5905 image_view_create_info.subresourceRange.layerCount = 1;
5906 image_view_create_info.subresourceRange.baseMipLevel = 0;
5907 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005908 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005909
5910 VkImageView view;
5911 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005912 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005913 ASSERT_VK_SUCCESS(err);
5914 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005915 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005916 ASSERT_VK_SUCCESS(err);
5917 // Create Samplers
5918 VkSamplerCreateInfo sampler_ci = {};
5919 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5920 sampler_ci.pNext = NULL;
5921 sampler_ci.magFilter = VK_FILTER_NEAREST;
5922 sampler_ci.minFilter = VK_FILTER_NEAREST;
5923 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5924 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5925 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5926 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5927 sampler_ci.mipLodBias = 1.0;
5928 sampler_ci.anisotropyEnable = VK_FALSE;
5929 sampler_ci.maxAnisotropy = 1;
5930 sampler_ci.compareEnable = VK_FALSE;
5931 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5932 sampler_ci.minLod = 1.0;
5933 sampler_ci.maxLod = 1.0;
5934 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5935 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5936 VkSampler sampler;
5937 VkSampler sampler2;
5938 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5939 ASSERT_VK_SUCCESS(err);
5940 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5941 ASSERT_VK_SUCCESS(err);
5942 // Update descriptor with image and sampler
5943 VkDescriptorImageInfo img_info = {};
5944 img_info.sampler = sampler;
5945 img_info.imageView = view;
5946 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5947
5948 VkWriteDescriptorSet descriptor_write;
5949 memset(&descriptor_write, 0, sizeof(descriptor_write));
5950 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5951 descriptor_write.dstSet = descriptorSet;
5952 descriptor_write.dstBinding = 0;
5953 descriptor_write.descriptorCount = 1;
5954 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5955 descriptor_write.pImageInfo = &img_info;
5956
5957 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5958
5959 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005960 char const *vsSource =
5961 "#version 450\n"
5962 "\n"
5963 "out gl_PerVertex { \n"
5964 " vec4 gl_Position;\n"
5965 "};\n"
5966 "void main(){\n"
5967 " gl_Position = vec4(1);\n"
5968 "}\n";
5969 char const *fsSource =
5970 "#version 450\n"
5971 "\n"
5972 "layout(set=0, binding=0) uniform sampler2D s;\n"
5973 "layout(location=0) out vec4 x;\n"
5974 "void main(){\n"
5975 " x = texture(s, vec2(1));\n"
5976 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005977 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5978 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5979 VkPipelineObj pipe(m_device);
5980 pipe.AddShader(&vs);
5981 pipe.AddShader(&fs);
5982 pipe.AddColorAttachment();
5983 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5984
5985 // First error case is destroying sampler prior to cmd buffer submission
Mark Lobodzinski33826372017-04-13 11:10:11 -06005986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound Sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005987 m_commandBuffer->BeginCommandBuffer();
5988 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005989 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5990 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5991 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005992 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5993 VkRect2D scissor = {{0, 0}, {16, 16}};
5994 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5995 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005996 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005997 m_commandBuffer->EndRenderPass();
5998 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005999 // Destroy sampler invalidates the cmd buffer, causing error on submit
6000 vkDestroySampler(m_device->device(), sampler, NULL);
6001 // Attempt to submit cmd buffer
6002 VkSubmitInfo submit_info = {};
6003 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6004 submit_info.commandBufferCount = 1;
6005 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6006 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6007 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07006008
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006009 // Now re-update descriptor with valid sampler and delete image
6010 img_info.sampler = sampler2;
6011 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006012
6013 VkCommandBufferBeginInfo info = {};
6014 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6015 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
6016
Mark Lobodzinski33826372017-04-13 11:10:11 -06006017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound Image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07006018 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006019 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006020 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6021 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6022 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006023 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6024 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006026 m_commandBuffer->EndRenderPass();
6027 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006028 // Destroy image invalidates the cmd buffer, causing error on submit
6029 vkDestroyImage(m_device->device(), image, NULL);
6030 // Attempt to submit cmd buffer
6031 submit_info = {};
6032 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6033 submit_info.commandBufferCount = 1;
6034 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6035 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6036 m_errorMonitor->VerifyFound();
6037 // Now update descriptor to be valid, but then free descriptor
6038 img_info.imageView = view2;
6039 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006040 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006041 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006042 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6043 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6044 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006045 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6046 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006047 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006048 m_commandBuffer->EndRenderPass();
6049 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006050 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006051
6052 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006054 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006055 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006056
6057 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006058 // 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 -07006059 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006060 m_errorMonitor->SetUnexpectedError(
6061 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6062 "either be a valid handle or VK_NULL_HANDLE");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006063 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006064 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6065
6066 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006067 submit_info = {};
6068 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6069 submit_info.commandBufferCount = 1;
6070 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinski33826372017-04-13 11:10:11 -06006071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound DescriptorSet ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006072 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6073 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006074
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006075 // Cleanup
6076 vkFreeMemory(m_device->device(), image_memory, NULL);
6077 vkDestroySampler(m_device->device(), sampler2, NULL);
6078 vkDestroyImage(m_device->device(), image2, NULL);
6079 vkDestroyImageView(m_device->device(), view, NULL);
6080 vkDestroyImageView(m_device->device(), view2, NULL);
6081 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6082 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6083 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6084}
6085
Tobin Ehlisaabbcd02017-04-13 14:15:21 -06006086TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6087 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6088 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6089 ASSERT_NO_FATAL_FAILURE(InitViewport());
6090 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6091
6092 VkDescriptorPoolSize ds_type_count = {};
6093 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6094 ds_type_count.descriptorCount = 1;
6095
6096 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6097 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6098 ds_pool_ci.pNext = NULL;
6099 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6100 ds_pool_ci.maxSets = 1;
6101 ds_pool_ci.poolSizeCount = 1;
6102 ds_pool_ci.pPoolSizes = &ds_type_count;
6103
6104 VkDescriptorPool ds_pool;
6105 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6106 ASSERT_VK_SUCCESS(err);
6107
6108 VkDescriptorSetLayoutBinding dsl_binding = {};
6109 dsl_binding.binding = 0;
6110 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6111 dsl_binding.descriptorCount = 1;
6112 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6113 dsl_binding.pImmutableSamplers = NULL;
6114
6115 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6116 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6117 ds_layout_ci.pNext = NULL;
6118 ds_layout_ci.bindingCount = 1;
6119 ds_layout_ci.pBindings = &dsl_binding;
6120 VkDescriptorSetLayout ds_layout;
6121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6122 ASSERT_VK_SUCCESS(err);
6123
6124 VkDescriptorSet descriptorSet;
6125 VkDescriptorSetAllocateInfo alloc_info = {};
6126 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6127 alloc_info.descriptorSetCount = 1;
6128 alloc_info.descriptorPool = ds_pool;
6129 alloc_info.pSetLayouts = &ds_layout;
6130 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6131 ASSERT_VK_SUCCESS(err);
6132
6133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6135 pipeline_layout_ci.pNext = NULL;
6136 pipeline_layout_ci.setLayoutCount = 1;
6137 pipeline_layout_ci.pSetLayouts = &ds_layout;
6138
6139 VkPipelineLayout pipeline_layout;
6140 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6141 ASSERT_VK_SUCCESS(err);
6142
6143 // Create images to update the descriptor with
6144 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6145 VkImageObj image(m_device);
6146 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6147 0);
6148 ASSERT_TRUE(image.initialized());
6149
6150 VkImageViewCreateInfo image_view_create_info = {};
6151 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6152 image_view_create_info.image = image.handle();
6153 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6154 image_view_create_info.format = format;
6155 image_view_create_info.subresourceRange.layerCount = 1;
6156 image_view_create_info.subresourceRange.baseMipLevel = 0;
6157 image_view_create_info.subresourceRange.levelCount = 1;
6158 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6159
6160 VkImageView view;
6161 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6162 ASSERT_VK_SUCCESS(err);
6163 // Create Sampler
6164 VkSamplerCreateInfo sampler_ci = {};
6165 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6166 sampler_ci.pNext = NULL;
6167 sampler_ci.magFilter = VK_FILTER_NEAREST;
6168 sampler_ci.minFilter = VK_FILTER_NEAREST;
6169 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6170 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6171 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6172 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6173 sampler_ci.mipLodBias = 1.0;
6174 sampler_ci.anisotropyEnable = VK_FALSE;
6175 sampler_ci.maxAnisotropy = 1;
6176 sampler_ci.compareEnable = VK_FALSE;
6177 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6178 sampler_ci.minLod = 1.0;
6179 sampler_ci.maxLod = 1.0;
6180 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6181 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6182 VkSampler sampler;
6183 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6184 ASSERT_VK_SUCCESS(err);
6185 // Update descriptor with image and sampler
6186 VkDescriptorImageInfo img_info = {};
6187 img_info.sampler = sampler;
6188 img_info.imageView = view;
6189 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6190 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6191
6192 VkWriteDescriptorSet descriptor_write;
6193 memset(&descriptor_write, 0, sizeof(descriptor_write));
6194 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6195 descriptor_write.dstSet = descriptorSet;
6196 descriptor_write.dstBinding = 0;
6197 descriptor_write.descriptorCount = 1;
6198 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6199 descriptor_write.pImageInfo = &img_info;
6200
6201 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6202
6203 // Create PSO to be used for draw-time errors below
6204 char const *vsSource =
6205 "#version 450\n"
6206 "\n"
6207 "out gl_PerVertex { \n"
6208 " vec4 gl_Position;\n"
6209 "};\n"
6210 "void main(){\n"
6211 " gl_Position = vec4(1);\n"
6212 "}\n";
6213 char const *fsSource =
6214 "#version 450\n"
6215 "\n"
6216 "layout(set=0, binding=0) uniform sampler2D s;\n"
6217 "layout(location=0) out vec4 x;\n"
6218 "void main(){\n"
6219 " x = texture(s, vec2(1));\n"
6220 "}\n";
6221 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6222 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6223 VkPipelineObj pipe(m_device);
6224 pipe.AddShader(&vs);
6225 pipe.AddShader(&fs);
6226 pipe.AddColorAttachment();
6227 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6228
6229 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6230 cmd_buf.BeginCommandBuffer();
6231 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
6232 // record layout different than actual descriptor layout of SHADER_RO
6233 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
6234 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6235 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6236 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6237 VkRect2D scissor = {{0, 0}, {16, 16}};
6238 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6239 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6240 // At draw time the update layout will mis-match the actual layout
6241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6242 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6243 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6244 m_errorMonitor->SetDesiredFailureMsg(
6245 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6246 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6247 cmd_buf.Draw(1, 0, 0, 0);
6248 m_errorMonitor->VerifyFound();
6249 cmd_buf.EndRenderPass();
6250 cmd_buf.EndCommandBuffer();
6251 // Submit cmd buffer
6252 VkSubmitInfo submit_info = {};
6253 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6254 submit_info.commandBufferCount = 1;
6255 submit_info.pCommandBuffers = &cmd_buf.handle();
6256 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6257 vkQueueWaitIdle(m_device->m_queue);
6258 // Cleanup
6259 vkDestroySampler(m_device->device(), sampler, NULL);
6260 vkDestroyImageView(m_device->device(), view, NULL);
6261 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6262 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6263 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6264}
6265
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006266TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6267 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006268 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006269 ASSERT_NO_FATAL_FAILURE(InitViewport());
6270 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6271
6272 VkDescriptorPoolSize ds_type_count = {};
6273 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6274 ds_type_count.descriptorCount = 1;
6275
6276 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6277 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6278 ds_pool_ci.pNext = NULL;
6279 ds_pool_ci.maxSets = 1;
6280 ds_pool_ci.poolSizeCount = 1;
6281 ds_pool_ci.pPoolSizes = &ds_type_count;
6282
6283 VkDescriptorPool ds_pool;
6284 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6285 ASSERT_VK_SUCCESS(err);
6286
6287 VkDescriptorSetLayoutBinding dsl_binding = {};
6288 dsl_binding.binding = 0;
6289 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6290 dsl_binding.descriptorCount = 1;
6291 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6292 dsl_binding.pImmutableSamplers = NULL;
6293
6294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6296 ds_layout_ci.pNext = NULL;
6297 ds_layout_ci.bindingCount = 1;
6298 ds_layout_ci.pBindings = &dsl_binding;
6299 VkDescriptorSetLayout ds_layout;
6300 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6301 ASSERT_VK_SUCCESS(err);
6302
6303 VkDescriptorSet descriptor_set;
6304 VkDescriptorSetAllocateInfo alloc_info = {};
6305 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6306 alloc_info.descriptorSetCount = 1;
6307 alloc_info.descriptorPool = ds_pool;
6308 alloc_info.pSetLayouts = &ds_layout;
6309 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6310 ASSERT_VK_SUCCESS(err);
6311
6312 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6313 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6314 pipeline_layout_ci.pNext = NULL;
6315 pipeline_layout_ci.setLayoutCount = 1;
6316 pipeline_layout_ci.pSetLayouts = &ds_layout;
6317
6318 VkPipelineLayout pipeline_layout;
6319 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6320 ASSERT_VK_SUCCESS(err);
6321
6322 // Create image to update the descriptor with
6323 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006324 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 -06006325 ASSERT_TRUE(image.initialized());
6326
6327 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6328 // Create Sampler
6329 VkSamplerCreateInfo sampler_ci = {};
6330 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6331 sampler_ci.pNext = NULL;
6332 sampler_ci.magFilter = VK_FILTER_NEAREST;
6333 sampler_ci.minFilter = VK_FILTER_NEAREST;
6334 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6335 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6336 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6337 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6338 sampler_ci.mipLodBias = 1.0;
6339 sampler_ci.anisotropyEnable = VK_FALSE;
6340 sampler_ci.maxAnisotropy = 1;
6341 sampler_ci.compareEnable = VK_FALSE;
6342 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6343 sampler_ci.minLod = 1.0;
6344 sampler_ci.maxLod = 1.0;
6345 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6346 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6347 VkSampler sampler;
6348 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6349 ASSERT_VK_SUCCESS(err);
6350 // Update descriptor with image and sampler
6351 VkDescriptorImageInfo img_info = {};
6352 img_info.sampler = sampler;
6353 img_info.imageView = view;
6354 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6355
6356 VkWriteDescriptorSet descriptor_write;
6357 memset(&descriptor_write, 0, sizeof(descriptor_write));
6358 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6359 descriptor_write.dstSet = descriptor_set;
6360 descriptor_write.dstBinding = 0;
6361 descriptor_write.descriptorCount = 1;
6362 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6363 descriptor_write.pImageInfo = &img_info;
6364
6365 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6366
6367 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006368 char const *vsSource =
6369 "#version 450\n"
6370 "\n"
6371 "out gl_PerVertex { \n"
6372 " vec4 gl_Position;\n"
6373 "};\n"
6374 "void main(){\n"
6375 " gl_Position = vec4(1);\n"
6376 "}\n";
6377 char const *fsSource =
6378 "#version 450\n"
6379 "\n"
6380 "layout(set=0, binding=0) uniform sampler2D s;\n"
6381 "layout(location=0) out vec4 x;\n"
6382 "void main(){\n"
6383 " x = texture(s, vec2(1));\n"
6384 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006385 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6386 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6387 VkPipelineObj pipe(m_device);
6388 pipe.AddShader(&vs);
6389 pipe.AddShader(&fs);
6390 pipe.AddColorAttachment();
6391 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6392
Tony Barbour552f6c02016-12-21 14:34:07 -07006393 m_commandBuffer->BeginCommandBuffer();
6394 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006395 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6396 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6397 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006398
6399 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6400 VkRect2D scissor = {{0, 0}, {16, 16}};
6401 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6402 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6403
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006404 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006405 m_commandBuffer->EndRenderPass();
6406 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006407 // Submit cmd buffer to put pool in-flight
6408 VkSubmitInfo submit_info = {};
6409 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6410 submit_info.commandBufferCount = 1;
6411 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6412 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6413 // Destroy pool while in-flight, causing error
Mark Lobodzinski33826372017-04-13 11:10:11 -06006414 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete DescriptorPool ");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006415 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6416 m_errorMonitor->VerifyFound();
6417 vkQueueWaitIdle(m_device->m_queue);
6418 // Cleanup
6419 vkDestroySampler(m_device->device(), sampler, NULL);
6420 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6421 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006422 m_errorMonitor->SetUnexpectedError(
6423 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006424 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006425 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006426 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006427}
6428
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006429TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6430 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006431 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006432 ASSERT_NO_FATAL_FAILURE(InitViewport());
6433 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6434
6435 VkDescriptorPoolSize ds_type_count = {};
6436 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6437 ds_type_count.descriptorCount = 1;
6438
6439 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6440 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6441 ds_pool_ci.pNext = NULL;
6442 ds_pool_ci.maxSets = 1;
6443 ds_pool_ci.poolSizeCount = 1;
6444 ds_pool_ci.pPoolSizes = &ds_type_count;
6445
6446 VkDescriptorPool ds_pool;
6447 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6448 ASSERT_VK_SUCCESS(err);
6449
6450 VkDescriptorSetLayoutBinding dsl_binding = {};
6451 dsl_binding.binding = 0;
6452 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6453 dsl_binding.descriptorCount = 1;
6454 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6455 dsl_binding.pImmutableSamplers = NULL;
6456
6457 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6458 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6459 ds_layout_ci.pNext = NULL;
6460 ds_layout_ci.bindingCount = 1;
6461 ds_layout_ci.pBindings = &dsl_binding;
6462 VkDescriptorSetLayout ds_layout;
6463 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6464 ASSERT_VK_SUCCESS(err);
6465
6466 VkDescriptorSet descriptorSet;
6467 VkDescriptorSetAllocateInfo alloc_info = {};
6468 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6469 alloc_info.descriptorSetCount = 1;
6470 alloc_info.descriptorPool = ds_pool;
6471 alloc_info.pSetLayouts = &ds_layout;
6472 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6473 ASSERT_VK_SUCCESS(err);
6474
6475 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6476 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6477 pipeline_layout_ci.pNext = NULL;
6478 pipeline_layout_ci.setLayoutCount = 1;
6479 pipeline_layout_ci.pSetLayouts = &ds_layout;
6480
6481 VkPipelineLayout pipeline_layout;
6482 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6483 ASSERT_VK_SUCCESS(err);
6484
6485 // Create images to update the descriptor with
6486 VkImage image;
6487 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6488 const int32_t tex_width = 32;
6489 const int32_t tex_height = 32;
6490 VkImageCreateInfo image_create_info = {};
6491 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6492 image_create_info.pNext = NULL;
6493 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6494 image_create_info.format = tex_format;
6495 image_create_info.extent.width = tex_width;
6496 image_create_info.extent.height = tex_height;
6497 image_create_info.extent.depth = 1;
6498 image_create_info.mipLevels = 1;
6499 image_create_info.arrayLayers = 1;
6500 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6501 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6502 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6503 image_create_info.flags = 0;
6504 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6505 ASSERT_VK_SUCCESS(err);
6506 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6507 VkMemoryRequirements memory_reqs;
6508 VkDeviceMemory image_memory;
6509 bool pass;
6510 VkMemoryAllocateInfo memory_info = {};
6511 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6512 memory_info.pNext = NULL;
6513 memory_info.allocationSize = 0;
6514 memory_info.memoryTypeIndex = 0;
6515 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6516 // Allocate enough memory for image
6517 memory_info.allocationSize = memory_reqs.size;
6518 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6519 ASSERT_TRUE(pass);
6520 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6521 ASSERT_VK_SUCCESS(err);
6522 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6523 ASSERT_VK_SUCCESS(err);
6524
6525 VkImageViewCreateInfo image_view_create_info = {};
6526 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6527 image_view_create_info.image = image;
6528 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6529 image_view_create_info.format = tex_format;
6530 image_view_create_info.subresourceRange.layerCount = 1;
6531 image_view_create_info.subresourceRange.baseMipLevel = 0;
6532 image_view_create_info.subresourceRange.levelCount = 1;
6533 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6534
6535 VkImageView view;
6536 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6537 ASSERT_VK_SUCCESS(err);
6538 // Create Samplers
6539 VkSamplerCreateInfo sampler_ci = {};
6540 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6541 sampler_ci.pNext = NULL;
6542 sampler_ci.magFilter = VK_FILTER_NEAREST;
6543 sampler_ci.minFilter = VK_FILTER_NEAREST;
6544 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6545 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6546 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6547 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6548 sampler_ci.mipLodBias = 1.0;
6549 sampler_ci.anisotropyEnable = VK_FALSE;
6550 sampler_ci.maxAnisotropy = 1;
6551 sampler_ci.compareEnable = VK_FALSE;
6552 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6553 sampler_ci.minLod = 1.0;
6554 sampler_ci.maxLod = 1.0;
6555 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6556 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6557 VkSampler sampler;
6558 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6559 ASSERT_VK_SUCCESS(err);
6560 // Update descriptor with image and sampler
6561 VkDescriptorImageInfo img_info = {};
6562 img_info.sampler = sampler;
6563 img_info.imageView = view;
6564 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6565
6566 VkWriteDescriptorSet descriptor_write;
6567 memset(&descriptor_write, 0, sizeof(descriptor_write));
6568 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6569 descriptor_write.dstSet = descriptorSet;
6570 descriptor_write.dstBinding = 0;
6571 descriptor_write.descriptorCount = 1;
6572 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6573 descriptor_write.pImageInfo = &img_info;
6574 // Break memory binding and attempt update
6575 vkFreeMemory(m_device->device(), image_memory, nullptr);
6576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006577 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6579 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6580 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6581 m_errorMonitor->VerifyFound();
6582 // Cleanup
6583 vkDestroyImage(m_device->device(), image, NULL);
6584 vkDestroySampler(m_device->device(), sampler, NULL);
6585 vkDestroyImageView(m_device->device(), view, NULL);
6586 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6587 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6588 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6589}
6590
Karl Schultz6addd812016-02-02 17:17:23 -07006591TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006592 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6593 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006594 // Create a valid cmd buffer
6595 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006596 uint64_t fake_pipeline_handle = 0xbaad6001;
6597 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006598 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6600
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006602 m_commandBuffer->BeginCommandBuffer();
6603 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006604 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006605 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006606
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006607 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006608 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 -06006609 Draw(1, 0, 0, 0);
6610 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006611
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006612 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006613 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 -07006614 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006615 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6616 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006617}
6618
Karl Schultz6addd812016-02-02 17:17:23 -07006619TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006620 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006621 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006622
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006624
Tony Barbour1fa09702017-03-16 12:09:08 -06006625 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006626 ASSERT_NO_FATAL_FAILURE(InitViewport());
6627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006628 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006629 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6630 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006631
6632 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006633 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6634 ds_pool_ci.pNext = NULL;
6635 ds_pool_ci.maxSets = 1;
6636 ds_pool_ci.poolSizeCount = 1;
6637 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006638
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006639 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006640 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006641 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006642
Tony Barboureb254902015-07-15 12:50:33 -06006643 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006644 dsl_binding.binding = 0;
6645 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6646 dsl_binding.descriptorCount = 1;
6647 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6648 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006649
Tony Barboureb254902015-07-15 12:50:33 -06006650 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006651 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6652 ds_layout_ci.pNext = NULL;
6653 ds_layout_ci.bindingCount = 1;
6654 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006655 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006656 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006657 ASSERT_VK_SUCCESS(err);
6658
6659 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006660 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006662 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006663 alloc_info.descriptorPool = ds_pool;
6664 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006666 ASSERT_VK_SUCCESS(err);
6667
Tony Barboureb254902015-07-15 12:50:33 -06006668 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006669 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6670 pipeline_layout_ci.pNext = NULL;
6671 pipeline_layout_ci.setLayoutCount = 1;
6672 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006673
6674 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006675 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006676 ASSERT_VK_SUCCESS(err);
6677
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006679 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006680 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006681 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006682
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006683 VkPipelineObj pipe(m_device);
6684 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006685 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006686 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006687 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006688
Tony Barbour552f6c02016-12-21 14:34:07 -07006689 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006690 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6691 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6692 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006693
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006694 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006695
Chia-I Wuf7458c52015-10-26 21:10:41 +08006696 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6697 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6698 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006699}
6700
Karl Schultz6addd812016-02-02 17:17:23 -07006701TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006702 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006703 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006704
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006706
Tony Barbour1fa09702017-03-16 12:09:08 -06006707 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006708 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006709 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6710 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006711
6712 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006713 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6714 ds_pool_ci.pNext = NULL;
6715 ds_pool_ci.maxSets = 1;
6716 ds_pool_ci.poolSizeCount = 1;
6717 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006718
6719 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006720 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006721 ASSERT_VK_SUCCESS(err);
6722
6723 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006724 dsl_binding.binding = 0;
6725 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6726 dsl_binding.descriptorCount = 1;
6727 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6728 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006729
6730 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006731 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6732 ds_layout_ci.pNext = NULL;
6733 ds_layout_ci.bindingCount = 1;
6734 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006735 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006736 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006737 ASSERT_VK_SUCCESS(err);
6738
6739 VkDescriptorSet descriptorSet;
6740 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006741 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006742 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006743 alloc_info.descriptorPool = ds_pool;
6744 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006745 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006746 ASSERT_VK_SUCCESS(err);
6747
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006748 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006749 VkWriteDescriptorSet descriptor_write;
6750 memset(&descriptor_write, 0, sizeof(descriptor_write));
6751 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6752 descriptor_write.dstSet = descriptorSet;
6753 descriptor_write.dstBinding = 0;
6754 descriptor_write.descriptorCount = 1;
6755 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6756 descriptor_write.pTexelBufferView = &view;
6757
6758 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6759
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006760 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006761
6762 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6763 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6764}
6765
Mark Youngd339ba32016-05-30 13:28:35 -06006766TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006767 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 -06006768
6769 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006771 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006772
Tony Barbour1fa09702017-03-16 12:09:08 -06006773 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006774
6775 // Create a buffer with no bound memory and then attempt to create
6776 // a buffer view.
6777 VkBufferCreateInfo buff_ci = {};
6778 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006779 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006780 buff_ci.size = 256;
6781 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6782 VkBuffer buffer;
6783 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6784 ASSERT_VK_SUCCESS(err);
6785
6786 VkBufferViewCreateInfo buff_view_ci = {};
6787 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6788 buff_view_ci.buffer = buffer;
6789 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6790 buff_view_ci.range = VK_WHOLE_SIZE;
6791 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006792 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006793
6794 m_errorMonitor->VerifyFound();
6795 vkDestroyBuffer(m_device->device(), buffer, NULL);
6796 // If last error is success, it still created the view, so delete it.
6797 if (err == VK_SUCCESS) {
6798 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6799 }
6800}
6801
Karl Schultz6addd812016-02-02 17:17:23 -07006802TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6803 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6804 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006805 // 1. No dynamicOffset supplied
6806 // 2. Too many dynamicOffsets supplied
6807 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006808 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6810 " requires 1 dynamicOffsets, but only "
6811 "0 dynamicOffsets are left in "
6812 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006813
Tony Barbour1fa09702017-03-16 12:09:08 -06006814 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006815 ASSERT_NO_FATAL_FAILURE(InitViewport());
6816 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6817
6818 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006819 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6820 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006821
6822 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006823 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6824 ds_pool_ci.pNext = NULL;
6825 ds_pool_ci.maxSets = 1;
6826 ds_pool_ci.poolSizeCount = 1;
6827 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006828
6829 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006830 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006831 ASSERT_VK_SUCCESS(err);
6832
6833 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006834 dsl_binding.binding = 0;
6835 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6836 dsl_binding.descriptorCount = 1;
6837 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6838 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006839
6840 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006841 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6842 ds_layout_ci.pNext = NULL;
6843 ds_layout_ci.bindingCount = 1;
6844 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006845 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006846 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006847 ASSERT_VK_SUCCESS(err);
6848
6849 VkDescriptorSet descriptorSet;
6850 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006851 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006852 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006853 alloc_info.descriptorPool = ds_pool;
6854 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006855 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006856 ASSERT_VK_SUCCESS(err);
6857
6858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6860 pipeline_layout_ci.pNext = NULL;
6861 pipeline_layout_ci.setLayoutCount = 1;
6862 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006863
6864 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006865 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006866 ASSERT_VK_SUCCESS(err);
6867
6868 // Create a buffer to update the descriptor with
6869 uint32_t qfi = 0;
6870 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006871 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6872 buffCI.size = 1024;
6873 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6874 buffCI.queueFamilyIndexCount = 1;
6875 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006876
6877 VkBuffer dyub;
6878 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6879 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006880 // Allocate memory and bind to buffer so we can make it to the appropriate
6881 // error
6882 VkMemoryAllocateInfo mem_alloc = {};
6883 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6884 mem_alloc.pNext = NULL;
6885 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006886 mem_alloc.memoryTypeIndex = 0;
6887
6888 VkMemoryRequirements memReqs;
6889 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006890 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006891 if (!pass) {
6892 vkDestroyBuffer(m_device->device(), dyub, NULL);
6893 return;
6894 }
6895
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006896 VkDeviceMemory mem;
6897 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6898 ASSERT_VK_SUCCESS(err);
6899 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6900 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006901 // Correctly update descriptor to avoid "NOT_UPDATED" error
6902 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006903 buffInfo.buffer = dyub;
6904 buffInfo.offset = 0;
6905 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006906
6907 VkWriteDescriptorSet descriptor_write;
6908 memset(&descriptor_write, 0, sizeof(descriptor_write));
6909 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6910 descriptor_write.dstSet = descriptorSet;
6911 descriptor_write.dstBinding = 0;
6912 descriptor_write.descriptorCount = 1;
6913 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6914 descriptor_write.pBufferInfo = &buffInfo;
6915
6916 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6917
Tony Barbour552f6c02016-12-21 14:34:07 -07006918 m_commandBuffer->BeginCommandBuffer();
6919 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006920 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6921 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006922 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006923 uint32_t pDynOff[2] = {512, 756};
6924 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6926 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6927 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6928 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006929 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006930 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6932 " dynamic offset 512 combined with "
6933 "offset 0 and range 1024 that "
6934 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006935 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006936 char const *vsSource =
6937 "#version 450\n"
6938 "\n"
6939 "out gl_PerVertex { \n"
6940 " vec4 gl_Position;\n"
6941 "};\n"
6942 "void main(){\n"
6943 " gl_Position = vec4(1);\n"
6944 "}\n";
6945 char const *fsSource =
6946 "#version 450\n"
6947 "\n"
6948 "layout(location=0) out vec4 x;\n"
6949 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6950 "void main(){\n"
6951 " x = vec4(bar.y);\n"
6952 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006953 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6954 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6955 VkPipelineObj pipe(m_device);
6956 pipe.AddShader(&vs);
6957 pipe.AddShader(&fs);
6958 pipe.AddColorAttachment();
6959 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6960
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006961 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6962 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6963 VkRect2D scissor = {{0, 0}, {16, 16}};
6964 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6965
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006966 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006967 // This update should succeed, but offset size of 512 will overstep buffer
6968 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006969 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6970 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006971 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006972 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006973
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006974 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006975 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006976
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006977 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006978 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006979 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6980}
6981
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006982TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006983 TEST_DESCRIPTION(
6984 "Attempt to update a descriptor with a non-sparse buffer "
6985 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006986 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006988 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6990 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006991
Tony Barbour1fa09702017-03-16 12:09:08 -06006992 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006993 ASSERT_NO_FATAL_FAILURE(InitViewport());
6994 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6995
6996 VkDescriptorPoolSize ds_type_count = {};
6997 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6998 ds_type_count.descriptorCount = 1;
6999
7000 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7001 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7002 ds_pool_ci.pNext = NULL;
7003 ds_pool_ci.maxSets = 1;
7004 ds_pool_ci.poolSizeCount = 1;
7005 ds_pool_ci.pPoolSizes = &ds_type_count;
7006
7007 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007008 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007009 ASSERT_VK_SUCCESS(err);
7010
7011 VkDescriptorSetLayoutBinding dsl_binding = {};
7012 dsl_binding.binding = 0;
7013 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7014 dsl_binding.descriptorCount = 1;
7015 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7016 dsl_binding.pImmutableSamplers = NULL;
7017
7018 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7019 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7020 ds_layout_ci.pNext = NULL;
7021 ds_layout_ci.bindingCount = 1;
7022 ds_layout_ci.pBindings = &dsl_binding;
7023 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007024 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007025 ASSERT_VK_SUCCESS(err);
7026
7027 VkDescriptorSet descriptorSet;
7028 VkDescriptorSetAllocateInfo alloc_info = {};
7029 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7030 alloc_info.descriptorSetCount = 1;
7031 alloc_info.descriptorPool = ds_pool;
7032 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007033 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007034 ASSERT_VK_SUCCESS(err);
7035
7036 // Create a buffer to update the descriptor with
7037 uint32_t qfi = 0;
7038 VkBufferCreateInfo buffCI = {};
7039 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7040 buffCI.size = 1024;
7041 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7042 buffCI.queueFamilyIndexCount = 1;
7043 buffCI.pQueueFamilyIndices = &qfi;
7044
7045 VkBuffer dyub;
7046 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7047 ASSERT_VK_SUCCESS(err);
7048
7049 // Attempt to update descriptor without binding memory to it
7050 VkDescriptorBufferInfo buffInfo = {};
7051 buffInfo.buffer = dyub;
7052 buffInfo.offset = 0;
7053 buffInfo.range = 1024;
7054
7055 VkWriteDescriptorSet descriptor_write;
7056 memset(&descriptor_write, 0, sizeof(descriptor_write));
7057 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7058 descriptor_write.dstSet = descriptorSet;
7059 descriptor_write.dstBinding = 0;
7060 descriptor_write.descriptorCount = 1;
7061 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7062 descriptor_write.pBufferInfo = &buffInfo;
7063
7064 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7065 m_errorMonitor->VerifyFound();
7066
7067 vkDestroyBuffer(m_device->device(), dyub, NULL);
7068 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7069 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7070}
7071
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007072TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007073 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007074 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007075 ASSERT_NO_FATAL_FAILURE(InitViewport());
7076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7077
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007078 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007079 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007080 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7081 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7082 pipeline_layout_ci.pushConstantRangeCount = 1;
7083 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7084
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007085 //
7086 // Check for invalid push constant ranges in pipeline layouts.
7087 //
7088 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007089 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007090 char const *msg;
7091 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007092
Karl Schultzc81037d2016-05-12 08:11:23 -06007093 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7094 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7095 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7096 "vkCreatePipelineLayout() call has push constants index 0 with "
7097 "size 0."},
7098 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7099 "vkCreatePipelineLayout() call has push constants index 0 with "
7100 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007101 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007102 "vkCreatePipelineLayout() call has push constants index 0 with "
7103 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007104 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007105 "vkCreatePipelineLayout() call has push constants index 0 with "
7106 "size 0."},
7107 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7108 "vkCreatePipelineLayout() call has push constants index 0 with "
7109 "offset 1. Offset must"},
7110 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7111 "vkCreatePipelineLayout() call has push constants index 0 "
7112 "with offset "},
7113 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7114 "vkCreatePipelineLayout() call has push constants "
7115 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007116 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007117 "vkCreatePipelineLayout() call has push constants index 0 "
7118 "with offset "},
7119 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7120 "vkCreatePipelineLayout() call has push "
7121 "constants index 0 with offset "},
7122 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7123 "vkCreatePipelineLayout() call has push "
7124 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007125 }};
7126
7127 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007128 for (const auto &iter : range_tests) {
7129 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7131 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007132 m_errorMonitor->VerifyFound();
7133 if (VK_SUCCESS == err) {
7134 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7135 }
7136 }
7137
7138 // Check for invalid stage flag
7139 pc_range.offset = 0;
7140 pc_range.size = 16;
7141 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007142 m_errorMonitor->SetDesiredFailureMsg(
7143 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7144 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007145 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007146 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007147 if (VK_SUCCESS == err) {
7148 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7149 }
7150
Karl Schultzc59b72d2017-02-24 15:45:05 -07007151 // Check for duplicate stage flags in a list of push constant ranges.
7152 // A shader can only have one push constant block and that block is mapped
7153 // to the push constant range that has that shader's stage flag set.
7154 // The shader's stage flag can only appear once in all the ranges, so the
7155 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007156 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007157 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007158 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007159 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007160 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007161 // Overlapping ranges are OK, but a stage flag can appear only once.
7162 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7163 {
7164 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7165 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7166 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7167 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007168 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007169 {
7170 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7171 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7172 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7173 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7174 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7175 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7176 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7177 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7178 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7179 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7180 }},
7181 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7182 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7183 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7184 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7185 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7186 {
7187 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7188 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7189 }},
7190 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7191 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7192 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7193 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7194 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7195 {
7196 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7197 }},
7198 },
7199 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007200
Karl Schultzc59b72d2017-02-24 15:45:05 -07007201 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007202 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007203 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007205 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007206 m_errorMonitor->VerifyFound();
7207 if (VK_SUCCESS == err) {
7208 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7209 }
7210 }
7211
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007212 //
7213 // CmdPushConstants tests
7214 //
7215
Karl Schultzc59b72d2017-02-24 15:45:05 -07007216 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007217 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007218 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007219 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007220 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007221 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007222 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007223 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007224
7225 const uint8_t dummy_values[100] = {};
7226
7227 m_commandBuffer->BeginCommandBuffer();
7228 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007229
7230 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007231 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007233 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007234 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007235
Karl Schultzc59b72d2017-02-24 15:45:05 -07007236 m_errorMonitor->ExpectSuccess();
7237 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7238 m_errorMonitor->VerifyNotFound();
7239 m_errorMonitor->ExpectSuccess();
7240 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7241 m_errorMonitor->VerifyNotFound();
7242 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7243 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7244 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7245 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7246 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7247 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7248 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007249 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007250 for (const auto &iter : cmd_range_tests) {
7251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7252 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7253 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007254 m_errorMonitor->VerifyFound();
7255 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007256
Tony Barbour552f6c02016-12-21 14:34:07 -07007257 m_commandBuffer->EndRenderPass();
7258 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007259 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007260}
7261
Karl Schultz6addd812016-02-02 17:17:23 -07007262TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007263 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007264 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007265
Tony Barbour1fa09702017-03-16 12:09:08 -06007266 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007267 ASSERT_NO_FATAL_FAILURE(InitViewport());
7268 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7269
7270 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7271 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007272 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7273 ds_type_count[0].descriptorCount = 10;
7274 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7275 ds_type_count[1].descriptorCount = 2;
7276 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7277 ds_type_count[2].descriptorCount = 2;
7278 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7279 ds_type_count[3].descriptorCount = 5;
7280 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7281 // type
7282 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7283 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7284 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007285
7286 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007287 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7288 ds_pool_ci.pNext = NULL;
7289 ds_pool_ci.maxSets = 5;
7290 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7291 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007292
7293 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007294 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007295 ASSERT_VK_SUCCESS(err);
7296
7297 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7298 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007299 dsl_binding[0].binding = 0;
7300 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7301 dsl_binding[0].descriptorCount = 5;
7302 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7303 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007304
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007305 // Create layout identical to set0 layout but w/ different stageFlags
7306 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007307 dsl_fs_stage_only.binding = 0;
7308 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7309 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007310 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7311 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007312 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007313 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007314 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7315 ds_layout_ci.pNext = NULL;
7316 ds_layout_ci.bindingCount = 1;
7317 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007318 static const uint32_t NUM_LAYOUTS = 4;
7319 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007320 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007321 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7322 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007323 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007324 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007325 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007326 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007327 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007328 dsl_binding[0].binding = 0;
7329 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007330 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007331 dsl_binding[1].binding = 1;
7332 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7333 dsl_binding[1].descriptorCount = 2;
7334 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7335 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007336 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007337 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007338 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007339 ASSERT_VK_SUCCESS(err);
7340 dsl_binding[0].binding = 0;
7341 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007343 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007344 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007345 ASSERT_VK_SUCCESS(err);
7346 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007347 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007348 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007349 ASSERT_VK_SUCCESS(err);
7350
7351 static const uint32_t NUM_SETS = 4;
7352 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7353 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007354 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007355 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007356 alloc_info.descriptorPool = ds_pool;
7357 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007358 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007359 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007360 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007361 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007362 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007363 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007364 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007365
7366 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007367 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7368 pipeline_layout_ci.pNext = NULL;
7369 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7370 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007371
7372 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007373 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007374 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007375 // Create pipelineLayout with only one setLayout
7376 pipeline_layout_ci.setLayoutCount = 1;
7377 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007378 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007379 ASSERT_VK_SUCCESS(err);
7380 // Create pipelineLayout with 2 descriptor setLayout at index 0
7381 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7382 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007383 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007384 ASSERT_VK_SUCCESS(err);
7385 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7386 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7387 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007388 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007389 ASSERT_VK_SUCCESS(err);
7390 // Create pipelineLayout with UB type, but stageFlags for FS only
7391 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7392 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007393 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007394 ASSERT_VK_SUCCESS(err);
7395 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7396 VkDescriptorSetLayout pl_bad_s0[2] = {};
7397 pl_bad_s0[0] = ds_layout_fs_only;
7398 pl_bad_s0[1] = ds_layout[1];
7399 pipeline_layout_ci.setLayoutCount = 2;
7400 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7401 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007402 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007403 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007404
Tobin Ehlis88452832015-12-03 09:40:56 -07007405 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007406 char const *vsSource =
7407 "#version 450\n"
7408 "\n"
7409 "out gl_PerVertex {\n"
7410 " vec4 gl_Position;\n"
7411 "};\n"
7412 "void main(){\n"
7413 " gl_Position = vec4(1);\n"
7414 "}\n";
7415 char const *fsSource =
7416 "#version 450\n"
7417 "\n"
7418 "layout(location=0) out vec4 x;\n"
7419 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7420 "void main(){\n"
7421 " x = vec4(bar.y);\n"
7422 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007423 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7424 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007425 VkPipelineObj pipe(m_device);
7426 pipe.AddShader(&vs);
7427 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007428 pipe.AddColorAttachment();
7429 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007430
Tony Barbour552f6c02016-12-21 14:34:07 -07007431 m_commandBuffer->BeginCommandBuffer();
7432 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007433
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007434 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007435 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7436 // of PSO
7437 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7438 // cmd_pipeline.c
7439 // due to the fact that cmd_alloc_dset_data() has not been called in
7440 // cmd_bind_graphics_pipeline()
7441 // TODO : Want to cause various binding incompatibility issues here to test
7442 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007443 // First cause various verify_layout_compatibility() fails
7444 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007445 // verify_set_layout_compatibility fail cases:
7446 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007448 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7449 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007450 m_errorMonitor->VerifyFound();
7451
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007452 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7454 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7455 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007456 m_errorMonitor->VerifyFound();
7457
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007458 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007459 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7460 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7462 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7463 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007464 m_errorMonitor->VerifyFound();
7465
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007466 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7467 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7470 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007471 m_errorMonitor->VerifyFound();
7472
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007473 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7474 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7476 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7477 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7478 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007479 m_errorMonitor->VerifyFound();
7480
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007481 // Cause INFO messages due to disturbing previously bound Sets
7482 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007483 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7484 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007485 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7487 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7488 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007489 m_errorMonitor->VerifyFound();
7490
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007491 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7492 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007493 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7495 " newly bound as set #0 so set #1 and "
7496 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007497 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7498 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007499 m_errorMonitor->VerifyFound();
7500
Tobin Ehlis10fad692016-07-07 12:00:36 -06007501 // Now that we're done actively using the pipelineLayout that gfx pipeline
7502 // was created with, we should be able to delete it. Do that now to verify
7503 // that validation obeys pipelineLayout lifetime
7504 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7505
Tobin Ehlis88452832015-12-03 09:40:56 -07007506 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007507 // 1. Error due to not binding required set (we actually use same code as
7508 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007509 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7510 &descriptorSet[0], 0, NULL);
7511 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7512 &descriptorSet[1], 0, NULL);
7513 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 -07007514
7515 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7516 VkRect2D scissor = {{0, 0}, {16, 16}};
7517 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7518 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7519
Tobin Ehlis88452832015-12-03 09:40:56 -07007520 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007521 m_errorMonitor->VerifyFound();
7522
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007523 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007524 // 2. Error due to bound set not being compatible with PSO's
7525 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007526 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7527 &descriptorSet[0], 0, NULL);
7528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007529 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007530 m_errorMonitor->VerifyFound();
7531
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007532 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007533 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007534 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7535 }
7536 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007537 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7538 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7539}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007540
Karl Schultz6addd812016-02-02 17:17:23 -07007541TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7543 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007544
Tony Barbour1fa09702017-03-16 12:09:08 -06007545 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007546 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007547 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007548 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007549
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007550 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007551}
7552
Karl Schultz6addd812016-02-02 17:17:23 -07007553TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7554 VkResult err;
7555 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007556
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007557 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007558
Tony Barbour1fa09702017-03-16 12:09:08 -06007559 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007560
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007561 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007562 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007563 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007564 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007565 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007566 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007567
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007568 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007569 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007570
7571 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007572 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007573 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7574
7575 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007576 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007577 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007578 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 -07007579 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007580
7581 // The error should be caught by validation of the BeginCommandBuffer call
7582 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7583
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007584 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007585 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007586}
7587
Karl Schultz6addd812016-02-02 17:17:23 -07007588TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007589 // Cause error due to Begin while recording CB
7590 // Then cause 2 errors for attempting to reset CB w/o having
7591 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7592 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007594
Tony Barbour1fa09702017-03-16 12:09:08 -06007595 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007596
7597 // Calls AllocateCommandBuffers
7598 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7599
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007600 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007601 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007602 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7603 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007604 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7605 cmd_buf_info.pNext = NULL;
7606 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007607 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007608
7609 // Begin CB to transition to recording state
7610 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7611 // Can't re-begin. This should trigger error
7612 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007613 m_errorMonitor->VerifyFound();
7614
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007616 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007617 // Reset attempt will trigger error due to incorrect CommandPool state
7618 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007619 m_errorMonitor->VerifyFound();
7620
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007622 // Transition CB to RECORDED state
7623 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7624 // Now attempting to Begin will implicitly reset, which triggers error
7625 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007626 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007627}
7628
Karl Schultz6addd812016-02-02 17:17:23 -07007629TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007630 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007631 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007632
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7634 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007635
Tony Barbour1fa09702017-03-16 12:09:08 -06007636 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007638
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007639 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007640 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7641 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007642
7643 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007644 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7645 ds_pool_ci.pNext = NULL;
7646 ds_pool_ci.maxSets = 1;
7647 ds_pool_ci.poolSizeCount = 1;
7648 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007649
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007650 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007651 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007652 ASSERT_VK_SUCCESS(err);
7653
Tony Barboureb254902015-07-15 12:50:33 -06007654 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007655 dsl_binding.binding = 0;
7656 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7657 dsl_binding.descriptorCount = 1;
7658 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7659 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007660
Tony Barboureb254902015-07-15 12:50:33 -06007661 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007662 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7663 ds_layout_ci.pNext = NULL;
7664 ds_layout_ci.bindingCount = 1;
7665 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007666
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007667 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007668 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007669 ASSERT_VK_SUCCESS(err);
7670
7671 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007672 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007673 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007674 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007675 alloc_info.descriptorPool = ds_pool;
7676 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007677 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007678 ASSERT_VK_SUCCESS(err);
7679
Tony Barboureb254902015-07-15 12:50:33 -06007680 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007681 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7682 pipeline_layout_ci.setLayoutCount = 1;
7683 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007684
7685 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007686 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007687 ASSERT_VK_SUCCESS(err);
7688
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007689 VkViewport vp = {}; // Just need dummy vp to point to
7690 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007691
7692 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007693 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7694 vp_state_ci.scissorCount = 1;
7695 vp_state_ci.pScissors = &sc;
7696 vp_state_ci.viewportCount = 1;
7697 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007698
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007699 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7700 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7701 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7702 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7703 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7704 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007705 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007706 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007707 rs_state_ci.lineWidth = 1.0f;
7708
7709 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7710 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7711 vi_ci.pNext = nullptr;
7712 vi_ci.vertexBindingDescriptionCount = 0;
7713 vi_ci.pVertexBindingDescriptions = nullptr;
7714 vi_ci.vertexAttributeDescriptionCount = 0;
7715 vi_ci.pVertexAttributeDescriptions = nullptr;
7716
7717 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7718 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7719 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7720
7721 VkPipelineShaderStageCreateInfo shaderStages[2];
7722 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7723
7724 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7725 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007726 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007727 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007728
Tony Barboureb254902015-07-15 12:50:33 -06007729 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007730 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7731 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007732 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007733 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7734 gp_ci.layout = pipeline_layout;
7735 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007736 gp_ci.pVertexInputState = &vi_ci;
7737 gp_ci.pInputAssemblyState = &ia_ci;
7738
7739 gp_ci.stageCount = 1;
7740 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007741
7742 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007743 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7744 pc_ci.initialDataSize = 0;
7745 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007746
7747 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007748 VkPipelineCache pipelineCache;
7749
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007750 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007751 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007752 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007753 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007754
Chia-I Wuf7458c52015-10-26 21:10:41 +08007755 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7756 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7757 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7758 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007759}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007760
Tobin Ehlis912df022015-09-17 08:46:18 -06007761/*// TODO : This test should be good, but needs Tess support in compiler to run
7762TEST_F(VkLayerTest, InvalidPatchControlPoints)
7763{
7764 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007765 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007766
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007768 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7769primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007770
Tony Barbour1fa09702017-03-16 12:09:08 -06007771 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007773
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007774 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007775 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007776 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007777
7778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7780 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007781 ds_pool_ci.poolSizeCount = 1;
7782 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007783
7784 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007785 err = vkCreateDescriptorPool(m_device->device(),
7786VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007787 ASSERT_VK_SUCCESS(err);
7788
7789 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007790 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007791 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007792 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007793 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7794 dsl_binding.pImmutableSamplers = NULL;
7795
7796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007797 ds_layout_ci.sType =
7798VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007799 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007800 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007801 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007802
7803 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007804 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7805&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007806 ASSERT_VK_SUCCESS(err);
7807
7808 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007809 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7810VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007811 ASSERT_VK_SUCCESS(err);
7812
7813 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007814 pipeline_layout_ci.sType =
7815VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007816 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007817 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007818 pipeline_layout_ci.pSetLayouts = &ds_layout;
7819
7820 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007821 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7822&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007823 ASSERT_VK_SUCCESS(err);
7824
7825 VkPipelineShaderStageCreateInfo shaderStages[3];
7826 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7827
Karl Schultz6addd812016-02-02 17:17:23 -07007828 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7829this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007830 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007831 VkShaderObj
7832tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7833this);
7834 VkShaderObj
7835te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7836this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007837
Karl Schultz6addd812016-02-02 17:17:23 -07007838 shaderStages[0].sType =
7839VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007840 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007841 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007842 shaderStages[1].sType =
7843VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007844 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007845 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007846 shaderStages[2].sType =
7847VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007848 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007849 shaderStages[2].shader = te.handle();
7850
7851 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007852 iaCI.sType =
7853VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007854 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007855
7856 VkPipelineTessellationStateCreateInfo tsCI = {};
7857 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7858 tsCI.patchControlPoints = 0; // This will cause an error
7859
7860 VkGraphicsPipelineCreateInfo gp_ci = {};
7861 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7862 gp_ci.pNext = NULL;
7863 gp_ci.stageCount = 3;
7864 gp_ci.pStages = shaderStages;
7865 gp_ci.pVertexInputState = NULL;
7866 gp_ci.pInputAssemblyState = &iaCI;
7867 gp_ci.pTessellationState = &tsCI;
7868 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007869 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007870 gp_ci.pMultisampleState = NULL;
7871 gp_ci.pDepthStencilState = NULL;
7872 gp_ci.pColorBlendState = NULL;
7873 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7874 gp_ci.layout = pipeline_layout;
7875 gp_ci.renderPass = renderPass();
7876
7877 VkPipelineCacheCreateInfo pc_ci = {};
7878 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7879 pc_ci.pNext = NULL;
7880 pc_ci.initialSize = 0;
7881 pc_ci.initialData = 0;
7882 pc_ci.maxSize = 0;
7883
7884 VkPipeline pipeline;
7885 VkPipelineCache pipelineCache;
7886
Karl Schultz6addd812016-02-02 17:17:23 -07007887 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7888&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007889 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007890 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7891&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007892
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007893 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007894
Chia-I Wuf7458c52015-10-26 21:10:41 +08007895 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7896 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7897 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7898 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007899}
7900*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007901
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007902TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007903 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007904
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007905 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007906
Tony Barbour1fa09702017-03-16 12:09:08 -06007907 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007909
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007910 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007911 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7912 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007913
7914 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007915 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7916 ds_pool_ci.maxSets = 1;
7917 ds_pool_ci.poolSizeCount = 1;
7918 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007919
7920 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007921 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007922 ASSERT_VK_SUCCESS(err);
7923
7924 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007925 dsl_binding.binding = 0;
7926 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7927 dsl_binding.descriptorCount = 1;
7928 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007929
7930 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007931 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7932 ds_layout_ci.bindingCount = 1;
7933 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007934
7935 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007936 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007937 ASSERT_VK_SUCCESS(err);
7938
7939 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007940 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007941 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007942 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007943 alloc_info.descriptorPool = ds_pool;
7944 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007945 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946 ASSERT_VK_SUCCESS(err);
7947
7948 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007949 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7950 pipeline_layout_ci.setLayoutCount = 1;
7951 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007952
7953 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007954 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007955 ASSERT_VK_SUCCESS(err);
7956
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007957 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007958 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007959 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007960 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007961 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007962 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007963
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007964 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7965 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7966 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7967 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7968 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7969 rs_state_ci.depthClampEnable = VK_FALSE;
7970 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7971 rs_state_ci.depthBiasEnable = VK_FALSE;
7972
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007973 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7974 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7975 vi_ci.pNext = nullptr;
7976 vi_ci.vertexBindingDescriptionCount = 0;
7977 vi_ci.pVertexBindingDescriptions = nullptr;
7978 vi_ci.vertexAttributeDescriptionCount = 0;
7979 vi_ci.pVertexAttributeDescriptions = nullptr;
7980
7981 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7982 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7983 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7984
7985 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7986 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7987 pipe_ms_state_ci.pNext = NULL;
7988 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7989 pipe_ms_state_ci.sampleShadingEnable = 0;
7990 pipe_ms_state_ci.minSampleShading = 1.0;
7991 pipe_ms_state_ci.pSampleMask = NULL;
7992
Cody Northropeb3a6c12015-10-05 14:44:45 -06007993 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007994 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007995
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007996 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007997 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007998 shaderStages[0] = vs.GetStageCreateInfo();
7999 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008000
8001 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008002 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8003 gp_ci.stageCount = 2;
8004 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008005 gp_ci.pVertexInputState = &vi_ci;
8006 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008007 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07008008 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008009 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008010 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8011 gp_ci.layout = pipeline_layout;
8012 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008013
8014 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008015 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008016
8017 VkPipeline pipeline;
8018 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008019 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008020 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008021
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008022 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008023 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008024
8025 // Check case where multiViewport is disabled and viewport count is not 1
8026 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8029 vp_state_ci.scissorCount = 0;
8030 vp_state_ci.viewportCount = 0;
8031 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8032 m_errorMonitor->VerifyFound();
8033 } else {
8034 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008035 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008036 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008037 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008038
8039 // Check is that viewportcount and scissorcount match
8040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8041 vp_state_ci.scissorCount = 1;
8042 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8043 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8044 m_errorMonitor->VerifyFound();
8045
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008046 // Check case where multiViewport is enabled and viewport count is greater than max
8047 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8050 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8051 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8052 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8053 m_errorMonitor->VerifyFound();
8054 }
8055 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008056
Chia-I Wuf7458c52015-10-26 21:10:41 +08008057 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8058 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8060 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008061}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008062
8063// 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
8064// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008065TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008066 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008067
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008068 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8069
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008071
Tony Barbour1fa09702017-03-16 12:09:08 -06008072 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008074
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008075 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008076 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8077 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008078
8079 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008080 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8081 ds_pool_ci.maxSets = 1;
8082 ds_pool_ci.poolSizeCount = 1;
8083 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008084
8085 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008086 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008087 ASSERT_VK_SUCCESS(err);
8088
8089 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008090 dsl_binding.binding = 0;
8091 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8092 dsl_binding.descriptorCount = 1;
8093 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008094
8095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8097 ds_layout_ci.bindingCount = 1;
8098 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008099
8100 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008102 ASSERT_VK_SUCCESS(err);
8103
8104 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008105 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008106 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008107 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008108 alloc_info.descriptorPool = ds_pool;
8109 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008110 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008111 ASSERT_VK_SUCCESS(err);
8112
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008113 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8114 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8115 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8116
8117 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8118 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8119 vi_ci.pNext = nullptr;
8120 vi_ci.vertexBindingDescriptionCount = 0;
8121 vi_ci.pVertexBindingDescriptions = nullptr;
8122 vi_ci.vertexAttributeDescriptionCount = 0;
8123 vi_ci.pVertexAttributeDescriptions = nullptr;
8124
8125 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8126 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8127 pipe_ms_state_ci.pNext = NULL;
8128 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8129 pipe_ms_state_ci.sampleShadingEnable = 0;
8130 pipe_ms_state_ci.minSampleShading = 1.0;
8131 pipe_ms_state_ci.pSampleMask = NULL;
8132
Tobin Ehlise68360f2015-10-01 11:15:13 -06008133 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008134 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8135 pipeline_layout_ci.setLayoutCount = 1;
8136 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008137
8138 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008139 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008140 ASSERT_VK_SUCCESS(err);
8141
8142 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8143 // Set scissor as dynamic to avoid second error
8144 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008145 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8146 dyn_state_ci.dynamicStateCount = 1;
8147 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008148
Cody Northropeb3a6c12015-10-05 14:44:45 -06008149 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008150 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008152 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008153 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8154 // 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 +08008155 shaderStages[0] = vs.GetStageCreateInfo();
8156 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008157
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008158 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8159 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8160 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8161 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8162 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8163 rs_state_ci.depthClampEnable = VK_FALSE;
8164 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8165 rs_state_ci.depthBiasEnable = VK_FALSE;
8166
Tobin Ehlise68360f2015-10-01 11:15:13 -06008167 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008168 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8169 gp_ci.stageCount = 2;
8170 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008171 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008172 // Not setting VP state w/o dynamic vp state should cause validation error
8173 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008174 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008175 gp_ci.pVertexInputState = &vi_ci;
8176 gp_ci.pInputAssemblyState = &ia_ci;
8177 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008178 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8179 gp_ci.layout = pipeline_layout;
8180 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008181
8182 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008183 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008184
8185 VkPipeline pipeline;
8186 VkPipelineCache pipelineCache;
8187
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008188 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008189 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008190 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008191
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008192 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008193
Chia-I Wuf7458c52015-10-26 21:10:41 +08008194 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8195 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8196 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8197 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008198}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008199
8200// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8201// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008202TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8203 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008204
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008206
Tony Barbour1fa09702017-03-16 12:09:08 -06008207 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008208
8209 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008210 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008211 return;
8212 }
8213
Tobin Ehlise68360f2015-10-01 11:15:13 -06008214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008215
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008216 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008217 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8218 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008219
8220 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008221 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8222 ds_pool_ci.maxSets = 1;
8223 ds_pool_ci.poolSizeCount = 1;
8224 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008225
8226 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008227 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008228 ASSERT_VK_SUCCESS(err);
8229
8230 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008231 dsl_binding.binding = 0;
8232 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8233 dsl_binding.descriptorCount = 1;
8234 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008235
8236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8238 ds_layout_ci.bindingCount = 1;
8239 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008240
8241 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008242 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008243 ASSERT_VK_SUCCESS(err);
8244
8245 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008246 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008247 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008248 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008249 alloc_info.descriptorPool = ds_pool;
8250 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008251 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008252 ASSERT_VK_SUCCESS(err);
8253
8254 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008255 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8256 pipeline_layout_ci.setLayoutCount = 1;
8257 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008258
8259 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008260 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008261 ASSERT_VK_SUCCESS(err);
8262
8263 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008264 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8265 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008266 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008267 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008268 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008269
8270 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8271 // Set scissor as dynamic to avoid that error
8272 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008273 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8274 dyn_state_ci.dynamicStateCount = 1;
8275 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008276
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008277 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8278 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8279 pipe_ms_state_ci.pNext = NULL;
8280 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8281 pipe_ms_state_ci.sampleShadingEnable = 0;
8282 pipe_ms_state_ci.minSampleShading = 1.0;
8283 pipe_ms_state_ci.pSampleMask = NULL;
8284
Cody Northropeb3a6c12015-10-05 14:44:45 -06008285 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008286 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008288 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008289 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8290 // 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 +08008291 shaderStages[0] = vs.GetStageCreateInfo();
8292 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008293
Cody Northropf6622dc2015-10-06 10:33:21 -06008294 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8295 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8296 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008297 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008298 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008299 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008300 vi_ci.pVertexAttributeDescriptions = nullptr;
8301
8302 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8303 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8304 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8305
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008306 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008307 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008308 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008309 rs_ci.pNext = nullptr;
8310
Mark Youngc89c6312016-03-31 16:03:20 -06008311 VkPipelineColorBlendAttachmentState att = {};
8312 att.blendEnable = VK_FALSE;
8313 att.colorWriteMask = 0xf;
8314
Cody Northropf6622dc2015-10-06 10:33:21 -06008315 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8316 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8317 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008318 cb_ci.attachmentCount = 1;
8319 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008320
Tobin Ehlise68360f2015-10-01 11:15:13 -06008321 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008322 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8323 gp_ci.stageCount = 2;
8324 gp_ci.pStages = shaderStages;
8325 gp_ci.pVertexInputState = &vi_ci;
8326 gp_ci.pInputAssemblyState = &ia_ci;
8327 gp_ci.pViewportState = &vp_state_ci;
8328 gp_ci.pRasterizationState = &rs_ci;
8329 gp_ci.pColorBlendState = &cb_ci;
8330 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008331 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008332 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8333 gp_ci.layout = pipeline_layout;
8334 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008335
8336 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008337 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008338
8339 VkPipeline pipeline;
8340 VkPipelineCache pipelineCache;
8341
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008342 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008343 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008344 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008345
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008346 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008347
Tobin Ehlisd332f282015-10-02 11:00:56 -06008348 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008349 // First need to successfully create the PSO from above by setting
8350 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008351 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 -07008352
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008353 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008354 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008355 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008356 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008357 m_commandBuffer->BeginCommandBuffer();
8358 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008359 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008360 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008361 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008362 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008363 Draw(1, 0, 0, 0);
8364
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008365 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008366
8367 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8368 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8370 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008371 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008372}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008373
8374// 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 -07008375// viewportCount
8376TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8377 VkResult err;
8378
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008380
Tony Barbour1fa09702017-03-16 12:09:08 -06008381 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008382
8383 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008384 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008385 return;
8386 }
8387
Karl Schultz6addd812016-02-02 17:17:23 -07008388 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8389
8390 VkDescriptorPoolSize ds_type_count = {};
8391 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8392 ds_type_count.descriptorCount = 1;
8393
8394 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8395 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8396 ds_pool_ci.maxSets = 1;
8397 ds_pool_ci.poolSizeCount = 1;
8398 ds_pool_ci.pPoolSizes = &ds_type_count;
8399
8400 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008401 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008402 ASSERT_VK_SUCCESS(err);
8403
8404 VkDescriptorSetLayoutBinding dsl_binding = {};
8405 dsl_binding.binding = 0;
8406 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8407 dsl_binding.descriptorCount = 1;
8408 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8409
8410 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8411 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8412 ds_layout_ci.bindingCount = 1;
8413 ds_layout_ci.pBindings = &dsl_binding;
8414
8415 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008416 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008417 ASSERT_VK_SUCCESS(err);
8418
8419 VkDescriptorSet descriptorSet;
8420 VkDescriptorSetAllocateInfo alloc_info = {};
8421 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8422 alloc_info.descriptorSetCount = 1;
8423 alloc_info.descriptorPool = ds_pool;
8424 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008425 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008426 ASSERT_VK_SUCCESS(err);
8427
8428 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8429 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8430 pipeline_layout_ci.setLayoutCount = 1;
8431 pipeline_layout_ci.pSetLayouts = &ds_layout;
8432
8433 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008434 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008435 ASSERT_VK_SUCCESS(err);
8436
8437 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8438 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8439 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008440 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008441 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008442 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008443
8444 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8445 // Set scissor as dynamic to avoid that error
8446 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8447 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8448 dyn_state_ci.dynamicStateCount = 1;
8449 dyn_state_ci.pDynamicStates = &vp_state;
8450
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008451 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8452 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8453 pipe_ms_state_ci.pNext = NULL;
8454 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8455 pipe_ms_state_ci.sampleShadingEnable = 0;
8456 pipe_ms_state_ci.minSampleShading = 1.0;
8457 pipe_ms_state_ci.pSampleMask = NULL;
8458
Karl Schultz6addd812016-02-02 17:17:23 -07008459 VkPipelineShaderStageCreateInfo shaderStages[2];
8460 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8461
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008462 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008463 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8464 // 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 -07008465 shaderStages[0] = vs.GetStageCreateInfo();
8466 shaderStages[1] = fs.GetStageCreateInfo();
8467
8468 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8469 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8470 vi_ci.pNext = nullptr;
8471 vi_ci.vertexBindingDescriptionCount = 0;
8472 vi_ci.pVertexBindingDescriptions = nullptr;
8473 vi_ci.vertexAttributeDescriptionCount = 0;
8474 vi_ci.pVertexAttributeDescriptions = nullptr;
8475
8476 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8477 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8478 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8479
8480 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8481 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008482 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008483 rs_ci.pNext = nullptr;
8484
Mark Youngc89c6312016-03-31 16:03:20 -06008485 VkPipelineColorBlendAttachmentState att = {};
8486 att.blendEnable = VK_FALSE;
8487 att.colorWriteMask = 0xf;
8488
Karl Schultz6addd812016-02-02 17:17:23 -07008489 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8490 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8491 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008492 cb_ci.attachmentCount = 1;
8493 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008494
8495 VkGraphicsPipelineCreateInfo gp_ci = {};
8496 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8497 gp_ci.stageCount = 2;
8498 gp_ci.pStages = shaderStages;
8499 gp_ci.pVertexInputState = &vi_ci;
8500 gp_ci.pInputAssemblyState = &ia_ci;
8501 gp_ci.pViewportState = &vp_state_ci;
8502 gp_ci.pRasterizationState = &rs_ci;
8503 gp_ci.pColorBlendState = &cb_ci;
8504 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008505 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008506 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8507 gp_ci.layout = pipeline_layout;
8508 gp_ci.renderPass = renderPass();
8509
8510 VkPipelineCacheCreateInfo pc_ci = {};
8511 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8512
8513 VkPipeline pipeline;
8514 VkPipelineCache pipelineCache;
8515
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008516 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008517 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008520 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008521
8522 // Now hit second fail case where we set scissor w/ different count than PSO
8523 // First need to successfully create the PSO from above by setting
8524 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8526 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008527
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008528 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008529 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008530 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008531 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008532 m_commandBuffer->BeginCommandBuffer();
8533 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008534 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008535 VkViewport viewports[1] = {};
8536 viewports[0].width = 8;
8537 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008538 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008539 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008540 Draw(1, 0, 0, 0);
8541
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008542 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008543
Chia-I Wuf7458c52015-10-26 21:10:41 +08008544 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8545 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8546 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008548 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008549}
8550
Mark Young7394fdd2016-03-31 14:56:43 -06008551TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8552 VkResult err;
8553
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008555
Tony Barbour1fa09702017-03-16 12:09:08 -06008556 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8558
8559 VkDescriptorPoolSize ds_type_count = {};
8560 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8561 ds_type_count.descriptorCount = 1;
8562
8563 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8564 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8565 ds_pool_ci.maxSets = 1;
8566 ds_pool_ci.poolSizeCount = 1;
8567 ds_pool_ci.pPoolSizes = &ds_type_count;
8568
8569 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008570 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008571 ASSERT_VK_SUCCESS(err);
8572
8573 VkDescriptorSetLayoutBinding dsl_binding = {};
8574 dsl_binding.binding = 0;
8575 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8576 dsl_binding.descriptorCount = 1;
8577 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8578
8579 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8580 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8581 ds_layout_ci.bindingCount = 1;
8582 ds_layout_ci.pBindings = &dsl_binding;
8583
8584 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008585 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008586 ASSERT_VK_SUCCESS(err);
8587
8588 VkDescriptorSet descriptorSet;
8589 VkDescriptorSetAllocateInfo alloc_info = {};
8590 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8591 alloc_info.descriptorSetCount = 1;
8592 alloc_info.descriptorPool = ds_pool;
8593 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008594 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008595 ASSERT_VK_SUCCESS(err);
8596
8597 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8598 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8599 pipeline_layout_ci.setLayoutCount = 1;
8600 pipeline_layout_ci.pSetLayouts = &ds_layout;
8601
8602 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008603 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008604 ASSERT_VK_SUCCESS(err);
8605
8606 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8607 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8608 vp_state_ci.scissorCount = 1;
8609 vp_state_ci.pScissors = NULL;
8610 vp_state_ci.viewportCount = 1;
8611 vp_state_ci.pViewports = NULL;
8612
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008613 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008614 // Set scissor as dynamic to avoid that error
8615 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8616 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8617 dyn_state_ci.dynamicStateCount = 2;
8618 dyn_state_ci.pDynamicStates = dynamic_states;
8619
8620 VkPipelineShaderStageCreateInfo shaderStages[2];
8621 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8622
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008623 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8624 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008625 this); // TODO - We shouldn't need a fragment shader
8626 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008627 shaderStages[0] = vs.GetStageCreateInfo();
8628 shaderStages[1] = fs.GetStageCreateInfo();
8629
8630 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8631 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8632 vi_ci.pNext = nullptr;
8633 vi_ci.vertexBindingDescriptionCount = 0;
8634 vi_ci.pVertexBindingDescriptions = nullptr;
8635 vi_ci.vertexAttributeDescriptionCount = 0;
8636 vi_ci.pVertexAttributeDescriptions = nullptr;
8637
8638 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8639 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8640 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8641
8642 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8643 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8644 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008645 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008646
Mark Young47107952016-05-02 15:59:55 -06008647 // Check too low (line width of -1.0f).
8648 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008649
8650 VkPipelineColorBlendAttachmentState att = {};
8651 att.blendEnable = VK_FALSE;
8652 att.colorWriteMask = 0xf;
8653
8654 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8655 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8656 cb_ci.pNext = nullptr;
8657 cb_ci.attachmentCount = 1;
8658 cb_ci.pAttachments = &att;
8659
8660 VkGraphicsPipelineCreateInfo gp_ci = {};
8661 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8662 gp_ci.stageCount = 2;
8663 gp_ci.pStages = shaderStages;
8664 gp_ci.pVertexInputState = &vi_ci;
8665 gp_ci.pInputAssemblyState = &ia_ci;
8666 gp_ci.pViewportState = &vp_state_ci;
8667 gp_ci.pRasterizationState = &rs_ci;
8668 gp_ci.pColorBlendState = &cb_ci;
8669 gp_ci.pDynamicState = &dyn_state_ci;
8670 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8671 gp_ci.layout = pipeline_layout;
8672 gp_ci.renderPass = renderPass();
8673
8674 VkPipelineCacheCreateInfo pc_ci = {};
8675 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8676
8677 VkPipeline pipeline;
8678 VkPipelineCache pipelineCache;
8679
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008680 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008681 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008682 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008683
8684 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008685 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008686
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008688
8689 // Check too high (line width of 65536.0f).
8690 rs_ci.lineWidth = 65536.0f;
8691
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008692 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008693 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008694 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008695
8696 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008697 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008698
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008700
8701 dyn_state_ci.dynamicStateCount = 3;
8702
8703 rs_ci.lineWidth = 1.0f;
8704
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008705 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008706 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008707 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008708 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008709 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008710
8711 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008712 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008713 m_errorMonitor->VerifyFound();
8714
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008716
8717 // Check too high with dynamic setting.
8718 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8719 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008720 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008721
8722 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8723 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8724 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8725 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008726 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008727}
8728
Karl Schultz6addd812016-02-02 17:17:23 -07008729TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008730 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008732 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008733
Tony Barbour1fa09702017-03-16 12:09:08 -06008734 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008735 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008736
Tony Barbour552f6c02016-12-21 14:34:07 -07008737 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008738 // Don't care about RenderPass handle b/c error should be flagged before
8739 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008740 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008741
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008742 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008743}
8744
Karl Schultz6addd812016-02-02 17:17:23 -07008745TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008746 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8748 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008749
Tony Barbour1fa09702017-03-16 12:09:08 -06008750 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008751 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008752
Tony Barbour552f6c02016-12-21 14:34:07 -07008753 m_commandBuffer->BeginCommandBuffer();
8754 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008755 // Just create a dummy Renderpass that's non-NULL so we can get to the
8756 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008757 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008758
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008759 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008760}
8761
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008762TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008763 TEST_DESCRIPTION(
8764 "Begin a renderPass where clearValueCount is less than"
8765 "the number of renderPass attachments that use loadOp"
8766 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008767
Tony Barbour1fa09702017-03-16 12:09:08 -06008768 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008769 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8770
8771 // Create a renderPass with a single attachment that uses loadOp CLEAR
8772 VkAttachmentReference attach = {};
8773 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8774 VkSubpassDescription subpass = {};
8775 subpass.inputAttachmentCount = 1;
8776 subpass.pInputAttachments = &attach;
8777 VkRenderPassCreateInfo rpci = {};
8778 rpci.subpassCount = 1;
8779 rpci.pSubpasses = &subpass;
8780 rpci.attachmentCount = 1;
8781 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008782 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008783 // Set loadOp to CLEAR
8784 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8785 rpci.pAttachments = &attach_desc;
8786 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8787 VkRenderPass rp;
8788 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8789
8790 VkCommandBufferInheritanceInfo hinfo = {};
8791 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8792 hinfo.renderPass = VK_NULL_HANDLE;
8793 hinfo.subpass = 0;
8794 hinfo.framebuffer = VK_NULL_HANDLE;
8795 hinfo.occlusionQueryEnable = VK_FALSE;
8796 hinfo.queryFlags = 0;
8797 hinfo.pipelineStatistics = 0;
8798 VkCommandBufferBeginInfo info = {};
8799 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8800 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8801 info.pInheritanceInfo = &hinfo;
8802
8803 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8804 VkRenderPassBeginInfo rp_begin = {};
8805 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8806 rp_begin.pNext = NULL;
8807 rp_begin.renderPass = renderPass();
8808 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008809 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008810
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008812
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008813 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008814
8815 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008816
8817 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008818}
8819
Slawomir Cygan0808f392016-11-28 17:53:23 +01008820TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008821 TEST_DESCRIPTION(
8822 "Begin a renderPass where clearValueCount is greater than"
8823 "the number of renderPass attachments that use loadOp"
8824 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008825
Tony Barbour1fa09702017-03-16 12:09:08 -06008826 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008827 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8828
8829 // Create a renderPass with a single attachment that uses loadOp CLEAR
8830 VkAttachmentReference attach = {};
8831 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8832 VkSubpassDescription subpass = {};
8833 subpass.inputAttachmentCount = 1;
8834 subpass.pInputAttachments = &attach;
8835 VkRenderPassCreateInfo rpci = {};
8836 rpci.subpassCount = 1;
8837 rpci.pSubpasses = &subpass;
8838 rpci.attachmentCount = 1;
8839 VkAttachmentDescription attach_desc = {};
8840 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8841 // Set loadOp to CLEAR
8842 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8843 rpci.pAttachments = &attach_desc;
8844 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8845 VkRenderPass rp;
8846 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8847
8848 VkCommandBufferBeginInfo info = {};
8849 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8850 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8851
8852 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8853 VkRenderPassBeginInfo rp_begin = {};
8854 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8855 rp_begin.pNext = NULL;
8856 rp_begin.renderPass = renderPass();
8857 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008858 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008859
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8861 " has a clearValueCount of"
8862 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008863
8864 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8865
8866 m_errorMonitor->VerifyFound();
8867
8868 vkDestroyRenderPass(m_device->device(), rp, NULL);
8869}
8870
Cody Northrop3bb4d962016-05-09 16:15:57 -06008871TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008872 TEST_DESCRIPTION("End a command buffer with an active render pass");
8873
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8875 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008876
Tony Barbour1fa09702017-03-16 12:09:08 -06008877 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008878 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8879
Tony Barbour552f6c02016-12-21 14:34:07 -07008880 m_commandBuffer->BeginCommandBuffer();
8881 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8882 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008883
8884 m_errorMonitor->VerifyFound();
8885
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008886 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8887 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008888}
8889
Karl Schultz6addd812016-02-02 17:17:23 -07008890TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008891 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8893 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008894
Tony Barbour1fa09702017-03-16 12:09:08 -06008895 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008897
Tony Barbour552f6c02016-12-21 14:34:07 -07008898 m_commandBuffer->BeginCommandBuffer();
8899 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008900
8901 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008902 vk_testing::Buffer dstBuffer;
8903 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008904
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008905 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008906
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008907 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008908}
8909
Karl Schultz6addd812016-02-02 17:17:23 -07008910TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008911 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8913 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008914
Tony Barbour1fa09702017-03-16 12:09:08 -06008915 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008917
Tony Barbour552f6c02016-12-21 14:34:07 -07008918 m_commandBuffer->BeginCommandBuffer();
8919 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008920
8921 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008922 vk_testing::Buffer dstBuffer;
8923 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008924
Karl Schultz6addd812016-02-02 17:17:23 -07008925 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008926 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8927 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8928 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008929
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008930 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008931}
8932
Karl Schultz6addd812016-02-02 17:17:23 -07008933TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008934 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8936 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008937
Tony Barbour1fa09702017-03-16 12:09:08 -06008938 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008940
Tony Barbour552f6c02016-12-21 14:34:07 -07008941 m_commandBuffer->BeginCommandBuffer();
8942 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008943
Michael Lentine0a369f62016-02-03 16:51:46 -06008944 VkClearColorValue clear_color;
8945 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008946 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8947 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8948 const int32_t tex_width = 32;
8949 const int32_t tex_height = 32;
8950 VkImageCreateInfo image_create_info = {};
8951 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8952 image_create_info.pNext = NULL;
8953 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8954 image_create_info.format = tex_format;
8955 image_create_info.extent.width = tex_width;
8956 image_create_info.extent.height = tex_height;
8957 image_create_info.extent.depth = 1;
8958 image_create_info.mipLevels = 1;
8959 image_create_info.arrayLayers = 1;
8960 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8961 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008962 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008963
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008964 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008965 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008966
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008967 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008968
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008969 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008970
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008971 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008972}
8973
Karl Schultz6addd812016-02-02 17:17:23 -07008974TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008975 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8977 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008978
Tony Barbour1fa09702017-03-16 12:09:08 -06008979 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008981
Dave Houlton1d2022c2017-03-29 11:43:58 -06008982 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008983 if (!depth_format) {
8984 printf(" No Depth + Stencil format found. Skipped.\n");
8985 return;
8986 }
8987
Tony Barbour552f6c02016-12-21 14:34:07 -07008988 m_commandBuffer->BeginCommandBuffer();
8989 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008990
8991 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008992 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008993 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8994 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008995 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008996 image_create_info.extent.width = 64;
8997 image_create_info.extent.height = 64;
8998 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8999 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009000
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009001 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009002 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009004 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009005
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009006 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
9007 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009008
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009009 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009010}
9011
Karl Schultz6addd812016-02-02 17:17:23 -07009012TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009013 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009014 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009015
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9017 "vkCmdClearAttachments(): This call "
9018 "must be issued inside an active "
9019 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009020
Tony Barbour1fa09702017-03-16 12:09:08 -06009021 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009022 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009023
9024 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009025 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009026 ASSERT_VK_SUCCESS(err);
9027
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009028 VkClearAttachment color_attachment;
9029 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9030 color_attachment.clearValue.color.float32[0] = 0;
9031 color_attachment.clearValue.color.float32[1] = 0;
9032 color_attachment.clearValue.color.float32[2] = 0;
9033 color_attachment.clearValue.color.float32[3] = 0;
9034 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009035 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009036 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009037
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009038 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009039}
9040
Chris Forbes3b97e932016-09-07 11:29:24 +12009041TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009042 TEST_DESCRIPTION(
9043 "Test that an error is produced when CmdNextSubpass is "
9044 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009045
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9047 "vkCmdNextSubpass(): Attempted to advance "
9048 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009049
Tony Barbour1fa09702017-03-16 12:09:08 -06009050 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009051 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9052
Tony Barbour552f6c02016-12-21 14:34:07 -07009053 m_commandBuffer->BeginCommandBuffer();
9054 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009055
9056 // error here.
9057 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9058 m_errorMonitor->VerifyFound();
9059
Tony Barbour552f6c02016-12-21 14:34:07 -07009060 m_commandBuffer->EndRenderPass();
9061 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009062}
9063
Chris Forbes6d624702016-09-07 13:57:05 +12009064TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009065 TEST_DESCRIPTION(
9066 "Test that an error is produced when CmdEndRenderPass is "
9067 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009068
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9070 "vkCmdEndRenderPass(): Called before reaching "
9071 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009072
Tony Barbour1fa09702017-03-16 12:09:08 -06009073 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009074 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9075 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009076
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009077 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009078
9079 VkRenderPass rp;
9080 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9081 ASSERT_VK_SUCCESS(err);
9082
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009083 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009084
9085 VkFramebuffer fb;
9086 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9087 ASSERT_VK_SUCCESS(err);
9088
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009089 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009090
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009091 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 +12009092
9093 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9094
9095 // Error here.
9096 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9097 m_errorMonitor->VerifyFound();
9098
9099 // Clean up.
9100 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9101 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9102}
9103
Karl Schultz9e66a292016-04-21 15:57:51 -06009104TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9105 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9107 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009108
Tony Barbour1fa09702017-03-16 12:09:08 -06009109 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009110 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009111
9112 VkBufferMemoryBarrier buf_barrier = {};
9113 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9114 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9115 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9116 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9117 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9118 buf_barrier.buffer = VK_NULL_HANDLE;
9119 buf_barrier.offset = 0;
9120 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009121 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9122 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009123
9124 m_errorMonitor->VerifyFound();
9125}
9126
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009127TEST_F(VkLayerTest, InvalidBarriers) {
9128 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9129
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009131
Tony Barbour1fa09702017-03-16 12:09:08 -06009132 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009133 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009134 if (!depth_format) {
9135 printf(" No Depth + Stencil format found. Skipped.\n");
9136 return;
9137 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009138 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9139
9140 VkMemoryBarrier mem_barrier = {};
9141 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9142 mem_barrier.pNext = NULL;
9143 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9144 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009145 m_commandBuffer->BeginCommandBuffer();
9146 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009147 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009148 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009149 &mem_barrier, 0, nullptr, 0, nullptr);
9150 m_errorMonitor->VerifyFound();
9151
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009153 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009154 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 -06009155 ASSERT_TRUE(image.initialized());
9156 VkImageMemoryBarrier img_barrier = {};
9157 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9158 img_barrier.pNext = NULL;
9159 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9160 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9161 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9162 // New layout can't be UNDEFINED
9163 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9164 img_barrier.image = image.handle();
9165 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9166 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9167 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9168 img_barrier.subresourceRange.baseArrayLayer = 0;
9169 img_barrier.subresourceRange.baseMipLevel = 0;
9170 img_barrier.subresourceRange.layerCount = 1;
9171 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009172 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9173 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009174 m_errorMonitor->VerifyFound();
9175 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9176
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9178 "Subresource must have the sum of the "
9179 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009180 // baseArrayLayer + layerCount must be <= image's arrayLayers
9181 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009182 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9183 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009184 m_errorMonitor->VerifyFound();
9185 img_barrier.subresourceRange.baseArrayLayer = 0;
9186
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009188 // baseMipLevel + levelCount must be <= image's mipLevels
9189 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009190 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9191 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009192 m_errorMonitor->VerifyFound();
9193 img_barrier.subresourceRange.baseMipLevel = 0;
9194
Mike Weiblen7053aa32017-01-25 15:21:10 -07009195 // levelCount must be non-zero.
9196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9197 img_barrier.subresourceRange.levelCount = 0;
9198 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9199 nullptr, 0, nullptr, 1, &img_barrier);
9200 m_errorMonitor->VerifyFound();
9201 img_barrier.subresourceRange.levelCount = 1;
9202
9203 // layerCount must be non-zero.
9204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9205 img_barrier.subresourceRange.layerCount = 0;
9206 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9207 nullptr, 0, nullptr, 1, &img_barrier);
9208 m_errorMonitor->VerifyFound();
9209 img_barrier.subresourceRange.layerCount = 1;
9210
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009211 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 -06009212 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009213 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9214 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009215 VkBufferMemoryBarrier buf_barrier = {};
9216 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9217 buf_barrier.pNext = NULL;
9218 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9219 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9220 buf_barrier.buffer = buffer.handle();
9221 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9222 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9223 buf_barrier.offset = 0;
9224 buf_barrier.size = VK_WHOLE_SIZE;
9225 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009226 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9227 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009228 m_errorMonitor->VerifyFound();
9229 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9230
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009232 buf_barrier.offset = 257;
9233 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009234 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9235 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009236 m_errorMonitor->VerifyFound();
9237 buf_barrier.offset = 0;
9238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009240 buf_barrier.size = 257;
9241 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009242 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9243 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009244 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009245
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009246 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
9248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009249 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009250 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009251 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009252 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9253 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009254 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009255
9256 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009257 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009258 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9259 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009260 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009261
Tobin Ehlis99ab0d22017-04-26 16:53:52 -06009262 // Having only one of depth or stencil set for DS image is an error
9263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00302);
9264 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
9265 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9266 nullptr, 0, nullptr, 1, &img_barrier);
9267 m_errorMonitor->VerifyFound();
9268
9269 // Having anything other than DEPTH and STENCIL is an error
9270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Dave Houltonfbf52152017-01-06 12:55:29 -07009271 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9272 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9273 nullptr, 0, nullptr, 1, &img_barrier);
9274 m_errorMonitor->VerifyFound();
9275
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009276 // Now test depth-only
9277 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009278 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9279 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009280 VkDepthStencilObj d_image(m_device);
9281 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9282 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009283 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009284 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009285 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009286
9287 // DEPTH bit must be set
9288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9289 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009290 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009291 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9292 0, nullptr, 0, nullptr, 1, &img_barrier);
9293 m_errorMonitor->VerifyFound();
9294
9295 // No bits other than DEPTH may be set
9296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9297 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9298 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009299 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9300 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009301 m_errorMonitor->VerifyFound();
9302 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009303
9304 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009305 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9306 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009307 VkDepthStencilObj s_image(m_device);
9308 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9309 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009310 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009311 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009312 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009313 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9315 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009316 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009317 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9318 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009319 m_errorMonitor->VerifyFound();
9320 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009321
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009322 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009323 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009324 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 -06009325 ASSERT_TRUE(c_image.initialized());
9326 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9327 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9328 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009329
9330 // COLOR bit must be set
9331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9332 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009333 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009334 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9335 nullptr, 0, nullptr, 1, &img_barrier);
9336 m_errorMonitor->VerifyFound();
9337
9338 // No bits other than COLOR may be set
9339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9340 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9341 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009342 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9343 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009344 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009345
Mike Weiblene6e01172017-03-07 22:18:40 -07009346 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9347 {
9348 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009349 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 -07009350 ASSERT_TRUE(img_color.initialized());
9351
9352 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009353 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 -07009354 ASSERT_TRUE(img_ds.initialized());
9355
9356 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009357 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 -07009358 ASSERT_TRUE(img_xfer_src.initialized());
9359
9360 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009361 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 -07009362 ASSERT_TRUE(img_xfer_dst.initialized());
9363
9364 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009365 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 -07009366 ASSERT_TRUE(img_sampled.initialized());
9367
9368 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009369 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 -07009370 ASSERT_TRUE(img_input.initialized());
9371
9372 const struct {
9373 VkImageObj &image_obj;
9374 VkImageLayout bad_layout;
9375 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9376 } bad_buffer_layouts[] = {
9377 // clang-format off
9378 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9379 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9380 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9381 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9382 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9383 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9384 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9385 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9386 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9387 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9388 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9389 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9390 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9391 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9392 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9393 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9394 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9395 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9396 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9397 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9398 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9399 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9400 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9401 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9402 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9403 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9404 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9405 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9406 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9407 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9408 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9409 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9410 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9411 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9412 // clang-format on
9413 };
9414 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9415
9416 for (uint32_t i = 0; i < layout_count; ++i) {
9417 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9418 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9419 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9420 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9421 : VK_IMAGE_ASPECT_COLOR_BIT;
9422
9423 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9424 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9426 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9427 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9428 m_errorMonitor->VerifyFound();
9429
9430 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9431 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9433 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9434 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9435 m_errorMonitor->VerifyFound();
9436 }
9437
9438 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9439 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9440 }
9441
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009442 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9443
9444 // Create command pool with incompatible queueflags
9445 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009446 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009447 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009448 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009449 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009450 }
9451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9452
9453 VkCommandPool command_pool;
9454 VkCommandPoolCreateInfo pool_create_info{};
9455 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9456 pool_create_info.queueFamilyIndex = queue_family_index;
9457 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9458 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9459
9460 // Allocate a command buffer
9461 VkCommandBuffer bad_command_buffer;
9462 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9463 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9464 command_buffer_allocate_info.commandPool = command_pool;
9465 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9466 command_buffer_allocate_info.commandBufferCount = 1;
9467 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9468
9469 VkCommandBufferBeginInfo cbbi = {};
9470 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9471 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9472 buf_barrier.offset = 0;
9473 buf_barrier.size = VK_WHOLE_SIZE;
9474 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9475 &buf_barrier, 0, nullptr);
9476 m_errorMonitor->VerifyFound();
9477
9478 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9479 vkEndCommandBuffer(bad_command_buffer);
9480 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009481 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009482 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009483 }
9484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9485 VkEvent event;
9486 VkEventCreateInfo event_create_info{};
9487 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9488 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9489 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9490 nullptr, 0, nullptr);
9491 m_errorMonitor->VerifyFound();
9492
9493 vkEndCommandBuffer(bad_command_buffer);
9494 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009495}
9496
Chris Forbes50223732017-05-01 09:43:35 -07009497TEST_F(VkPositiveLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9498 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ
9499 // in srcAccessMask.
Tony Barbour18ba25c2016-09-29 13:42:40 -06009500
Chris Forbes50223732017-05-01 09:43:35 -07009501 // The required behavior here was a bit unclear in earlier versions of the
9502 // spec, but there is no memory dependency required here, so this should
9503 // work without warnings.
9504
9505 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -06009506 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009507 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009508 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 -07009509 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009510 ASSERT_TRUE(image.initialized());
9511
9512 VkImageMemoryBarrier barrier = {};
9513 VkImageSubresourceRange range;
9514 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009515 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
Chris Forbes50223732017-05-01 09:43:35 -07009516 barrier.dstAccessMask = 0;
Tony Barbour18ba25c2016-09-29 13:42:40 -06009517 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9518 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9519 barrier.image = image.handle();
9520 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9521 range.baseMipLevel = 0;
9522 range.levelCount = 1;
9523 range.baseArrayLayer = 0;
9524 range.layerCount = 1;
9525 barrier.subresourceRange = range;
9526 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9527 cmdbuf.BeginCommandBuffer();
9528 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9529 &barrier);
9530 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9531 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9532 barrier.srcAccessMask = 0;
9533 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9534 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9535 &barrier);
9536
Chris Forbes50223732017-05-01 09:43:35 -07009537 m_errorMonitor->VerifyNotFound();
Tony Barbour18ba25c2016-09-29 13:42:40 -06009538}
9539
Karl Schultz6addd812016-02-02 17:17:23 -07009540TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009541 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009542 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009544
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009545 uint32_t const indices[] = {0};
9546 VkBufferCreateInfo buf_info = {};
9547 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9548 buf_info.size = 1024;
9549 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9550 buf_info.queueFamilyIndexCount = 1;
9551 buf_info.pQueueFamilyIndices = indices;
9552
9553 VkBuffer buffer;
9554 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9555 ASSERT_VK_SUCCESS(err);
9556
9557 VkMemoryRequirements requirements;
9558 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9559
9560 VkMemoryAllocateInfo alloc_info{};
9561 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9562 alloc_info.pNext = NULL;
9563 alloc_info.memoryTypeIndex = 0;
9564 alloc_info.allocationSize = requirements.size;
9565 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9566 ASSERT_TRUE(pass);
9567
9568 VkDeviceMemory memory;
9569 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9570 ASSERT_VK_SUCCESS(err);
9571
9572 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009573 ASSERT_VK_SUCCESS(err);
9574
Tony Barbour552f6c02016-12-21 14:34:07 -07009575 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009576 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009577
Karl Schultz6addd812016-02-02 17:17:23 -07009578 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9579 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009580 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9582 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009583 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009584
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009585 vkFreeMemory(m_device->device(), memory, NULL);
9586 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009587}
9588
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009589TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9590 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009591 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9593 VkBufferCreateInfo buffCI = {};
9594 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9595 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009596 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009597 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009598 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009599 uint32_t qfi[2];
9600 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009601 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009602
9603 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009604 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009605
9606 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9608 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9609 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009610 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009611 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009612
9613 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009614 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9616
9617 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9618 buffCI.queueFamilyIndexCount = 2;
9619 qfi[0] = 1;
9620 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009621 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009622 VkDeviceMemory mem;
9623 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009624 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009625
9626 VkMemoryAllocateInfo alloc_info = {};
9627 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9628 alloc_info.allocationSize = 1024;
9629 bool pass = false;
9630 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9631 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009632 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009633 return;
9634 }
9635 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009636 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009637
9638 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009639 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009640 m_commandBuffer->end();
9641 QueueCommandBuffer(false);
9642 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009643 vkDestroyBuffer(m_device->device(), ib2, NULL);
9644 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009645 }
9646
Tony Barbourdf4c0042016-06-01 15:55:43 -06009647 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009648}
9649
Karl Schultz6addd812016-02-02 17:17:23 -07009650TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009651 TEST_DESCRIPTION(
9652 "Attempt vkCmdExecuteCommands with a primary command buffer"
9653 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009654
Tony Barbour1fa09702017-03-16 12:09:08 -06009655 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009657
Chris Forbesf29a84f2016-10-06 18:39:28 +13009658 // An empty primary command buffer
9659 VkCommandBufferObj cb(m_device, m_commandPool);
9660 cb.BeginCommandBuffer();
9661 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009662
Chris Forbesf29a84f2016-10-06 18:39:28 +13009663 m_commandBuffer->BeginCommandBuffer();
9664 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9665 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009666
Chris Forbesf29a84f2016-10-06 18:39:28 +13009667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9668 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009669 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009670
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -06009671 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009672}
9673
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009674TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009675 TEST_DESCRIPTION(
9676 "Attempt to update descriptor sets for images and buffers "
9677 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009678 VkResult err;
9679
Tony Barbour1fa09702017-03-16 12:09:08 -06009680 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009681 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9682 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9683 ds_type_count[i].type = VkDescriptorType(i);
9684 ds_type_count[i].descriptorCount = 1;
9685 }
9686 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9687 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9688 ds_pool_ci.pNext = NULL;
9689 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9690 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9691 ds_pool_ci.pPoolSizes = ds_type_count;
9692
9693 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009694 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009695 ASSERT_VK_SUCCESS(err);
9696
9697 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009698 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009699 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9700 dsl_binding[i].binding = 0;
9701 dsl_binding[i].descriptorType = VkDescriptorType(i);
9702 dsl_binding[i].descriptorCount = 1;
9703 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9704 dsl_binding[i].pImmutableSamplers = NULL;
9705 }
9706
9707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9709 ds_layout_ci.pNext = NULL;
9710 ds_layout_ci.bindingCount = 1;
9711 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9712 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9713 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009714 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009715 ASSERT_VK_SUCCESS(err);
9716 }
9717 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9718 VkDescriptorSetAllocateInfo alloc_info = {};
9719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9720 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9721 alloc_info.descriptorPool = ds_pool;
9722 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009724 ASSERT_VK_SUCCESS(err);
9725
9726 // Create a buffer & bufferView to be used for invalid updates
9727 VkBufferCreateInfo buff_ci = {};
9728 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009729 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009730 buff_ci.size = 256;
9731 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009732 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009733 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9734 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009735
9736 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9737 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9738 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9739 ASSERT_VK_SUCCESS(err);
9740
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009741 VkMemoryRequirements mem_reqs;
9742 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9743 VkMemoryAllocateInfo mem_alloc_info = {};
9744 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9745 mem_alloc_info.pNext = NULL;
9746 mem_alloc_info.memoryTypeIndex = 0;
9747 mem_alloc_info.allocationSize = mem_reqs.size;
9748 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9749 if (!pass) {
9750 vkDestroyBuffer(m_device->device(), buffer, NULL);
9751 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9752 return;
9753 }
9754 VkDeviceMemory mem;
9755 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9756 ASSERT_VK_SUCCESS(err);
9757 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9758 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009759
9760 VkBufferViewCreateInfo buff_view_ci = {};
9761 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9762 buff_view_ci.buffer = buffer;
9763 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9764 buff_view_ci.range = VK_WHOLE_SIZE;
9765 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009766 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009767 ASSERT_VK_SUCCESS(err);
9768
Tony Barbour415497c2017-01-24 10:06:09 -07009769 // Now get resources / view for storage_texel_buffer
9770 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9771 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9772 if (!pass) {
9773 vkDestroyBuffer(m_device->device(), buffer, NULL);
9774 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9775 vkFreeMemory(m_device->device(), mem, NULL);
9776 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9777 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9778 return;
9779 }
9780 VkDeviceMemory storage_texel_buffer_mem;
9781 VkBufferView storage_texel_buffer_view;
9782 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9783 ASSERT_VK_SUCCESS(err);
9784 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9785 ASSERT_VK_SUCCESS(err);
9786 buff_view_ci.buffer = storage_texel_buffer;
9787 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9788 ASSERT_VK_SUCCESS(err);
9789
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009790 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009791 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009792 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009793 image_ci.format = VK_FORMAT_UNDEFINED;
9794 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9795 VkFormat format = static_cast<VkFormat>(f);
9796 VkFormatProperties fProps = m_device->format_properties(format);
9797 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9798 image_ci.format = format;
9799 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9800 break;
9801 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9802 image_ci.format = format;
9803 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9804 break;
9805 }
9806 }
9807 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9808 return;
9809 }
9810
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009811 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9812 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009813 image_ci.extent.width = 64;
9814 image_ci.extent.height = 64;
9815 image_ci.extent.depth = 1;
9816 image_ci.mipLevels = 1;
9817 image_ci.arrayLayers = 1;
9818 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009819 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009820 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009821 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9822 VkImage image;
9823 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9824 ASSERT_VK_SUCCESS(err);
9825 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009826 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009827
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009828 VkMemoryAllocateInfo mem_alloc = {};
9829 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9830 mem_alloc.pNext = NULL;
9831 mem_alloc.allocationSize = 0;
9832 mem_alloc.memoryTypeIndex = 0;
9833 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9834 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009835 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009836 ASSERT_TRUE(pass);
9837 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9838 ASSERT_VK_SUCCESS(err);
9839 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9840 ASSERT_VK_SUCCESS(err);
9841 // Now create view for image
9842 VkImageViewCreateInfo image_view_ci = {};
9843 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9844 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009845 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009846 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9847 image_view_ci.subresourceRange.layerCount = 1;
9848 image_view_ci.subresourceRange.baseArrayLayer = 0;
9849 image_view_ci.subresourceRange.levelCount = 1;
9850 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9851 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009852 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009853 ASSERT_VK_SUCCESS(err);
9854
9855 VkDescriptorBufferInfo buff_info = {};
9856 buff_info.buffer = buffer;
9857 VkDescriptorImageInfo img_info = {};
9858 img_info.imageView = image_view;
9859 VkWriteDescriptorSet descriptor_write = {};
9860 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9861 descriptor_write.dstBinding = 0;
9862 descriptor_write.descriptorCount = 1;
9863 descriptor_write.pTexelBufferView = &buff_view;
9864 descriptor_write.pBufferInfo = &buff_info;
9865 descriptor_write.pImageInfo = &img_info;
9866
9867 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009868 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009869 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9870 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9871 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9872 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9873 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9874 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9875 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9876 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9877 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9878 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9879 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009880 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009881 // Start loop at 1 as SAMPLER desc type has no usage bit error
9882 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009883 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9884 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9885 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9886 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009887 descriptor_write.descriptorType = VkDescriptorType(i);
9888 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009890
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009891 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009892
9893 m_errorMonitor->VerifyFound();
9894 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009895 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9896 descriptor_write.pTexelBufferView = &buff_view;
9897 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009898 }
Tony Barbour415497c2017-01-24 10:06:09 -07009899
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009900 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9901 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009902 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009903 vkDestroyImageView(m_device->device(), image_view, NULL);
9904 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009905 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009906 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009907 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009908 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009909 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009910 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9911}
9912
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009913TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009914 TEST_DESCRIPTION(
9915 "Attempt to update buffer descriptor set that has incorrect "
9916 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009917 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009918 "2. range value of 0\n"
9919 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009920 VkResult err;
9921
Tony Barbour1fa09702017-03-16 12:09:08 -06009922 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009923 VkDescriptorPoolSize ds_type_count = {};
9924 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9925 ds_type_count.descriptorCount = 1;
9926
9927 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9928 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9929 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009930 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009931 ds_pool_ci.maxSets = 1;
9932 ds_pool_ci.poolSizeCount = 1;
9933 ds_pool_ci.pPoolSizes = &ds_type_count;
9934
9935 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009936 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009937 ASSERT_VK_SUCCESS(err);
9938
9939 // Create layout with single uniform buffer descriptor
9940 VkDescriptorSetLayoutBinding dsl_binding = {};
9941 dsl_binding.binding = 0;
9942 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9943 dsl_binding.descriptorCount = 1;
9944 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9945 dsl_binding.pImmutableSamplers = NULL;
9946
9947 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9948 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9949 ds_layout_ci.pNext = NULL;
9950 ds_layout_ci.bindingCount = 1;
9951 ds_layout_ci.pBindings = &dsl_binding;
9952 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009953 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009954 ASSERT_VK_SUCCESS(err);
9955
9956 VkDescriptorSet descriptor_set = {};
9957 VkDescriptorSetAllocateInfo alloc_info = {};
9958 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9959 alloc_info.descriptorSetCount = 1;
9960 alloc_info.descriptorPool = ds_pool;
9961 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009962 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009963 ASSERT_VK_SUCCESS(err);
9964
9965 // Create a buffer to be used for invalid updates
9966 VkBufferCreateInfo buff_ci = {};
9967 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9968 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009969 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009970 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9971 VkBuffer buffer;
9972 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9973 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009974
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009975 // Have to bind memory to buffer before descriptor update
9976 VkMemoryAllocateInfo mem_alloc = {};
9977 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9978 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009979 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009980 mem_alloc.memoryTypeIndex = 0;
9981
9982 VkMemoryRequirements mem_reqs;
9983 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009984 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009985 if (!pass) {
9986 vkDestroyBuffer(m_device->device(), buffer, NULL);
9987 return;
9988 }
9989
9990 VkDeviceMemory mem;
9991 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9992 ASSERT_VK_SUCCESS(err);
9993 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9994 ASSERT_VK_SUCCESS(err);
9995
9996 VkDescriptorBufferInfo buff_info = {};
9997 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009998 // Cause error due to offset out of range
9999 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010000 buff_info.range = VK_WHOLE_SIZE;
10001 VkWriteDescriptorSet descriptor_write = {};
10002 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10003 descriptor_write.dstBinding = 0;
10004 descriptor_write.descriptorCount = 1;
10005 descriptor_write.pTexelBufferView = nullptr;
10006 descriptor_write.pBufferInfo = &buff_info;
10007 descriptor_write.pImageInfo = nullptr;
10008
10009 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10010 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010012
10013 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10014
10015 m_errorMonitor->VerifyFound();
10016 // Now cause error due to range of 0
10017 buff_info.offset = 0;
10018 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010020
10021 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10022
10023 m_errorMonitor->VerifyFound();
10024 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010025 buff_info.offset = 0;
10026 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010028
10029 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10030
10031 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010032 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010033 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10034 vkDestroyBuffer(m_device->device(), buffer, NULL);
10035 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10036 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10037}
10038
Tobin Ehlis845887e2017-02-02 19:01:44 -070010039TEST_F(VkLayerTest, DSBufferLimitErrors) {
10040 TEST_DESCRIPTION(
10041 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10042 "Test cases include:\n"
10043 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10044 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10045 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10046 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10047 VkResult err;
10048
Tony Barbour1fa09702017-03-16 12:09:08 -060010049 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010050 VkDescriptorPoolSize ds_type_count[2] = {};
10051 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10052 ds_type_count[0].descriptorCount = 1;
10053 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10054 ds_type_count[1].descriptorCount = 1;
10055
10056 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10057 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10058 ds_pool_ci.pNext = NULL;
10059 ds_pool_ci.maxSets = 1;
10060 ds_pool_ci.poolSizeCount = 2;
10061 ds_pool_ci.pPoolSizes = ds_type_count;
10062
10063 VkDescriptorPool ds_pool;
10064 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10065 ASSERT_VK_SUCCESS(err);
10066
10067 // Create layout with single uniform buffer & single storage buffer descriptor
10068 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10069 dsl_binding[0].binding = 0;
10070 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10071 dsl_binding[0].descriptorCount = 1;
10072 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10073 dsl_binding[0].pImmutableSamplers = NULL;
10074 dsl_binding[1].binding = 1;
10075 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10076 dsl_binding[1].descriptorCount = 1;
10077 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10078 dsl_binding[1].pImmutableSamplers = NULL;
10079
10080 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10081 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10082 ds_layout_ci.pNext = NULL;
10083 ds_layout_ci.bindingCount = 2;
10084 ds_layout_ci.pBindings = dsl_binding;
10085 VkDescriptorSetLayout ds_layout;
10086 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10087 ASSERT_VK_SUCCESS(err);
10088
10089 VkDescriptorSet descriptor_set = {};
10090 VkDescriptorSetAllocateInfo alloc_info = {};
10091 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10092 alloc_info.descriptorSetCount = 1;
10093 alloc_info.descriptorPool = ds_pool;
10094 alloc_info.pSetLayouts = &ds_layout;
10095 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10096 ASSERT_VK_SUCCESS(err);
10097
10098 // Create a buffer to be used for invalid updates
10099 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10100 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10101 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10102 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10103 VkBufferCreateInfo ub_ci = {};
10104 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10105 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10106 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10107 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10108 VkBuffer uniform_buffer;
10109 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10110 ASSERT_VK_SUCCESS(err);
10111 VkBufferCreateInfo sb_ci = {};
10112 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10113 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10114 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10115 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10116 VkBuffer storage_buffer;
10117 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10118 ASSERT_VK_SUCCESS(err);
10119 // Have to bind memory to buffer before descriptor update
10120 VkMemoryAllocateInfo mem_alloc = {};
10121 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10122 mem_alloc.pNext = NULL;
10123 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10124 mem_alloc.memoryTypeIndex = 0;
10125
Cort Stratton77a0d592017-02-17 13:14:13 -080010126 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10127 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10128 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10129 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10130 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010131 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010132 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010133 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010134 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10135 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010136 return;
10137 }
10138
10139 VkDeviceMemory mem;
10140 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010141 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010142 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010143 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10144 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10145 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10146 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10147 return;
10148 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010149 ASSERT_VK_SUCCESS(err);
10150 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10151 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010152 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010153 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10154 ASSERT_VK_SUCCESS(err);
10155
10156 VkDescriptorBufferInfo buff_info = {};
10157 buff_info.buffer = uniform_buffer;
10158 buff_info.range = ub_ci.size; // This will exceed limit
10159 VkWriteDescriptorSet descriptor_write = {};
10160 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10161 descriptor_write.dstBinding = 0;
10162 descriptor_write.descriptorCount = 1;
10163 descriptor_write.pTexelBufferView = nullptr;
10164 descriptor_write.pBufferInfo = &buff_info;
10165 descriptor_write.pImageInfo = nullptr;
10166
10167 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10168 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010169 if (max_ub_range != UINT32_MAX) {
10170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10171 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10172 m_errorMonitor->VerifyFound();
10173 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010174 // Reduce size of range to acceptable limit & cause offset error
10175 buff_info.range = max_ub_range;
10176 buff_info.offset = min_ub_align - 1;
10177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10178 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10179 m_errorMonitor->VerifyFound();
10180
10181 // Now break storage updates
10182 buff_info.buffer = storage_buffer;
10183 buff_info.range = sb_ci.size; // This will exceed limit
10184 buff_info.offset = 0; // Reset offset for this update
10185
10186 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10187 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010188 if (max_ub_range != UINT32_MAX) {
10189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10190 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10191 m_errorMonitor->VerifyFound();
10192 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010193
10194 // Reduce size of range to acceptable limit & cause offset error
10195 buff_info.range = max_sb_range;
10196 buff_info.offset = min_sb_align - 1;
10197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10198 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10199 m_errorMonitor->VerifyFound();
10200
10201 vkFreeMemory(m_device->device(), mem, NULL);
10202 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10203 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10204 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10205 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10206}
10207
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010208TEST_F(VkLayerTest, DSAspectBitsErrors) {
10209 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10210 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010211 TEST_DESCRIPTION(
10212 "Attempt to update descriptor sets for images "
10213 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010214 VkResult err;
10215
Tony Barbour1fa09702017-03-16 12:09:08 -060010216 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010217 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010218 if (!depth_format) {
10219 printf(" No Depth + Stencil format found. Skipped.\n");
10220 return;
10221 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010222 VkDescriptorPoolSize ds_type_count = {};
10223 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10224 ds_type_count.descriptorCount = 1;
10225
10226 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10227 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10228 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010229 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010230 ds_pool_ci.maxSets = 5;
10231 ds_pool_ci.poolSizeCount = 1;
10232 ds_pool_ci.pPoolSizes = &ds_type_count;
10233
10234 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010235 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010236 ASSERT_VK_SUCCESS(err);
10237
10238 VkDescriptorSetLayoutBinding dsl_binding = {};
10239 dsl_binding.binding = 0;
10240 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10241 dsl_binding.descriptorCount = 1;
10242 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10243 dsl_binding.pImmutableSamplers = NULL;
10244
10245 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10246 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10247 ds_layout_ci.pNext = NULL;
10248 ds_layout_ci.bindingCount = 1;
10249 ds_layout_ci.pBindings = &dsl_binding;
10250 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010251 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010252 ASSERT_VK_SUCCESS(err);
10253
10254 VkDescriptorSet descriptor_set = {};
10255 VkDescriptorSetAllocateInfo alloc_info = {};
10256 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10257 alloc_info.descriptorSetCount = 1;
10258 alloc_info.descriptorPool = ds_pool;
10259 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010260 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010261 ASSERT_VK_SUCCESS(err);
10262
10263 // Create an image to be used for invalid updates
10264 VkImageCreateInfo image_ci = {};
10265 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10266 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010267 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010268 image_ci.extent.width = 64;
10269 image_ci.extent.height = 64;
10270 image_ci.extent.depth = 1;
10271 image_ci.mipLevels = 1;
10272 image_ci.arrayLayers = 1;
10273 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010274 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010275 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10276 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10277 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10278 VkImage image;
10279 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10280 ASSERT_VK_SUCCESS(err);
10281 // Bind memory to image
10282 VkMemoryRequirements mem_reqs;
10283 VkDeviceMemory image_mem;
10284 bool pass;
10285 VkMemoryAllocateInfo mem_alloc = {};
10286 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10287 mem_alloc.pNext = NULL;
10288 mem_alloc.allocationSize = 0;
10289 mem_alloc.memoryTypeIndex = 0;
10290 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10291 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010292 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010293 ASSERT_TRUE(pass);
10294 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10295 ASSERT_VK_SUCCESS(err);
10296 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10297 ASSERT_VK_SUCCESS(err);
10298 // Now create view for image
10299 VkImageViewCreateInfo image_view_ci = {};
10300 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10301 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010302 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010303 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10304 image_view_ci.subresourceRange.layerCount = 1;
10305 image_view_ci.subresourceRange.baseArrayLayer = 0;
10306 image_view_ci.subresourceRange.levelCount = 1;
10307 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010308 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010309
10310 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010311 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010312 ASSERT_VK_SUCCESS(err);
10313
10314 VkDescriptorImageInfo img_info = {};
10315 img_info.imageView = image_view;
10316 VkWriteDescriptorSet descriptor_write = {};
10317 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10318 descriptor_write.dstBinding = 0;
10319 descriptor_write.descriptorCount = 1;
10320 descriptor_write.pTexelBufferView = NULL;
10321 descriptor_write.pBufferInfo = NULL;
10322 descriptor_write.pImageInfo = &img_info;
10323 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10324 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010325 const char *error_msg =
10326 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10327 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010329
10330 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10331
10332 m_errorMonitor->VerifyFound();
10333 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10334 vkDestroyImage(m_device->device(), image, NULL);
10335 vkFreeMemory(m_device->device(), image_mem, NULL);
10336 vkDestroyImageView(m_device->device(), image_view, NULL);
10337 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10338 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10339}
10340
Karl Schultz6addd812016-02-02 17:17:23 -070010341TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010342 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010343 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10346 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10347 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010348
Tony Barbour1fa09702017-03-16 12:09:08 -060010349 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010350 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010351 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010352 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10353 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010354
10355 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010356 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10357 ds_pool_ci.pNext = NULL;
10358 ds_pool_ci.maxSets = 1;
10359 ds_pool_ci.poolSizeCount = 1;
10360 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010361
Tobin Ehlis3b780662015-05-28 12:11:26 -060010362 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010363 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010364 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010365 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010366 dsl_binding.binding = 0;
10367 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10368 dsl_binding.descriptorCount = 1;
10369 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10370 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010371
Tony Barboureb254902015-07-15 12:50:33 -060010372 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010373 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10374 ds_layout_ci.pNext = NULL;
10375 ds_layout_ci.bindingCount = 1;
10376 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010377
Tobin Ehlis3b780662015-05-28 12:11:26 -060010378 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010379 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010380 ASSERT_VK_SUCCESS(err);
10381
10382 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010383 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010384 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010385 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010386 alloc_info.descriptorPool = ds_pool;
10387 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010388 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010389 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010390
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010391 VkSamplerCreateInfo sampler_ci = {};
10392 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10393 sampler_ci.pNext = NULL;
10394 sampler_ci.magFilter = VK_FILTER_NEAREST;
10395 sampler_ci.minFilter = VK_FILTER_NEAREST;
10396 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10397 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10398 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10399 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10400 sampler_ci.mipLodBias = 1.0;
10401 sampler_ci.anisotropyEnable = VK_FALSE;
10402 sampler_ci.maxAnisotropy = 1;
10403 sampler_ci.compareEnable = VK_FALSE;
10404 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10405 sampler_ci.minLod = 1.0;
10406 sampler_ci.maxLod = 1.0;
10407 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10408 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10409 VkSampler sampler;
10410 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10411 ASSERT_VK_SUCCESS(err);
10412
10413 VkDescriptorImageInfo info = {};
10414 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010415
10416 VkWriteDescriptorSet descriptor_write;
10417 memset(&descriptor_write, 0, sizeof(descriptor_write));
10418 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010419 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010420 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010421 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010422 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010423 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010424
10425 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010427 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010428
Chia-I Wuf7458c52015-10-26 21:10:41 +080010429 vkDestroySampler(m_device->device(), sampler, NULL);
10430 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10431 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010432}
10433
Karl Schultz6addd812016-02-02 17:17:23 -070010434TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010435 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010436 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010437
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010439
Tony Barbour1fa09702017-03-16 12:09:08 -060010440 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010441 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010442 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010443 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10444 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010445
10446 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010447 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10448 ds_pool_ci.pNext = NULL;
10449 ds_pool_ci.maxSets = 1;
10450 ds_pool_ci.poolSizeCount = 1;
10451 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010452
Tobin Ehlis3b780662015-05-28 12:11:26 -060010453 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010454 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010455 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010456
Tony Barboureb254902015-07-15 12:50:33 -060010457 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010458 dsl_binding.binding = 0;
10459 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10460 dsl_binding.descriptorCount = 1;
10461 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10462 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010463
10464 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010465 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10466 ds_layout_ci.pNext = NULL;
10467 ds_layout_ci.bindingCount = 1;
10468 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010469
Tobin Ehlis3b780662015-05-28 12:11:26 -060010470 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010471 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010472 ASSERT_VK_SUCCESS(err);
10473
10474 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010475 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010476 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010477 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010478 alloc_info.descriptorPool = ds_pool;
10479 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010480 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010481 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010482
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010483 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10484
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010485 // Correctly update descriptor to avoid "NOT_UPDATED" error
10486 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010487 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010488 buff_info.offset = 0;
10489 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010490
10491 VkWriteDescriptorSet descriptor_write;
10492 memset(&descriptor_write, 0, sizeof(descriptor_write));
10493 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010494 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010495 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010496 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010497 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10498 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010499
10500 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010502 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010503
Chia-I Wuf7458c52015-10-26 21:10:41 +080010504 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10505 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010506}
10507
Karl Schultz6addd812016-02-02 17:17:23 -070010508TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010509 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010510 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010511
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010513
Tony Barbour1fa09702017-03-16 12:09:08 -060010514 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010515 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010516 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010517 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10518 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010519
10520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10522 ds_pool_ci.pNext = NULL;
10523 ds_pool_ci.maxSets = 1;
10524 ds_pool_ci.poolSizeCount = 1;
10525 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010526
Tobin Ehlis3b780662015-05-28 12:11:26 -060010527 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010528 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010529 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010530
Tony Barboureb254902015-07-15 12:50:33 -060010531 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010532 dsl_binding.binding = 0;
10533 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10534 dsl_binding.descriptorCount = 1;
10535 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10536 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010537
10538 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010539 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10540 ds_layout_ci.pNext = NULL;
10541 ds_layout_ci.bindingCount = 1;
10542 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010543 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010544 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010545 ASSERT_VK_SUCCESS(err);
10546
10547 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010548 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010549 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010550 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010551 alloc_info.descriptorPool = ds_pool;
10552 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010553 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010554 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010555
Tony Barboureb254902015-07-15 12:50:33 -060010556 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010557 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10558 sampler_ci.pNext = NULL;
10559 sampler_ci.magFilter = VK_FILTER_NEAREST;
10560 sampler_ci.minFilter = VK_FILTER_NEAREST;
10561 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10562 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10563 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10564 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10565 sampler_ci.mipLodBias = 1.0;
10566 sampler_ci.anisotropyEnable = VK_FALSE;
10567 sampler_ci.maxAnisotropy = 1;
10568 sampler_ci.compareEnable = VK_FALSE;
10569 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10570 sampler_ci.minLod = 1.0;
10571 sampler_ci.maxLod = 1.0;
10572 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10573 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010574
Tobin Ehlis3b780662015-05-28 12:11:26 -060010575 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010576 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010577 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010578
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010579 VkDescriptorImageInfo info = {};
10580 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010581
10582 VkWriteDescriptorSet descriptor_write;
10583 memset(&descriptor_write, 0, sizeof(descriptor_write));
10584 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010585 descriptor_write.dstSet = descriptorSet;
10586 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010587 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010588 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010589 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010590 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010591
10592 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10593
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010594 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010595
Chia-I Wuf7458c52015-10-26 21:10:41 +080010596 vkDestroySampler(m_device->device(), sampler, NULL);
10597 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10598 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010599}
10600
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010601TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10602 // Create layout w/ empty binding and attempt to update it
10603 VkResult err;
10604
Tony Barbour1fa09702017-03-16 12:09:08 -060010605 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010606
10607 VkDescriptorPoolSize ds_type_count = {};
10608 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10609 ds_type_count.descriptorCount = 1;
10610
10611 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10612 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10613 ds_pool_ci.pNext = NULL;
10614 ds_pool_ci.maxSets = 1;
10615 ds_pool_ci.poolSizeCount = 1;
10616 ds_pool_ci.pPoolSizes = &ds_type_count;
10617
10618 VkDescriptorPool ds_pool;
10619 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10620 ASSERT_VK_SUCCESS(err);
10621
10622 VkDescriptorSetLayoutBinding dsl_binding = {};
10623 dsl_binding.binding = 0;
10624 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10625 dsl_binding.descriptorCount = 0;
10626 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10627 dsl_binding.pImmutableSamplers = NULL;
10628
10629 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10630 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10631 ds_layout_ci.pNext = NULL;
10632 ds_layout_ci.bindingCount = 1;
10633 ds_layout_ci.pBindings = &dsl_binding;
10634 VkDescriptorSetLayout ds_layout;
10635 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10636 ASSERT_VK_SUCCESS(err);
10637
10638 VkDescriptorSet descriptor_set;
10639 VkDescriptorSetAllocateInfo alloc_info = {};
10640 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10641 alloc_info.descriptorSetCount = 1;
10642 alloc_info.descriptorPool = ds_pool;
10643 alloc_info.pSetLayouts = &ds_layout;
10644 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10645 ASSERT_VK_SUCCESS(err);
10646
10647 VkSamplerCreateInfo sampler_ci = {};
10648 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10649 sampler_ci.magFilter = VK_FILTER_NEAREST;
10650 sampler_ci.minFilter = VK_FILTER_NEAREST;
10651 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10652 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10653 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10654 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10655 sampler_ci.mipLodBias = 1.0;
10656 sampler_ci.maxAnisotropy = 1;
10657 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10658 sampler_ci.minLod = 1.0;
10659 sampler_ci.maxLod = 1.0;
10660 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10661
10662 VkSampler sampler;
10663 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10664 ASSERT_VK_SUCCESS(err);
10665
10666 VkDescriptorImageInfo info = {};
10667 info.sampler = sampler;
10668
10669 VkWriteDescriptorSet descriptor_write;
10670 memset(&descriptor_write, 0, sizeof(descriptor_write));
10671 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10672 descriptor_write.dstSet = descriptor_set;
10673 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010674 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010675 // This is the wrong type, but empty binding error will be flagged first
10676 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10677 descriptor_write.pImageInfo = &info;
10678
10679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10680 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10681 m_errorMonitor->VerifyFound();
10682
10683 vkDestroySampler(m_device->device(), sampler, NULL);
10684 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10685 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10686}
10687
Karl Schultz6addd812016-02-02 17:17:23 -070010688TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10689 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10690 // types
10691 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010692
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010693 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 -060010694
Tony Barbour1fa09702017-03-16 12:09:08 -060010695 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010696
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010697 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010698 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10699 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010700
10701 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010702 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10703 ds_pool_ci.pNext = NULL;
10704 ds_pool_ci.maxSets = 1;
10705 ds_pool_ci.poolSizeCount = 1;
10706 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010707
Tobin Ehlis3b780662015-05-28 12:11:26 -060010708 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010709 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010710 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010711 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010712 dsl_binding.binding = 0;
10713 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10714 dsl_binding.descriptorCount = 1;
10715 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10716 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010717
Tony Barboureb254902015-07-15 12:50:33 -060010718 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010719 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10720 ds_layout_ci.pNext = NULL;
10721 ds_layout_ci.bindingCount = 1;
10722 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010723
Tobin Ehlis3b780662015-05-28 12:11:26 -060010724 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010725 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010726 ASSERT_VK_SUCCESS(err);
10727
10728 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010729 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010730 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010731 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010732 alloc_info.descriptorPool = ds_pool;
10733 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010734 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010735 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010736
Tony Barboureb254902015-07-15 12:50:33 -060010737 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010738 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10739 sampler_ci.pNext = NULL;
10740 sampler_ci.magFilter = VK_FILTER_NEAREST;
10741 sampler_ci.minFilter = VK_FILTER_NEAREST;
10742 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10743 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10744 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10745 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10746 sampler_ci.mipLodBias = 1.0;
10747 sampler_ci.anisotropyEnable = VK_FALSE;
10748 sampler_ci.maxAnisotropy = 1;
10749 sampler_ci.compareEnable = VK_FALSE;
10750 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10751 sampler_ci.minLod = 1.0;
10752 sampler_ci.maxLod = 1.0;
10753 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10754 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010755 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010756 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010757 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010758
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010759 VkDescriptorImageInfo info = {};
10760 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010761
10762 VkWriteDescriptorSet descriptor_write;
10763 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010764 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010765 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010766 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010767 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010768 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010769 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010770
10771 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10772
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010773 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010774
Chia-I Wuf7458c52015-10-26 21:10:41 +080010775 vkDestroySampler(m_device->device(), sampler, NULL);
10776 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10777 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010778}
10779
Karl Schultz6addd812016-02-02 17:17:23 -070010780TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010781 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010782 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010783
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010785
Tony Barbour1fa09702017-03-16 12:09:08 -060010786 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010787 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10788 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010789 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010790 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10791 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010792
10793 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010794 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10795 ds_pool_ci.pNext = NULL;
10796 ds_pool_ci.maxSets = 1;
10797 ds_pool_ci.poolSizeCount = 1;
10798 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010799
10800 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010801 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010802 ASSERT_VK_SUCCESS(err);
10803
10804 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010805 dsl_binding.binding = 0;
10806 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10807 dsl_binding.descriptorCount = 1;
10808 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10809 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010810
10811 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010812 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10813 ds_layout_ci.pNext = NULL;
10814 ds_layout_ci.bindingCount = 1;
10815 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010816 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010817 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010818 ASSERT_VK_SUCCESS(err);
10819
10820 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010821 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010822 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010823 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010824 alloc_info.descriptorPool = ds_pool;
10825 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010826 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010827 ASSERT_VK_SUCCESS(err);
10828
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010829 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010830
10831 VkDescriptorImageInfo descriptor_info;
10832 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10833 descriptor_info.sampler = sampler;
10834
10835 VkWriteDescriptorSet descriptor_write;
10836 memset(&descriptor_write, 0, sizeof(descriptor_write));
10837 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010838 descriptor_write.dstSet = descriptorSet;
10839 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010840 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010841 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10842 descriptor_write.pImageInfo = &descriptor_info;
10843
10844 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10845
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010846 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010847
Chia-I Wuf7458c52015-10-26 21:10:41 +080010848 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10849 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010850}
10851
Karl Schultz6addd812016-02-02 17:17:23 -070010852TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10853 // Create a single combined Image/Sampler descriptor and send it an invalid
10854 // imageView
10855 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010856
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010858
Tony Barbour1fa09702017-03-16 12:09:08 -060010859 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010860 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010861 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10862 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010863
10864 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010865 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10866 ds_pool_ci.pNext = NULL;
10867 ds_pool_ci.maxSets = 1;
10868 ds_pool_ci.poolSizeCount = 1;
10869 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010870
10871 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010872 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010873 ASSERT_VK_SUCCESS(err);
10874
10875 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010876 dsl_binding.binding = 0;
10877 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10878 dsl_binding.descriptorCount = 1;
10879 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10880 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010881
10882 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010883 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10884 ds_layout_ci.pNext = NULL;
10885 ds_layout_ci.bindingCount = 1;
10886 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010887 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010888 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010889 ASSERT_VK_SUCCESS(err);
10890
10891 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010892 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010893 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010894 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010895 alloc_info.descriptorPool = ds_pool;
10896 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010897 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010898 ASSERT_VK_SUCCESS(err);
10899
10900 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010901 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10902 sampler_ci.pNext = NULL;
10903 sampler_ci.magFilter = VK_FILTER_NEAREST;
10904 sampler_ci.minFilter = VK_FILTER_NEAREST;
10905 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10906 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10907 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10908 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10909 sampler_ci.mipLodBias = 1.0;
10910 sampler_ci.anisotropyEnable = VK_FALSE;
10911 sampler_ci.maxAnisotropy = 1;
10912 sampler_ci.compareEnable = VK_FALSE;
10913 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10914 sampler_ci.minLod = 1.0;
10915 sampler_ci.maxLod = 1.0;
10916 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10917 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010918
10919 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010920 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010921 ASSERT_VK_SUCCESS(err);
10922
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010923 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010924
10925 VkDescriptorImageInfo descriptor_info;
10926 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10927 descriptor_info.sampler = sampler;
10928 descriptor_info.imageView = view;
10929
10930 VkWriteDescriptorSet descriptor_write;
10931 memset(&descriptor_write, 0, sizeof(descriptor_write));
10932 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010933 descriptor_write.dstSet = descriptorSet;
10934 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010935 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010936 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10937 descriptor_write.pImageInfo = &descriptor_info;
10938
10939 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10940
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010941 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010942
Chia-I Wuf7458c52015-10-26 21:10:41 +080010943 vkDestroySampler(m_device->device(), sampler, NULL);
10944 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10945 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010946}
10947
Karl Schultz6addd812016-02-02 17:17:23 -070010948TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10949 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10950 // into the other
10951 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010952
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10954 " binding #1 with type "
10955 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10956 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010957
Tony Barbour1fa09702017-03-16 12:09:08 -060010958 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010959 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010960 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010961 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10962 ds_type_count[0].descriptorCount = 1;
10963 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10964 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010965
10966 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010967 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10968 ds_pool_ci.pNext = NULL;
10969 ds_pool_ci.maxSets = 1;
10970 ds_pool_ci.poolSizeCount = 2;
10971 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010972
10973 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010974 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010975 ASSERT_VK_SUCCESS(err);
10976 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010977 dsl_binding[0].binding = 0;
10978 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10979 dsl_binding[0].descriptorCount = 1;
10980 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10981 dsl_binding[0].pImmutableSamplers = NULL;
10982 dsl_binding[1].binding = 1;
10983 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10984 dsl_binding[1].descriptorCount = 1;
10985 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10986 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010987
10988 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010989 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10990 ds_layout_ci.pNext = NULL;
10991 ds_layout_ci.bindingCount = 2;
10992 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010993
10994 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010995 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010996 ASSERT_VK_SUCCESS(err);
10997
10998 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010999 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011000 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011001 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011002 alloc_info.descriptorPool = ds_pool;
11003 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011004 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011005 ASSERT_VK_SUCCESS(err);
11006
11007 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011008 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
11009 sampler_ci.pNext = NULL;
11010 sampler_ci.magFilter = VK_FILTER_NEAREST;
11011 sampler_ci.minFilter = VK_FILTER_NEAREST;
11012 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
11013 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11014 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11015 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
11016 sampler_ci.mipLodBias = 1.0;
11017 sampler_ci.anisotropyEnable = VK_FALSE;
11018 sampler_ci.maxAnisotropy = 1;
11019 sampler_ci.compareEnable = VK_FALSE;
11020 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11021 sampler_ci.minLod = 1.0;
11022 sampler_ci.maxLod = 1.0;
11023 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11024 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011025
11026 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011027 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011028 ASSERT_VK_SUCCESS(err);
11029
11030 VkDescriptorImageInfo info = {};
11031 info.sampler = sampler;
11032
11033 VkWriteDescriptorSet descriptor_write;
11034 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11035 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011036 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011037 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011038 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011039 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11040 descriptor_write.pImageInfo = &info;
11041 // This write update should succeed
11042 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11043 // Now perform a copy update that fails due to type mismatch
11044 VkCopyDescriptorSet copy_ds_update;
11045 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11046 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11047 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011048 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011049 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011050 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11051 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011052 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11053
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011054 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011055 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011056 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 -060011057 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11058 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11059 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011060 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011061 copy_ds_update.dstSet = descriptorSet;
11062 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011063 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011064 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11065
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011066 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011067
Tobin Ehlis04356f92015-10-27 16:35:27 -060011068 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11070 " binding#1 with offset index of 1 plus "
11071 "update array offset of 0 and update of "
11072 "5 descriptors oversteps total number "
11073 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011074
Tobin Ehlis04356f92015-10-27 16:35:27 -060011075 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11076 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11077 copy_ds_update.srcSet = descriptorSet;
11078 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011079 copy_ds_update.dstSet = descriptorSet;
11080 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011081 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011082 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11083
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011084 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011085
Chia-I Wuf7458c52015-10-26 21:10:41 +080011086 vkDestroySampler(m_device->device(), sampler, NULL);
11087 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11088 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011089}
11090
Karl Schultz6addd812016-02-02 17:17:23 -070011091TEST_F(VkLayerTest, NumSamplesMismatch) {
11092 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11093 // sampleCount
11094 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011095
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011097
Tony Barbour1fa09702017-03-16 12:09:08 -060011098 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011099 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011100 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011101 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011102 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011103
11104 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011105 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11106 ds_pool_ci.pNext = NULL;
11107 ds_pool_ci.maxSets = 1;
11108 ds_pool_ci.poolSizeCount = 1;
11109 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011110
Tobin Ehlis3b780662015-05-28 12:11:26 -060011111 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011112 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011113 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011114
Tony Barboureb254902015-07-15 12:50:33 -060011115 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011116 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011117 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011118 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011119 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11120 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011121
Tony Barboureb254902015-07-15 12:50:33 -060011122 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11123 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11124 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011125 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011126 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011127
Tobin Ehlis3b780662015-05-28 12:11:26 -060011128 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011129 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011130 ASSERT_VK_SUCCESS(err);
11131
11132 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011133 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011134 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011135 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011136 alloc_info.descriptorPool = ds_pool;
11137 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011138 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011139 ASSERT_VK_SUCCESS(err);
11140
Tony Barboureb254902015-07-15 12:50:33 -060011141 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011142 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011143 pipe_ms_state_ci.pNext = NULL;
11144 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11145 pipe_ms_state_ci.sampleShadingEnable = 0;
11146 pipe_ms_state_ci.minSampleShading = 1.0;
11147 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011148
Tony Barboureb254902015-07-15 12:50:33 -060011149 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011150 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11151 pipeline_layout_ci.pNext = NULL;
11152 pipeline_layout_ci.setLayoutCount = 1;
11153 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011154
11155 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011156 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011157 ASSERT_VK_SUCCESS(err);
11158
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011159 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011160 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 -060011161 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011162 VkPipelineObj pipe(m_device);
11163 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011164 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011165 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011166 pipe.SetMSAA(&pipe_ms_state_ci);
11167 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011168
Tony Barbour552f6c02016-12-21 14:34:07 -070011169 m_commandBuffer->BeginCommandBuffer();
11170 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011171 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011172
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011173 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11174 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11175 VkRect2D scissor = {{0, 0}, {16, 16}};
11176 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11177
Mark Young29927482016-05-04 14:38:51 -060011178 // Render triangle (the error should trigger on the attempt to draw).
11179 Draw(3, 1, 0, 0);
11180
11181 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011182 m_commandBuffer->EndRenderPass();
11183 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011184
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011185 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011186
Chia-I Wuf7458c52015-10-26 21:10:41 +080011187 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11188 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11189 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011190}
Mark Young29927482016-05-04 14:38:51 -060011191
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011192TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011193 TEST_DESCRIPTION(
11194 "Hit RenderPass incompatible cases. "
11195 "Initial case is drawing with an active renderpass that's "
11196 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011197 VkResult err;
11198
Tony Barbour1fa09702017-03-16 12:09:08 -060011199 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11201
11202 VkDescriptorSetLayoutBinding dsl_binding = {};
11203 dsl_binding.binding = 0;
11204 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11205 dsl_binding.descriptorCount = 1;
11206 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11207 dsl_binding.pImmutableSamplers = NULL;
11208
11209 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11210 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11211 ds_layout_ci.pNext = NULL;
11212 ds_layout_ci.bindingCount = 1;
11213 ds_layout_ci.pBindings = &dsl_binding;
11214
11215 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011216 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011217 ASSERT_VK_SUCCESS(err);
11218
11219 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11220 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11221 pipeline_layout_ci.pNext = NULL;
11222 pipeline_layout_ci.setLayoutCount = 1;
11223 pipeline_layout_ci.pSetLayouts = &ds_layout;
11224
11225 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011226 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011227 ASSERT_VK_SUCCESS(err);
11228
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011230 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 -060011231 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011232 // Create a renderpass that will be incompatible with default renderpass
11233 VkAttachmentReference attach = {};
11234 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11235 VkAttachmentReference color_att = {};
11236 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11237 VkSubpassDescription subpass = {};
11238 subpass.inputAttachmentCount = 1;
11239 subpass.pInputAttachments = &attach;
11240 subpass.colorAttachmentCount = 1;
11241 subpass.pColorAttachments = &color_att;
11242 VkRenderPassCreateInfo rpci = {};
11243 rpci.subpassCount = 1;
11244 rpci.pSubpasses = &subpass;
11245 rpci.attachmentCount = 1;
11246 VkAttachmentDescription attach_desc = {};
11247 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011248 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11249 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011250 rpci.pAttachments = &attach_desc;
11251 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11252 VkRenderPass rp;
11253 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11254 VkPipelineObj pipe(m_device);
11255 pipe.AddShader(&vs);
11256 pipe.AddShader(&fs);
11257 pipe.AddColorAttachment();
11258 VkViewport view_port = {};
11259 m_viewports.push_back(view_port);
11260 pipe.SetViewport(m_viewports);
11261 VkRect2D rect = {};
11262 m_scissors.push_back(rect);
11263 pipe.SetScissor(m_scissors);
11264 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11265
11266 VkCommandBufferInheritanceInfo cbii = {};
11267 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11268 cbii.renderPass = rp;
11269 cbii.subpass = 0;
11270 VkCommandBufferBeginInfo cbbi = {};
11271 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11272 cbbi.pInheritanceInfo = &cbii;
11273 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11274 VkRenderPassBeginInfo rpbi = {};
11275 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11276 rpbi.framebuffer = m_framebuffer;
11277 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011278 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11279 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011280
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011282 // Render triangle (the error should trigger on the attempt to draw).
11283 Draw(3, 1, 0, 0);
11284
11285 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011286 m_commandBuffer->EndRenderPass();
11287 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011288
11289 m_errorMonitor->VerifyFound();
11290
11291 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11292 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11293 vkDestroyRenderPass(m_device->device(), rp, NULL);
11294}
11295
Mark Youngc89c6312016-03-31 16:03:20 -060011296TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11297 // Create Pipeline where the number of blend attachments doesn't match the
11298 // number of color attachments. In this case, we don't add any color
11299 // blend attachments even though we have a color attachment.
11300 VkResult err;
11301
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011303
Tony Barbour1fa09702017-03-16 12:09:08 -060011304 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011305 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11306 VkDescriptorPoolSize ds_type_count = {};
11307 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11308 ds_type_count.descriptorCount = 1;
11309
11310 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11311 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11312 ds_pool_ci.pNext = NULL;
11313 ds_pool_ci.maxSets = 1;
11314 ds_pool_ci.poolSizeCount = 1;
11315 ds_pool_ci.pPoolSizes = &ds_type_count;
11316
11317 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011318 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011319 ASSERT_VK_SUCCESS(err);
11320
11321 VkDescriptorSetLayoutBinding dsl_binding = {};
11322 dsl_binding.binding = 0;
11323 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11324 dsl_binding.descriptorCount = 1;
11325 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11326 dsl_binding.pImmutableSamplers = NULL;
11327
11328 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11329 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11330 ds_layout_ci.pNext = NULL;
11331 ds_layout_ci.bindingCount = 1;
11332 ds_layout_ci.pBindings = &dsl_binding;
11333
11334 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011335 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011336 ASSERT_VK_SUCCESS(err);
11337
11338 VkDescriptorSet descriptorSet;
11339 VkDescriptorSetAllocateInfo alloc_info = {};
11340 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11341 alloc_info.descriptorSetCount = 1;
11342 alloc_info.descriptorPool = ds_pool;
11343 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011344 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011345 ASSERT_VK_SUCCESS(err);
11346
11347 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011348 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011349 pipe_ms_state_ci.pNext = NULL;
11350 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11351 pipe_ms_state_ci.sampleShadingEnable = 0;
11352 pipe_ms_state_ci.minSampleShading = 1.0;
11353 pipe_ms_state_ci.pSampleMask = NULL;
11354
11355 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11356 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11357 pipeline_layout_ci.pNext = NULL;
11358 pipeline_layout_ci.setLayoutCount = 1;
11359 pipeline_layout_ci.pSetLayouts = &ds_layout;
11360
11361 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011362 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011363 ASSERT_VK_SUCCESS(err);
11364
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011365 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011366 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 -060011367 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011368 VkPipelineObj pipe(m_device);
11369 pipe.AddShader(&vs);
11370 pipe.AddShader(&fs);
11371 pipe.SetMSAA(&pipe_ms_state_ci);
11372 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011373 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011374
11375 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11376 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11377 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11378}
Mark Young29927482016-05-04 14:38:51 -060011379
Mark Muellerd4914412016-06-13 17:52:06 -060011380TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011381 TEST_DESCRIPTION(
11382 "Points to a wrong colorAttachment index in a VkClearAttachment "
11383 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011384 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011386
11387 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11388 m_errorMonitor->VerifyFound();
11389}
11390
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011391TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011392 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11393 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011394
Tony Barbour1fa09702017-03-16 12:09:08 -060011395 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011397
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011398 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011399 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11400 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011401
11402 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011403 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11404 ds_pool_ci.pNext = NULL;
11405 ds_pool_ci.maxSets = 1;
11406 ds_pool_ci.poolSizeCount = 1;
11407 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011408
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011409 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011410 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011411 ASSERT_VK_SUCCESS(err);
11412
Tony Barboureb254902015-07-15 12:50:33 -060011413 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011414 dsl_binding.binding = 0;
11415 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11416 dsl_binding.descriptorCount = 1;
11417 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11418 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011419
Tony Barboureb254902015-07-15 12:50:33 -060011420 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011421 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11422 ds_layout_ci.pNext = NULL;
11423 ds_layout_ci.bindingCount = 1;
11424 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011425
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011426 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011427 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011428 ASSERT_VK_SUCCESS(err);
11429
11430 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011431 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011432 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011433 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011434 alloc_info.descriptorPool = ds_pool;
11435 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011436 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011437 ASSERT_VK_SUCCESS(err);
11438
Tony Barboureb254902015-07-15 12:50:33 -060011439 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011440 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011441 pipe_ms_state_ci.pNext = NULL;
11442 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11443 pipe_ms_state_ci.sampleShadingEnable = 0;
11444 pipe_ms_state_ci.minSampleShading = 1.0;
11445 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011446
Tony Barboureb254902015-07-15 12:50:33 -060011447 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011448 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11449 pipeline_layout_ci.pNext = NULL;
11450 pipeline_layout_ci.setLayoutCount = 1;
11451 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011452
11453 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011454 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011455 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011456
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011457 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011458 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011459 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011460 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011461
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011462 VkPipelineObj pipe(m_device);
11463 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011464 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011465 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011466 pipe.SetMSAA(&pipe_ms_state_ci);
11467 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011468
Tony Barbour552f6c02016-12-21 14:34:07 -070011469 m_commandBuffer->BeginCommandBuffer();
11470 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011471
Karl Schultz6addd812016-02-02 17:17:23 -070011472 // Main thing we care about for this test is that the VkImage obj we're
11473 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011474 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011475 VkClearAttachment color_attachment;
11476 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11477 color_attachment.clearValue.color.float32[0] = 1.0;
11478 color_attachment.clearValue.color.float32[1] = 1.0;
11479 color_attachment.clearValue.color.float32[2] = 1.0;
11480 color_attachment.clearValue.color.float32[3] = 1.0;
11481 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011482 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011483
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011484 // Call for full-sized FB Color attachment prior to issuing a Draw
11485 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011486 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011487 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011488 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011489
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011490 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11491 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11493 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11494 m_errorMonitor->VerifyFound();
11495
11496 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11497 clear_rect.layerCount = 2;
11498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11499 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011500 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011501
Chia-I Wuf7458c52015-10-26 21:10:41 +080011502 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11503 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11504 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011505}
11506
Karl Schultz6addd812016-02-02 17:17:23 -070011507TEST_F(VkLayerTest, VtxBufferBadIndex) {
11508 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011509
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11511 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011512
Tony Barbour1fa09702017-03-16 12:09:08 -060011513 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011514 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011515 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011516
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011517 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011518 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11519 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011520
11521 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011522 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11523 ds_pool_ci.pNext = NULL;
11524 ds_pool_ci.maxSets = 1;
11525 ds_pool_ci.poolSizeCount = 1;
11526 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011527
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011528 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011529 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011530 ASSERT_VK_SUCCESS(err);
11531
Tony Barboureb254902015-07-15 12:50:33 -060011532 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011533 dsl_binding.binding = 0;
11534 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11535 dsl_binding.descriptorCount = 1;
11536 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11537 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011538
Tony Barboureb254902015-07-15 12:50:33 -060011539 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011540 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11541 ds_layout_ci.pNext = NULL;
11542 ds_layout_ci.bindingCount = 1;
11543 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011544
Tobin Ehlis502480b2015-06-24 15:53:07 -060011545 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011546 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011547 ASSERT_VK_SUCCESS(err);
11548
11549 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011550 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011551 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011552 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011553 alloc_info.descriptorPool = ds_pool;
11554 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011555 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011556 ASSERT_VK_SUCCESS(err);
11557
Tony Barboureb254902015-07-15 12:50:33 -060011558 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011559 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011560 pipe_ms_state_ci.pNext = NULL;
11561 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11562 pipe_ms_state_ci.sampleShadingEnable = 0;
11563 pipe_ms_state_ci.minSampleShading = 1.0;
11564 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011565
Tony Barboureb254902015-07-15 12:50:33 -060011566 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011567 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11568 pipeline_layout_ci.pNext = NULL;
11569 pipeline_layout_ci.setLayoutCount = 1;
11570 pipeline_layout_ci.pSetLayouts = &ds_layout;
11571 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011572
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011573 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011574 ASSERT_VK_SUCCESS(err);
11575
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011576 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011577 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 -060011578 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011579 VkPipelineObj pipe(m_device);
11580 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011581 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011582 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011583 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011584 pipe.SetViewport(m_viewports);
11585 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011586 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011587
Tony Barbour552f6c02016-12-21 14:34:07 -070011588 m_commandBuffer->BeginCommandBuffer();
11589 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011590 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011591 // Don't care about actual data, just need to get to draw to flag error
11592 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011593 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011594 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011595 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011596
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011597 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011598
Chia-I Wuf7458c52015-10-26 21:10:41 +080011599 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11600 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11601 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011602}
Mark Muellerdfe37552016-07-07 14:47:42 -060011603
Mark Mueller2ee294f2016-08-04 12:59:48 -060011604TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011605 TEST_DESCRIPTION(
11606 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11607 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011608 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011609
Mark Mueller880fce52016-08-17 15:23:23 -060011610 // The following test fails with recent NVidia drivers.
11611 // By the time core_validation is reached, the NVidia
11612 // driver has sanitized the invalid condition and core_validation
11613 // is not introduced to the failure condition. This is not the case
11614 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011615 // uint32_t count = static_cast<uint32_t>(~0);
11616 // VkPhysicalDevice physical_device;
11617 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11618 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011619
Mark Mueller2ee294f2016-08-04 12:59:48 -060011620 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011621 VkDeviceQueueCreateInfo queue_create_info = {};
11622 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11623 queue_create_info.queueCount = 1;
11624 queue_create_info.pQueuePriorities = &queue_priority;
11625 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11626
11627 VkPhysicalDeviceFeatures features = m_device->phy().features();
11628 VkDevice testDevice;
11629 VkDeviceCreateInfo device_create_info = {};
11630 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11631 device_create_info.queueCreateInfoCount = 1;
11632 device_create_info.pQueueCreateInfos = &queue_create_info;
11633 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011634
11635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11636 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011637 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11638 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11639 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011640 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11641 m_errorMonitor->VerifyFound();
11642
11643 queue_create_info.queueFamilyIndex = 1;
11644
11645 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11646 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11647 for (unsigned i = 0; i < feature_count; i++) {
11648 if (VK_FALSE == feature_array[i]) {
11649 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011650 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11652 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011653 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11654 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11655 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11657 "You requested features that are unavailable on this device. You should first "
11658 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011659 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11660 m_errorMonitor->VerifyFound();
11661 break;
11662 }
11663 }
11664}
11665
Tobin Ehlis16edf082016-11-21 12:33:49 -070011666TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11667 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11668
Tony Barbour1fa09702017-03-16 12:09:08 -060011669 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011670
11671 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11672 std::vector<VkDeviceQueueCreateInfo> queue_info;
11673 queue_info.reserve(queue_props.size());
11674 std::vector<std::vector<float>> queue_priorities;
11675 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11676 VkDeviceQueueCreateInfo qi{};
11677 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11678 qi.queueFamilyIndex = i;
11679 qi.queueCount = queue_props[i].queueCount;
11680 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11681 qi.pQueuePriorities = queue_priorities[i].data();
11682 queue_info.push_back(qi);
11683 }
11684
11685 std::vector<const char *> device_extension_names;
11686
11687 VkDevice local_device;
11688 VkDeviceCreateInfo device_create_info = {};
11689 auto features = m_device->phy().features();
11690 // Intentionally disable pipeline stats
11691 features.pipelineStatisticsQuery = VK_FALSE;
11692 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11693 device_create_info.pNext = NULL;
11694 device_create_info.queueCreateInfoCount = queue_info.size();
11695 device_create_info.pQueueCreateInfos = queue_info.data();
11696 device_create_info.enabledLayerCount = 0;
11697 device_create_info.ppEnabledLayerNames = NULL;
11698 device_create_info.pEnabledFeatures = &features;
11699 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11700 ASSERT_VK_SUCCESS(err);
11701
11702 VkQueryPoolCreateInfo qpci{};
11703 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11704 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11705 qpci.queryCount = 1;
11706 VkQueryPool query_pool;
11707
11708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11709 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11710 m_errorMonitor->VerifyFound();
11711
11712 vkDestroyDevice(local_device, nullptr);
11713}
11714
Mark Mueller2ee294f2016-08-04 12:59:48 -060011715TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011716 TEST_DESCRIPTION(
11717 "Use an invalid queue index in a vkCmdWaitEvents call."
11718 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011719
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011720 const char *invalid_queue_index =
11721 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11722 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11723 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011724
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011725 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011728
Tony Barbour1fa09702017-03-16 12:09:08 -060011729 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011730
11731 VkEvent event;
11732 VkEventCreateInfo event_create_info{};
11733 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11734 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11735
Mark Mueller2ee294f2016-08-04 12:59:48 -060011736 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011737 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011738
Tony Barbour552f6c02016-12-21 14:34:07 -070011739 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011740
11741 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060011742 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 -060011743 ASSERT_TRUE(image.initialized());
11744 VkImageMemoryBarrier img_barrier = {};
11745 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11746 img_barrier.pNext = NULL;
11747 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11748 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11749 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11750 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11751 img_barrier.image = image.handle();
11752 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011753
11754 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11755 // that layer validation catches the case when it is not.
11756 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011757 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11758 img_barrier.subresourceRange.baseArrayLayer = 0;
11759 img_barrier.subresourceRange.baseMipLevel = 0;
11760 img_barrier.subresourceRange.layerCount = 1;
11761 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011762 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11763 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011764 m_errorMonitor->VerifyFound();
11765
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011767
11768 VkQueryPool query_pool;
11769 VkQueryPoolCreateInfo query_pool_create_info = {};
11770 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11771 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11772 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011773 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011774
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011775 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011776 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11777
11778 vkEndCommandBuffer(m_commandBuffer->handle());
11779 m_errorMonitor->VerifyFound();
11780
11781 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11782 vkDestroyEvent(m_device->device(), event, nullptr);
11783}
11784
Mark Muellerdfe37552016-07-07 14:47:42 -060011785TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011786 TEST_DESCRIPTION(
11787 "Submit a command buffer using deleted vertex buffer, "
11788 "delete a buffer twice, use an invalid offset for each "
11789 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011790
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011791 const char *deleted_buffer_in_command_buffer =
11792 "Cannot submit cmd buffer "
11793 "using deleted buffer ";
11794 const char *invalid_offset_message =
11795 "vkBindBufferMemory(): "
11796 "memoryOffset is 0x";
11797 const char *invalid_storage_buffer_offset_message =
11798 "vkBindBufferMemory(): "
11799 "storage memoryOffset "
11800 "is 0x";
11801 const char *invalid_texel_buffer_offset_message =
11802 "vkBindBufferMemory(): "
11803 "texel memoryOffset "
11804 "is 0x";
11805 const char *invalid_uniform_buffer_offset_message =
11806 "vkBindBufferMemory(): "
11807 "uniform memoryOffset "
11808 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011809
Tony Barbour1fa09702017-03-16 12:09:08 -060011810 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011811 ASSERT_NO_FATAL_FAILURE(InitViewport());
11812 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11813
11814 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011815 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011816 pipe_ms_state_ci.pNext = NULL;
11817 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11818 pipe_ms_state_ci.sampleShadingEnable = 0;
11819 pipe_ms_state_ci.minSampleShading = 1.0;
11820 pipe_ms_state_ci.pSampleMask = nullptr;
11821
11822 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11823 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11824 VkPipelineLayout pipeline_layout;
11825
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011826 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011827 ASSERT_VK_SUCCESS(err);
11828
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011829 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11830 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011831 VkPipelineObj pipe(m_device);
11832 pipe.AddShader(&vs);
11833 pipe.AddShader(&fs);
11834 pipe.AddColorAttachment();
11835 pipe.SetMSAA(&pipe_ms_state_ci);
11836 pipe.SetViewport(m_viewports);
11837 pipe.SetScissor(m_scissors);
11838 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11839
Tony Barbour552f6c02016-12-21 14:34:07 -070011840 m_commandBuffer->BeginCommandBuffer();
11841 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011842 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011843
11844 {
11845 // Create and bind a vertex buffer in a reduced scope, which will cause
11846 // it to be deleted upon leaving this scope
11847 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011848 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011849 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11850 draw_verticies.AddVertexInputToPipe(pipe);
11851 }
11852
11853 Draw(1, 0, 0, 0);
11854
Tony Barbour552f6c02016-12-21 14:34:07 -070011855 m_commandBuffer->EndRenderPass();
11856 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011857
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011859 QueueCommandBuffer(false);
11860 m_errorMonitor->VerifyFound();
11861
11862 {
11863 // Create and bind a vertex buffer in a reduced scope, and delete it
11864 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011865 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011867 buffer_test.TestDoubleDestroy();
11868 }
11869 m_errorMonitor->VerifyFound();
11870
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011871 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011872 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011873 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011875 m_errorMonitor->SetUnexpectedError(
11876 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11877 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011878 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11879 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011880 m_errorMonitor->VerifyFound();
11881 }
11882
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011883 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11884 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011885 // Create and bind a memory buffer with an invalid offset again,
11886 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011888 m_errorMonitor->SetUnexpectedError(
11889 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11890 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011891 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11892 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011893 m_errorMonitor->VerifyFound();
11894 }
11895
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011896 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011897 // Create and bind a memory buffer with an invalid offset again, but
11898 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011900 m_errorMonitor->SetUnexpectedError(
11901 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11902 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011903 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11904 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011905 m_errorMonitor->VerifyFound();
11906 }
11907
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011908 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011909 // Create and bind a memory buffer with an invalid offset again, but
11910 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011912 m_errorMonitor->SetUnexpectedError(
11913 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11914 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011915 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11916 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011917 m_errorMonitor->VerifyFound();
11918 }
11919
11920 {
11921 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011923 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11924 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011925 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11926 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011927 m_errorMonitor->VerifyFound();
11928 }
11929
11930 {
11931 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011933 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11934 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011935 }
11936 m_errorMonitor->VerifyFound();
11937
11938 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11939}
11940
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011941// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11942TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011943 TEST_DESCRIPTION(
11944 "Hit all possible validation checks associated with the "
11945 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11946 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011947 // 3 in ValidateCmdBufImageLayouts
11948 // * -1 Attempt to submit cmd buf w/ deleted image
11949 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11950 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011951
Tony Barbour1fa09702017-03-16 12:09:08 -060011952 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011953 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011954 if (!depth_format) {
11955 printf(" No Depth + Stencil format found. Skipped.\n");
11956 return;
11957 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011958 // Create src & dst images to use for copy operations
11959 VkImage src_image;
11960 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011961 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011962
11963 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11964 const int32_t tex_width = 32;
11965 const int32_t tex_height = 32;
11966
11967 VkImageCreateInfo image_create_info = {};
11968 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11969 image_create_info.pNext = NULL;
11970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11971 image_create_info.format = tex_format;
11972 image_create_info.extent.width = tex_width;
11973 image_create_info.extent.height = tex_height;
11974 image_create_info.extent.depth = 1;
11975 image_create_info.mipLevels = 1;
11976 image_create_info.arrayLayers = 4;
11977 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11978 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11979 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011980 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011981 image_create_info.flags = 0;
11982
11983 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11984 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011985 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011986 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11987 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011988 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11989 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11990 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11991 ASSERT_VK_SUCCESS(err);
11992
11993 // Allocate memory
11994 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011995 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011996 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011997 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11998 mem_alloc.pNext = NULL;
11999 mem_alloc.allocationSize = 0;
12000 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080012001
12002 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012003 mem_alloc.allocationSize = img_mem_reqs.size;
12004 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012005 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080012006 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080012007 ASSERT_VK_SUCCESS(err);
12008
12009 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012010 mem_alloc.allocationSize = img_mem_reqs.size;
12011 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012012 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012013 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080012014 ASSERT_VK_SUCCESS(err);
12015
12016 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080012017 mem_alloc.allocationSize = img_mem_reqs.size;
12018 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080012019 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012020 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012021 ASSERT_VK_SUCCESS(err);
12022
12023 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12024 ASSERT_VK_SUCCESS(err);
12025 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12026 ASSERT_VK_SUCCESS(err);
12027 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12028 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012029
Tony Barbour552f6c02016-12-21 14:34:07 -070012030 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012031 VkImageCopy copy_region;
12032 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12033 copy_region.srcSubresource.mipLevel = 0;
12034 copy_region.srcSubresource.baseArrayLayer = 0;
12035 copy_region.srcSubresource.layerCount = 1;
12036 copy_region.srcOffset.x = 0;
12037 copy_region.srcOffset.y = 0;
12038 copy_region.srcOffset.z = 0;
12039 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12040 copy_region.dstSubresource.mipLevel = 0;
12041 copy_region.dstSubresource.baseArrayLayer = 0;
12042 copy_region.dstSubresource.layerCount = 1;
12043 copy_region.dstOffset.x = 0;
12044 copy_region.dstOffset.y = 0;
12045 copy_region.dstOffset.z = 0;
12046 copy_region.extent.width = 1;
12047 copy_region.extent.height = 1;
12048 copy_region.extent.depth = 1;
12049
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12051 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12052 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012053
Cort530cf382016-12-08 09:59:47 -080012054 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 -060012055 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012056 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12057 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012058 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12059 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012060 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 -060012061 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012063 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12064 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012065 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080012066 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 -060012067 m_errorMonitor->VerifyFound();
12068 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012070 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012071 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012072 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012073 "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 -080012074 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 -060012075 m_errorMonitor->VerifyFound();
12076 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12078 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12079 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012080 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 -060012081 m_errorMonitor->VerifyFound();
12082 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012084 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012085 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012086 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012087 "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 -080012088 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 -060012089 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012091 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12092 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012093 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012094 "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 -080012095 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 -060012096 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012097
Cort3b021012016-12-07 12:00:57 -080012098 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12099 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12100 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12101 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12102 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12103 transfer_dst_image_barrier[0].srcAccessMask = 0;
12104 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12105 transfer_dst_image_barrier[0].image = dst_image;
12106 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12107 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12108 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12109 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12110 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12111 transfer_dst_image_barrier[0].image = depth_image;
12112 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12113 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12114 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12115
12116 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012117 VkClearColorValue color_clear_value = {};
12118 VkImageSubresourceRange clear_range;
12119 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12120 clear_range.baseMipLevel = 0;
12121 clear_range.baseArrayLayer = 0;
12122 clear_range.layerCount = 1;
12123 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012124
Cort3b021012016-12-07 12:00:57 -080012125 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12126 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012129 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012130 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012131 // Fail due to provided layout not matching actual current layout for color clear.
12132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012133 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012134 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012135
Cort530cf382016-12-08 09:59:47 -080012136 VkClearDepthStencilValue depth_clear_value = {};
12137 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012138
12139 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12140 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12141 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012143 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012144 m_errorMonitor->VerifyFound();
12145 // Fail due to provided layout not matching actual current layout for depth clear.
12146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012147 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012148 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012149
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012150 // Now cause error due to bad image layout transition in PipelineBarrier
12151 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012152 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012153 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012154 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012155 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012156 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12157 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012158 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012160 "you cannot transition the layout of aspect 1 from "
12161 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12162 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012164 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12165 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012166 m_errorMonitor->VerifyFound();
12167
12168 // Finally some layout errors at RenderPass create time
12169 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12170 VkAttachmentReference attach = {};
12171 // perf warning for GENERAL layout w/ non-DS input attachment
12172 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12173 VkSubpassDescription subpass = {};
12174 subpass.inputAttachmentCount = 1;
12175 subpass.pInputAttachments = &attach;
12176 VkRenderPassCreateInfo rpci = {};
12177 rpci.subpassCount = 1;
12178 rpci.pSubpasses = &subpass;
12179 rpci.attachmentCount = 1;
12180 VkAttachmentDescription attach_desc = {};
12181 attach_desc.format = VK_FORMAT_UNDEFINED;
12182 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012183 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012184 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12186 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012187 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12188 m_errorMonitor->VerifyFound();
12189 // error w/ non-general layout
12190 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12191
12192 m_errorMonitor->SetDesiredFailureMsg(
12193 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12194 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12195 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12196 m_errorMonitor->VerifyFound();
12197 subpass.inputAttachmentCount = 0;
12198 subpass.colorAttachmentCount = 1;
12199 subpass.pColorAttachments = &attach;
12200 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12201 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12203 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012204 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12205 m_errorMonitor->VerifyFound();
12206 // error w/ non-color opt or GENERAL layout for color attachment
12207 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12208 m_errorMonitor->SetDesiredFailureMsg(
12209 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12210 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12211 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12212 m_errorMonitor->VerifyFound();
12213 subpass.colorAttachmentCount = 0;
12214 subpass.pDepthStencilAttachment = &attach;
12215 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12216 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12218 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012219 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12220 m_errorMonitor->VerifyFound();
12221 // error w/ non-ds opt or GENERAL layout for color attachment
12222 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12224 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12225 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012226 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12227 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012228 // For this error we need a valid renderpass so create default one
12229 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12230 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012231 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012232 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12233 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12234 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12235 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12236 // Can't do a CLEAR load on READ_ONLY initialLayout
12237 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12238 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12239 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012241 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012242 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12243 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012244
Cort3b021012016-12-07 12:00:57 -080012245 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12246 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12247 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012248 vkDestroyImage(m_device->device(), src_image, NULL);
12249 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012250 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012251}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012252
Tobin Ehlise0936662016-10-11 08:10:51 -060012253TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12254 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12255 VkResult err;
12256
Tony Barbour1fa09702017-03-16 12:09:08 -060012257 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012258
12259 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12260 VkImageTiling tiling;
12261 VkFormatProperties format_properties;
12262 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12263 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12264 tiling = VK_IMAGE_TILING_LINEAR;
12265 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12266 tiling = VK_IMAGE_TILING_OPTIMAL;
12267 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012268 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012269 return;
12270 }
12271
12272 VkDescriptorPoolSize ds_type = {};
12273 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12274 ds_type.descriptorCount = 1;
12275
12276 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12277 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12278 ds_pool_ci.maxSets = 1;
12279 ds_pool_ci.poolSizeCount = 1;
12280 ds_pool_ci.pPoolSizes = &ds_type;
12281 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12282
12283 VkDescriptorPool ds_pool;
12284 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12285 ASSERT_VK_SUCCESS(err);
12286
12287 VkDescriptorSetLayoutBinding dsl_binding = {};
12288 dsl_binding.binding = 0;
12289 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12290 dsl_binding.descriptorCount = 1;
12291 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12292 dsl_binding.pImmutableSamplers = NULL;
12293
12294 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12295 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12296 ds_layout_ci.pNext = NULL;
12297 ds_layout_ci.bindingCount = 1;
12298 ds_layout_ci.pBindings = &dsl_binding;
12299
12300 VkDescriptorSetLayout ds_layout;
12301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12302 ASSERT_VK_SUCCESS(err);
12303
12304 VkDescriptorSetAllocateInfo alloc_info = {};
12305 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12306 alloc_info.descriptorSetCount = 1;
12307 alloc_info.descriptorPool = ds_pool;
12308 alloc_info.pSetLayouts = &ds_layout;
12309 VkDescriptorSet descriptor_set;
12310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12311 ASSERT_VK_SUCCESS(err);
12312
12313 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12314 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12315 pipeline_layout_ci.pNext = NULL;
12316 pipeline_layout_ci.setLayoutCount = 1;
12317 pipeline_layout_ci.pSetLayouts = &ds_layout;
12318 VkPipelineLayout pipeline_layout;
12319 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12320 ASSERT_VK_SUCCESS(err);
12321
12322 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012323 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012324 ASSERT_TRUE(image.initialized());
12325 VkImageView view = image.targetView(tex_format);
12326
12327 VkDescriptorImageInfo image_info = {};
12328 image_info.imageView = view;
12329 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12330
12331 VkWriteDescriptorSet descriptor_write = {};
12332 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12333 descriptor_write.dstSet = descriptor_set;
12334 descriptor_write.dstBinding = 0;
12335 descriptor_write.descriptorCount = 1;
12336 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12337 descriptor_write.pImageInfo = &image_info;
12338
12339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12340 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12341 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12342 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12343 m_errorMonitor->VerifyFound();
12344
12345 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12346 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12347 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12348 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12349}
12350
Mark Mueller93b938f2016-08-18 10:27:40 -060012351TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012352 TEST_DESCRIPTION(
12353 "Use vkCmdExecuteCommands with invalid state "
12354 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012355
Tony Barbour1fa09702017-03-16 12:09:08 -060012356 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012357 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12358
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012359 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012360 const char *simultaneous_use_message2 =
12361 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12362 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012363
12364 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012365 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012366 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012367 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12368 command_buffer_allocate_info.commandBufferCount = 1;
12369
12370 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012371 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012372 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12373 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012374 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012375 command_buffer_inheritance_info.renderPass = m_renderPass;
12376 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012377
Mark Mueller93b938f2016-08-18 10:27:40 -060012378 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012379 command_buffer_begin_info.flags =
12380 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012381 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12382
12383 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12384 vkEndCommandBuffer(secondary_command_buffer);
12385
Mark Mueller93b938f2016-08-18 10:27:40 -060012386 VkSubmitInfo submit_info = {};
12387 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12388 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012389 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012390
Mark Mueller4042b652016-09-05 22:52:21 -060012391 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012392 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12394 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012395 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012396 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012397 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12398 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012399
Dave Houltonfbf52152017-01-06 12:55:29 -070012400 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012401 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012402 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012403
Mark Mueller4042b652016-09-05 22:52:21 -060012404 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012405 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012406 m_errorMonitor->SetUnexpectedError(
12407 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12408 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012409 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012410 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012411
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12413 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012414 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012415 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12416 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012417
12418 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012419
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012420 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012421}
12422
Tony Barbour626994c2017-02-08 15:29:37 -070012423TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12424 TEST_DESCRIPTION(
12425 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12426 "errors");
12427 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12428 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 -060012429 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012430
12431 VkCommandBuffer cmd_bufs[2];
12432 VkCommandBufferAllocateInfo alloc_info;
12433 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12434 alloc_info.pNext = NULL;
12435 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012436 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012437 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12438 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12439
12440 VkCommandBufferBeginInfo cb_binfo;
12441 cb_binfo.pNext = NULL;
12442 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12443 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12444 cb_binfo.flags = 0;
12445 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12446 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12447 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12448 vkEndCommandBuffer(cmd_bufs[0]);
12449 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12450
12451 VkSubmitInfo submit_info = {};
12452 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12453 submit_info.commandBufferCount = 2;
12454 submit_info.pCommandBuffers = duplicates;
12455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12456 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12457 m_errorMonitor->VerifyFound();
12458 vkQueueWaitIdle(m_device->m_queue);
12459
12460 // Set one time use and now look for one time submit
12461 duplicates[0] = duplicates[1] = cmd_bufs[1];
12462 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12463 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12464 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12465 vkEndCommandBuffer(cmd_bufs[1]);
12466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12467 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12468 m_errorMonitor->VerifyFound();
12469 vkQueueWaitIdle(m_device->m_queue);
12470}
12471
Tobin Ehlisb093da82017-01-19 12:05:27 -070012472TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012473 TEST_DESCRIPTION(
12474 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12475 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012476
Tony Barbour1fa09702017-03-16 12:09:08 -060012477 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012478 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12479
12480 std::vector<const char *> device_extension_names;
12481 auto features = m_device->phy().features();
12482 // Make sure gs & ts are disabled
12483 features.geometryShader = false;
12484 features.tessellationShader = false;
12485 // The sacrificial device object
12486 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12487
12488 VkCommandPoolCreateInfo pool_create_info{};
12489 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12490 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12491
12492 VkCommandPool command_pool;
12493 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12494
12495 VkCommandBufferAllocateInfo cmd = {};
12496 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12497 cmd.pNext = NULL;
12498 cmd.commandPool = command_pool;
12499 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12500 cmd.commandBufferCount = 1;
12501
12502 VkCommandBuffer cmd_buffer;
12503 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12504 ASSERT_VK_SUCCESS(err);
12505
12506 VkEvent event;
12507 VkEventCreateInfo evci = {};
12508 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12509 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12510 ASSERT_VK_SUCCESS(result);
12511
12512 VkCommandBufferBeginInfo cbbi = {};
12513 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12514 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12516 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12517 m_errorMonitor->VerifyFound();
12518
12519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12520 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12521 m_errorMonitor->VerifyFound();
12522
12523 vkDestroyEvent(test_device.handle(), event, NULL);
12524 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12525}
12526
Chris Forbesd70103a2017-04-13 11:34:09 -070012527TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012528 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12530
Tony Barbour552f6c02016-12-21 14:34:07 -070012531 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012532
12533 VkEvent event;
12534 VkEventCreateInfo event_create_info = {};
12535 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12536 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012537 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012538
Tony Barbour552f6c02016-12-21 14:34:07 -070012539 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012540 vkDestroyEvent(m_device->device(), event, nullptr);
12541
12542 VkSubmitInfo submit_info = {};
12543 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12544 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012545 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012547 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12548 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070012549}
Mark Muellerc8d441e2016-08-23 17:36:00 -060012550
Chris Forbesd70103a2017-04-13 11:34:09 -070012551TEST_F(VkLayerTest, InUseDestroyedSignaled) {
12552 TEST_DESCRIPTION(
12553 "Use vkCmdExecuteCommands with invalid state "
12554 "in primary and secondary command buffers. "
12555 "Delete objects that are inuse. Call VkQueueSubmit "
12556 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012557
Chris Forbesd70103a2017-04-13 11:34:09 -070012558 ASSERT_NO_FATAL_FAILURE(Init());
12559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12560
12561 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012562
Mark Mueller917f6bc2016-08-30 10:57:19 -060012563 VkSemaphoreCreateInfo semaphore_create_info = {};
12564 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12565 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012566 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012567 VkFenceCreateInfo fence_create_info = {};
12568 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12569 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012570 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012571
12572 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012573 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012574 descriptor_pool_type_count.descriptorCount = 1;
12575
12576 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12577 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12578 descriptor_pool_create_info.maxSets = 1;
12579 descriptor_pool_create_info.poolSizeCount = 1;
12580 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012581 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012582
12583 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012584 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012585
12586 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012587 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012588 descriptorset_layout_binding.descriptorCount = 1;
12589 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12590
12591 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012592 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012593 descriptorset_layout_create_info.bindingCount = 1;
12594 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12595
12596 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012597 ASSERT_VK_SUCCESS(
12598 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012599
12600 VkDescriptorSet descriptorset;
12601 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012602 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012603 descriptorset_allocate_info.descriptorSetCount = 1;
12604 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12605 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012606 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012607
Mark Mueller4042b652016-09-05 22:52:21 -060012608 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12609
12610 VkDescriptorBufferInfo buffer_info = {};
12611 buffer_info.buffer = buffer_test.GetBuffer();
12612 buffer_info.offset = 0;
12613 buffer_info.range = 1024;
12614
12615 VkWriteDescriptorSet write_descriptor_set = {};
12616 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12617 write_descriptor_set.dstSet = descriptorset;
12618 write_descriptor_set.descriptorCount = 1;
12619 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12620 write_descriptor_set.pBufferInfo = &buffer_info;
12621
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012622 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012624 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12625 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012626
12627 VkPipelineObj pipe(m_device);
12628 pipe.AddColorAttachment();
12629 pipe.AddShader(&vs);
12630 pipe.AddShader(&fs);
12631
12632 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012633 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012634 pipeline_layout_create_info.setLayoutCount = 1;
12635 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12636
12637 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012638 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012639
12640 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12641
Chris Forbesd70103a2017-04-13 11:34:09 -070012642 VkEvent event;
12643 VkEventCreateInfo event_create_info = {};
12644 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12645 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12646
Tony Barbour552f6c02016-12-21 14:34:07 -070012647 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070012648
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012649 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012650
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012651 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12652 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12653 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012654
Tony Barbour552f6c02016-12-21 14:34:07 -070012655 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012656
Chris Forbesd70103a2017-04-13 11:34:09 -070012657 VkSubmitInfo submit_info = {};
12658 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12659 submit_info.commandBufferCount = 1;
12660 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012661 submit_info.signalSemaphoreCount = 1;
12662 submit_info.pSignalSemaphores = &semaphore;
12663 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012664 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012665
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012667 vkDestroyEvent(m_device->device(), event, nullptr);
12668 m_errorMonitor->VerifyFound();
12669
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012671 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12672 m_errorMonitor->VerifyFound();
12673
Jeremy Hayes08369882017-02-02 10:31:06 -070012674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012675 vkDestroyFence(m_device->device(), fence, nullptr);
12676 m_errorMonitor->VerifyFound();
12677
Tobin Ehlis122207b2016-09-01 08:50:06 -070012678 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012679 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12680 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012681 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012682 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12683 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012684 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012685 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12686 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012687 vkDestroyEvent(m_device->device(), event, nullptr);
12688 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012689 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012690 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12691}
12692
Tobin Ehlis2adda372016-09-01 08:51:06 -070012693TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12694 TEST_DESCRIPTION("Delete in-use query pool.");
12695
Tony Barbour1fa09702017-03-16 12:09:08 -060012696 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012697 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12698
12699 VkQueryPool query_pool;
12700 VkQueryPoolCreateInfo query_pool_ci{};
12701 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12702 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12703 query_pool_ci.queryCount = 1;
12704 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012705 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012706 // Reset query pool to create binding with cmd buffer
12707 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12708
Tony Barbour552f6c02016-12-21 14:34:07 -070012709 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012710
12711 VkSubmitInfo submit_info = {};
12712 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12713 submit_info.commandBufferCount = 1;
12714 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12715 // Submit cmd buffer and then destroy query pool while in-flight
12716 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12717
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012719 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12720 m_errorMonitor->VerifyFound();
12721
12722 vkQueueWaitIdle(m_device->m_queue);
12723 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012724 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012725 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012726 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12727}
12728
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012729TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12730 TEST_DESCRIPTION("Delete in-use pipeline.");
12731
Tony Barbour1fa09702017-03-16 12:09:08 -060012732 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12734
12735 // Empty pipeline layout used for binding PSO
12736 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12737 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12738 pipeline_layout_ci.setLayoutCount = 0;
12739 pipeline_layout_ci.pSetLayouts = NULL;
12740
12741 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012742 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012743 ASSERT_VK_SUCCESS(err);
12744
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012746 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012747 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12748 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012749 // Store pipeline handle so we can actually delete it before test finishes
12750 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012751 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012752 VkPipelineObj pipe(m_device);
12753 pipe.AddShader(&vs);
12754 pipe.AddShader(&fs);
12755 pipe.AddColorAttachment();
12756 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12757 delete_this_pipeline = pipe.handle();
12758
Tony Barbour552f6c02016-12-21 14:34:07 -070012759 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012760 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012761 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012762
Tony Barbour552f6c02016-12-21 14:34:07 -070012763 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012764
12765 VkSubmitInfo submit_info = {};
12766 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12767 submit_info.commandBufferCount = 1;
12768 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12769 // Submit cmd buffer and then pipeline destroyed while in-flight
12770 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012771 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012772 m_errorMonitor->VerifyFound();
12773 // Make sure queue finished and then actually delete pipeline
12774 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012775 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12776 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012777 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12778 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12779}
12780
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012781TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12782 TEST_DESCRIPTION("Delete in-use imageView.");
12783
Tony Barbour1fa09702017-03-16 12:09:08 -060012784 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012785 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12786
12787 VkDescriptorPoolSize ds_type_count;
12788 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12789 ds_type_count.descriptorCount = 1;
12790
12791 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12792 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12793 ds_pool_ci.maxSets = 1;
12794 ds_pool_ci.poolSizeCount = 1;
12795 ds_pool_ci.pPoolSizes = &ds_type_count;
12796
12797 VkDescriptorPool ds_pool;
12798 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12799 ASSERT_VK_SUCCESS(err);
12800
12801 VkSamplerCreateInfo sampler_ci = {};
12802 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12803 sampler_ci.pNext = NULL;
12804 sampler_ci.magFilter = VK_FILTER_NEAREST;
12805 sampler_ci.minFilter = VK_FILTER_NEAREST;
12806 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12807 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12808 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12809 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12810 sampler_ci.mipLodBias = 1.0;
12811 sampler_ci.anisotropyEnable = VK_FALSE;
12812 sampler_ci.maxAnisotropy = 1;
12813 sampler_ci.compareEnable = VK_FALSE;
12814 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12815 sampler_ci.minLod = 1.0;
12816 sampler_ci.maxLod = 1.0;
12817 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12818 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12819 VkSampler sampler;
12820
12821 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12822 ASSERT_VK_SUCCESS(err);
12823
12824 VkDescriptorSetLayoutBinding layout_binding;
12825 layout_binding.binding = 0;
12826 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12827 layout_binding.descriptorCount = 1;
12828 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12829 layout_binding.pImmutableSamplers = NULL;
12830
12831 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12832 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12833 ds_layout_ci.bindingCount = 1;
12834 ds_layout_ci.pBindings = &layout_binding;
12835 VkDescriptorSetLayout ds_layout;
12836 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12837 ASSERT_VK_SUCCESS(err);
12838
12839 VkDescriptorSetAllocateInfo alloc_info = {};
12840 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12841 alloc_info.descriptorSetCount = 1;
12842 alloc_info.descriptorPool = ds_pool;
12843 alloc_info.pSetLayouts = &ds_layout;
12844 VkDescriptorSet descriptor_set;
12845 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12846 ASSERT_VK_SUCCESS(err);
12847
12848 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12849 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12850 pipeline_layout_ci.pNext = NULL;
12851 pipeline_layout_ci.setLayoutCount = 1;
12852 pipeline_layout_ci.pSetLayouts = &ds_layout;
12853
12854 VkPipelineLayout pipeline_layout;
12855 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12856 ASSERT_VK_SUCCESS(err);
12857
12858 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012859 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 -060012860 ASSERT_TRUE(image.initialized());
12861
12862 VkImageView view;
12863 VkImageViewCreateInfo ivci = {};
12864 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12865 ivci.image = image.handle();
12866 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12867 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12868 ivci.subresourceRange.layerCount = 1;
12869 ivci.subresourceRange.baseMipLevel = 0;
12870 ivci.subresourceRange.levelCount = 1;
12871 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12872
12873 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12874 ASSERT_VK_SUCCESS(err);
12875
12876 VkDescriptorImageInfo image_info{};
12877 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12878 image_info.imageView = view;
12879 image_info.sampler = sampler;
12880
12881 VkWriteDescriptorSet descriptor_write = {};
12882 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12883 descriptor_write.dstSet = descriptor_set;
12884 descriptor_write.dstBinding = 0;
12885 descriptor_write.descriptorCount = 1;
12886 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12887 descriptor_write.pImageInfo = &image_info;
12888
12889 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12890
12891 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012892 char const *vsSource =
12893 "#version 450\n"
12894 "\n"
12895 "out gl_PerVertex { \n"
12896 " vec4 gl_Position;\n"
12897 "};\n"
12898 "void main(){\n"
12899 " gl_Position = vec4(1);\n"
12900 "}\n";
12901 char const *fsSource =
12902 "#version 450\n"
12903 "\n"
12904 "layout(set=0, binding=0) uniform sampler2D s;\n"
12905 "layout(location=0) out vec4 x;\n"
12906 "void main(){\n"
12907 " x = texture(s, vec2(1));\n"
12908 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012909 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12910 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12911 VkPipelineObj pipe(m_device);
12912 pipe.AddShader(&vs);
12913 pipe.AddShader(&fs);
12914 pipe.AddColorAttachment();
12915 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12916
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012918
Tony Barbour552f6c02016-12-21 14:34:07 -070012919 m_commandBuffer->BeginCommandBuffer();
12920 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012921 // Bind pipeline to cmd buffer
12922 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12923 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12924 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012925
12926 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12927 VkRect2D scissor = {{0, 0}, {16, 16}};
12928 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12929 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12930
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012931 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012932 m_commandBuffer->EndRenderPass();
12933 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012934 // Submit cmd buffer then destroy sampler
12935 VkSubmitInfo submit_info = {};
12936 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12937 submit_info.commandBufferCount = 1;
12938 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12939 // Submit cmd buffer and then destroy imageView while in-flight
12940 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12941
12942 vkDestroyImageView(m_device->device(), view, nullptr);
12943 m_errorMonitor->VerifyFound();
12944 vkQueueWaitIdle(m_device->m_queue);
12945 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012946 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012947 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012948 vkDestroyImageView(m_device->device(), view, NULL);
12949 vkDestroySampler(m_device->device(), sampler, nullptr);
12950 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12951 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12952 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12953}
12954
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012955TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12956 TEST_DESCRIPTION("Delete in-use bufferView.");
12957
Tony Barbour1fa09702017-03-16 12:09:08 -060012958 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12960
12961 VkDescriptorPoolSize ds_type_count;
12962 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12963 ds_type_count.descriptorCount = 1;
12964
12965 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12966 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12967 ds_pool_ci.maxSets = 1;
12968 ds_pool_ci.poolSizeCount = 1;
12969 ds_pool_ci.pPoolSizes = &ds_type_count;
12970
12971 VkDescriptorPool ds_pool;
12972 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12973 ASSERT_VK_SUCCESS(err);
12974
12975 VkDescriptorSetLayoutBinding layout_binding;
12976 layout_binding.binding = 0;
12977 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12978 layout_binding.descriptorCount = 1;
12979 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12980 layout_binding.pImmutableSamplers = NULL;
12981
12982 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12983 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12984 ds_layout_ci.bindingCount = 1;
12985 ds_layout_ci.pBindings = &layout_binding;
12986 VkDescriptorSetLayout ds_layout;
12987 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12988 ASSERT_VK_SUCCESS(err);
12989
12990 VkDescriptorSetAllocateInfo alloc_info = {};
12991 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12992 alloc_info.descriptorSetCount = 1;
12993 alloc_info.descriptorPool = ds_pool;
12994 alloc_info.pSetLayouts = &ds_layout;
12995 VkDescriptorSet descriptor_set;
12996 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12997 ASSERT_VK_SUCCESS(err);
12998
12999 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13000 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13001 pipeline_layout_ci.pNext = NULL;
13002 pipeline_layout_ci.setLayoutCount = 1;
13003 pipeline_layout_ci.pSetLayouts = &ds_layout;
13004
13005 VkPipelineLayout pipeline_layout;
13006 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
13007 ASSERT_VK_SUCCESS(err);
13008
13009 VkBuffer buffer;
13010 uint32_t queue_family_index = 0;
13011 VkBufferCreateInfo buffer_create_info = {};
13012 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
13013 buffer_create_info.size = 1024;
13014 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
13015 buffer_create_info.queueFamilyIndexCount = 1;
13016 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
13017
13018 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
13019 ASSERT_VK_SUCCESS(err);
13020
13021 VkMemoryRequirements memory_reqs;
13022 VkDeviceMemory buffer_memory;
13023
13024 VkMemoryAllocateInfo memory_info = {};
13025 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13026 memory_info.allocationSize = 0;
13027 memory_info.memoryTypeIndex = 0;
13028
13029 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13030 memory_info.allocationSize = memory_reqs.size;
13031 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13032 ASSERT_TRUE(pass);
13033
13034 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13035 ASSERT_VK_SUCCESS(err);
13036 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13037 ASSERT_VK_SUCCESS(err);
13038
13039 VkBufferView view;
13040 VkBufferViewCreateInfo bvci = {};
13041 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13042 bvci.buffer = buffer;
13043 bvci.format = VK_FORMAT_R8_UNORM;
13044 bvci.range = VK_WHOLE_SIZE;
13045
13046 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13047 ASSERT_VK_SUCCESS(err);
13048
13049 VkWriteDescriptorSet descriptor_write = {};
13050 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13051 descriptor_write.dstSet = descriptor_set;
13052 descriptor_write.dstBinding = 0;
13053 descriptor_write.descriptorCount = 1;
13054 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13055 descriptor_write.pTexelBufferView = &view;
13056
13057 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13058
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013059 char const *vsSource =
13060 "#version 450\n"
13061 "\n"
13062 "out gl_PerVertex { \n"
13063 " vec4 gl_Position;\n"
13064 "};\n"
13065 "void main(){\n"
13066 " gl_Position = vec4(1);\n"
13067 "}\n";
13068 char const *fsSource =
13069 "#version 450\n"
13070 "\n"
13071 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13072 "layout(location=0) out vec4 x;\n"
13073 "void main(){\n"
13074 " x = imageLoad(s, 0);\n"
13075 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013076 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13077 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13078 VkPipelineObj pipe(m_device);
13079 pipe.AddShader(&vs);
13080 pipe.AddShader(&fs);
13081 pipe.AddColorAttachment();
13082 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13083
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013085
Tony Barbour552f6c02016-12-21 14:34:07 -070013086 m_commandBuffer->BeginCommandBuffer();
13087 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013088 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13089 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13090 VkRect2D scissor = {{0, 0}, {16, 16}};
13091 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13092 // Bind pipeline to cmd buffer
13093 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13094 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13095 &descriptor_set, 0, nullptr);
13096 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013097 m_commandBuffer->EndRenderPass();
13098 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013099
13100 VkSubmitInfo submit_info = {};
13101 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13102 submit_info.commandBufferCount = 1;
13103 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13104 // Submit cmd buffer and then destroy bufferView while in-flight
13105 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13106
13107 vkDestroyBufferView(m_device->device(), view, nullptr);
13108 m_errorMonitor->VerifyFound();
13109 vkQueueWaitIdle(m_device->m_queue);
13110 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013111 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013112 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013113 vkDestroyBufferView(m_device->device(), view, NULL);
13114 vkDestroyBuffer(m_device->device(), buffer, NULL);
13115 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13116 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13117 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13118 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13119}
13120
Tobin Ehlis209532e2016-09-07 13:52:18 -060013121TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13122 TEST_DESCRIPTION("Delete in-use sampler.");
13123
Tony Barbour1fa09702017-03-16 12:09:08 -060013124 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13126
13127 VkDescriptorPoolSize ds_type_count;
13128 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13129 ds_type_count.descriptorCount = 1;
13130
13131 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13132 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13133 ds_pool_ci.maxSets = 1;
13134 ds_pool_ci.poolSizeCount = 1;
13135 ds_pool_ci.pPoolSizes = &ds_type_count;
13136
13137 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013138 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013139 ASSERT_VK_SUCCESS(err);
13140
13141 VkSamplerCreateInfo sampler_ci = {};
13142 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13143 sampler_ci.pNext = NULL;
13144 sampler_ci.magFilter = VK_FILTER_NEAREST;
13145 sampler_ci.minFilter = VK_FILTER_NEAREST;
13146 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13147 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13148 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13149 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13150 sampler_ci.mipLodBias = 1.0;
13151 sampler_ci.anisotropyEnable = VK_FALSE;
13152 sampler_ci.maxAnisotropy = 1;
13153 sampler_ci.compareEnable = VK_FALSE;
13154 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13155 sampler_ci.minLod = 1.0;
13156 sampler_ci.maxLod = 1.0;
13157 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13158 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13159 VkSampler sampler;
13160
13161 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13162 ASSERT_VK_SUCCESS(err);
13163
13164 VkDescriptorSetLayoutBinding layout_binding;
13165 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013166 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013167 layout_binding.descriptorCount = 1;
13168 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13169 layout_binding.pImmutableSamplers = NULL;
13170
13171 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13172 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13173 ds_layout_ci.bindingCount = 1;
13174 ds_layout_ci.pBindings = &layout_binding;
13175 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013176 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013177 ASSERT_VK_SUCCESS(err);
13178
13179 VkDescriptorSetAllocateInfo alloc_info = {};
13180 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13181 alloc_info.descriptorSetCount = 1;
13182 alloc_info.descriptorPool = ds_pool;
13183 alloc_info.pSetLayouts = &ds_layout;
13184 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013185 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013186 ASSERT_VK_SUCCESS(err);
13187
13188 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13189 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13190 pipeline_layout_ci.pNext = NULL;
13191 pipeline_layout_ci.setLayoutCount = 1;
13192 pipeline_layout_ci.pSetLayouts = &ds_layout;
13193
13194 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013195 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013196 ASSERT_VK_SUCCESS(err);
13197
13198 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013199 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 -060013200 ASSERT_TRUE(image.initialized());
13201
13202 VkImageView view;
13203 VkImageViewCreateInfo ivci = {};
13204 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13205 ivci.image = image.handle();
13206 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13207 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13208 ivci.subresourceRange.layerCount = 1;
13209 ivci.subresourceRange.baseMipLevel = 0;
13210 ivci.subresourceRange.levelCount = 1;
13211 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13212
13213 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13214 ASSERT_VK_SUCCESS(err);
13215
13216 VkDescriptorImageInfo image_info{};
13217 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13218 image_info.imageView = view;
13219 image_info.sampler = sampler;
13220
13221 VkWriteDescriptorSet descriptor_write = {};
13222 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13223 descriptor_write.dstSet = descriptor_set;
13224 descriptor_write.dstBinding = 0;
13225 descriptor_write.descriptorCount = 1;
13226 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13227 descriptor_write.pImageInfo = &image_info;
13228
13229 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13230
13231 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013232 char const *vsSource =
13233 "#version 450\n"
13234 "\n"
13235 "out gl_PerVertex { \n"
13236 " vec4 gl_Position;\n"
13237 "};\n"
13238 "void main(){\n"
13239 " gl_Position = vec4(1);\n"
13240 "}\n";
13241 char const *fsSource =
13242 "#version 450\n"
13243 "\n"
13244 "layout(set=0, binding=0) uniform sampler2D s;\n"
13245 "layout(location=0) out vec4 x;\n"
13246 "void main(){\n"
13247 " x = texture(s, vec2(1));\n"
13248 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13251 VkPipelineObj pipe(m_device);
13252 pipe.AddShader(&vs);
13253 pipe.AddShader(&fs);
13254 pipe.AddColorAttachment();
13255 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13256
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013258
Tony Barbour552f6c02016-12-21 14:34:07 -070013259 m_commandBuffer->BeginCommandBuffer();
13260 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013261 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013262 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13263 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13264 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013265
13266 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13267 VkRect2D scissor = {{0, 0}, {16, 16}};
13268 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13269 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13270
Tobin Ehlis209532e2016-09-07 13:52:18 -060013271 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013272 m_commandBuffer->EndRenderPass();
13273 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013274 // Submit cmd buffer then destroy sampler
13275 VkSubmitInfo submit_info = {};
13276 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13277 submit_info.commandBufferCount = 1;
13278 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13279 // Submit cmd buffer and then destroy sampler while in-flight
13280 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13281
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013282 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013283 m_errorMonitor->VerifyFound();
13284 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013285
Tobin Ehlis209532e2016-09-07 13:52:18 -060013286 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013287 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13288 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013289 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013290 vkDestroyImageView(m_device->device(), view, NULL);
13291 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13292 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13293 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13294}
13295
Mark Mueller1cd9f412016-08-25 13:23:52 -060013296TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013297 TEST_DESCRIPTION(
13298 "Call VkQueueSubmit with a semaphore that is already "
13299 "signaled but not waited on by the queue. Wait on a "
13300 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013301
Tony Barbour1fa09702017-03-16 12:09:08 -060013302 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13304
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013305 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 -070013306 const char *invalid_fence_wait_message =
13307 " which has not been submitted on a Queue or during "
13308 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013309
Tony Barbour552f6c02016-12-21 14:34:07 -070013310 m_commandBuffer->BeginCommandBuffer();
13311 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013312
13313 VkSemaphoreCreateInfo semaphore_create_info = {};
13314 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13315 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013316 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013317 VkSubmitInfo submit_info = {};
13318 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13319 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013320 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013321 submit_info.signalSemaphoreCount = 1;
13322 submit_info.pSignalSemaphores = &semaphore;
13323 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013324 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013325 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013326 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013327 m_commandBuffer->BeginCommandBuffer();
13328 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013330 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13331 m_errorMonitor->VerifyFound();
13332
Mark Mueller1cd9f412016-08-25 13:23:52 -060013333 VkFenceCreateInfo fence_create_info = {};
13334 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13335 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013336 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013339 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13340 m_errorMonitor->VerifyFound();
13341
Mark Mueller4042b652016-09-05 22:52:21 -060013342 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013343 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013344 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13345}
13346
Tobin Ehlis4af23302016-07-19 10:50:30 -060013347TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013348 TEST_DESCRIPTION(
13349 "Bind a secondary command buffer with with a framebuffer "
13350 "that does not match the framebuffer for the active "
13351 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013352 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13354
13355 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013356 VkAttachmentDescription attachment = {0,
13357 VK_FORMAT_B8G8R8A8_UNORM,
13358 VK_SAMPLE_COUNT_1_BIT,
13359 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13360 VK_ATTACHMENT_STORE_OP_STORE,
13361 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13362 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13363 VK_IMAGE_LAYOUT_UNDEFINED,
13364 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013365
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013366 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013367
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013368 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013369
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013370 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013371
13372 VkRenderPass rp;
13373 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13374 ASSERT_VK_SUCCESS(err);
13375
13376 // A compatible framebuffer.
13377 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013378 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 -060013379 ASSERT_TRUE(image.initialized());
13380
13381 VkImageViewCreateInfo ivci = {
13382 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13383 nullptr,
13384 0,
13385 image.handle(),
13386 VK_IMAGE_VIEW_TYPE_2D,
13387 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013388 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13389 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013390 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13391 };
13392 VkImageView view;
13393 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13394 ASSERT_VK_SUCCESS(err);
13395
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013396 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013397 VkFramebuffer fb;
13398 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13399 ASSERT_VK_SUCCESS(err);
13400
13401 VkCommandBufferAllocateInfo cbai = {};
13402 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013403 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013404 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13405 cbai.commandBufferCount = 1;
13406
13407 VkCommandBuffer sec_cb;
13408 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13409 ASSERT_VK_SUCCESS(err);
13410 VkCommandBufferBeginInfo cbbi = {};
13411 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013412 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013413 cbii.renderPass = renderPass();
13414 cbii.framebuffer = fb;
13415 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13416 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013417 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 -060013418 cbbi.pInheritanceInfo = &cbii;
13419 vkBeginCommandBuffer(sec_cb, &cbbi);
13420 vkEndCommandBuffer(sec_cb);
13421
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013422 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013423 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13424 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013425
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013427 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013428 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13429 m_errorMonitor->VerifyFound();
13430 // Cleanup
13431 vkDestroyImageView(m_device->device(), view, NULL);
13432 vkDestroyRenderPass(m_device->device(), rp, NULL);
13433 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13434}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013435
13436TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013437 TEST_DESCRIPTION(
13438 "If logicOp is available on the device, set it to an "
13439 "invalid value. If logicOp is not available, attempt to "
13440 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013441 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13443
13444 auto features = m_device->phy().features();
13445 // Set the expected error depending on whether or not logicOp available
13446 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13448 "If logic operations feature not "
13449 "enabled, logicOpEnable must be "
13450 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013451 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013453 }
13454 // Create a pipeline using logicOp
13455 VkResult err;
13456
13457 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13458 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13459
13460 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013461 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013462 ASSERT_VK_SUCCESS(err);
13463
13464 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13465 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13466 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013467 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013468 vp_state_ci.pViewports = &vp;
13469 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013470 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013471 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013472
13473 VkPipelineShaderStageCreateInfo shaderStages[2];
13474 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13475
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013476 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13477 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013478 shaderStages[0] = vs.GetStageCreateInfo();
13479 shaderStages[1] = fs.GetStageCreateInfo();
13480
13481 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13482 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13483
13484 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13485 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13486 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13487
13488 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13489 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013490 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013491
13492 VkPipelineColorBlendAttachmentState att = {};
13493 att.blendEnable = VK_FALSE;
13494 att.colorWriteMask = 0xf;
13495
13496 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13497 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13498 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13499 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013500 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013501 cb_ci.attachmentCount = 1;
13502 cb_ci.pAttachments = &att;
13503
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013504 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13505 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13506 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13507
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013508 VkGraphicsPipelineCreateInfo gp_ci = {};
13509 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13510 gp_ci.stageCount = 2;
13511 gp_ci.pStages = shaderStages;
13512 gp_ci.pVertexInputState = &vi_ci;
13513 gp_ci.pInputAssemblyState = &ia_ci;
13514 gp_ci.pViewportState = &vp_state_ci;
13515 gp_ci.pRasterizationState = &rs_ci;
13516 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013517 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013518 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13519 gp_ci.layout = pipeline_layout;
13520 gp_ci.renderPass = renderPass();
13521
13522 VkPipelineCacheCreateInfo pc_ci = {};
13523 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13524
13525 VkPipeline pipeline;
13526 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013527 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013528 ASSERT_VK_SUCCESS(err);
13529
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013530 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013531 m_errorMonitor->VerifyFound();
13532 if (VK_SUCCESS == err) {
13533 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13534 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013535 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13536 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13537}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013538
Mike Stroyanaccf7692015-05-12 16:00:45 -060013539#if GTEST_IS_THREADSAFE
13540struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013541 VkCommandBuffer commandBuffer;
Mike Stroyanca855662017-05-02 11:06:27 -060013542 VkDevice device;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013543 VkEvent event;
13544 bool bailout;
13545};
13546
Karl Schultz6addd812016-02-02 17:17:23 -070013547extern "C" void *AddToCommandBuffer(void *arg) {
13548 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013549
Mike Stroyana6d14942016-07-13 15:10:05 -060013550 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013551 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013552 if (data->bailout) {
13553 break;
13554 }
13555 }
13556 return NULL;
13557}
13558
Karl Schultz6addd812016-02-02 17:17:23 -070013559TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013560 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013563
Tony Barbour1fa09702017-03-16 12:09:08 -060013564 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013565 ASSERT_NO_FATAL_FAILURE(InitViewport());
13566 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13567
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013568 // Calls AllocateCommandBuffers
13569 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013570
13571 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013572 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013573
13574 VkEventCreateInfo event_info;
13575 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013576 VkResult err;
13577
13578 memset(&event_info, 0, sizeof(event_info));
13579 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13580
Chia-I Wuf7458c52015-10-26 21:10:41 +080013581 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013582 ASSERT_VK_SUCCESS(err);
13583
Mike Stroyanaccf7692015-05-12 16:00:45 -060013584 err = vkResetEvent(device(), event);
13585 ASSERT_VK_SUCCESS(err);
13586
13587 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013588 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013589 data.event = event;
13590 data.bailout = false;
13591 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013592
13593 // First do some correct operations using multiple threads.
13594 // Add many entries to command buffer from another thread.
13595 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13596 // Make non-conflicting calls from this thread at the same time.
13597 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013598 uint32_t count;
13599 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013600 }
13601 test_platform_thread_join(thread, NULL);
13602
13603 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013604 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013605 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013606 // Add many entries to command buffer from this thread at the same time.
13607 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013608
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013609 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013610 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013611
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013612 m_errorMonitor->SetBailout(NULL);
13613
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013614 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013615
Chia-I Wuf7458c52015-10-26 21:10:41 +080013616 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013617}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013618#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013619
Karl Schultz6addd812016-02-02 17:17:23 -070013620TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013621 TEST_DESCRIPTION(
13622 "Test that an error is produced for a spirv module "
13623 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013624
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013626
Tony Barbour1fa09702017-03-16 12:09:08 -060013627 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13629
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013630 VkShaderModule module;
13631 VkShaderModuleCreateInfo moduleCreateInfo;
13632 struct icd_spv_header spv;
13633
13634 spv.magic = ICD_SPV_MAGIC;
13635 spv.version = ICD_SPV_VERSION;
13636 spv.gen_magic = 0;
13637
13638 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13639 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013640 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013641 moduleCreateInfo.codeSize = 4;
13642 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013643 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013644
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013645 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013646}
13647
Karl Schultz6addd812016-02-02 17:17:23 -070013648TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013649 TEST_DESCRIPTION(
13650 "Test that an error is produced for a spirv module "
13651 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013652
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013654
Tony Barbour1fa09702017-03-16 12:09:08 -060013655 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13657
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013658 VkShaderModule module;
13659 VkShaderModuleCreateInfo moduleCreateInfo;
13660 struct icd_spv_header spv;
13661
13662 spv.magic = ~ICD_SPV_MAGIC;
13663 spv.version = ICD_SPV_VERSION;
13664 spv.gen_magic = 0;
13665
13666 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13667 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013668 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013669 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13670 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013671 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013672
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013673 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013674}
13675
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013676#if 0
13677// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013678TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013680 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013681
Tony Barbour1fa09702017-03-16 12:09:08 -060013682 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13684
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013685 VkShaderModule module;
13686 VkShaderModuleCreateInfo moduleCreateInfo;
13687 struct icd_spv_header spv;
13688
13689 spv.magic = ICD_SPV_MAGIC;
13690 spv.version = ~ICD_SPV_VERSION;
13691 spv.gen_magic = 0;
13692
13693 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13694 moduleCreateInfo.pNext = NULL;
13695
Karl Schultz6addd812016-02-02 17:17:23 -070013696 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013697 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13698 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013699 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013700
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013701 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013702}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013703#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013704
Karl Schultz6addd812016-02-02 17:17:23 -070013705TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013706 TEST_DESCRIPTION(
13707 "Test that a warning is produced for a vertex output that "
13708 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013710
Tony Barbour1fa09702017-03-16 12:09:08 -060013711 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013712 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013713
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013714 char const *vsSource =
13715 "#version 450\n"
13716 "\n"
13717 "layout(location=0) out float x;\n"
13718 "out gl_PerVertex {\n"
13719 " vec4 gl_Position;\n"
13720 "};\n"
13721 "void main(){\n"
13722 " gl_Position = vec4(1);\n"
13723 " x = 0;\n"
13724 "}\n";
13725 char const *fsSource =
13726 "#version 450\n"
13727 "\n"
13728 "layout(location=0) out vec4 color;\n"
13729 "void main(){\n"
13730 " color = vec4(1);\n"
13731 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013732
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013733 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13734 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013735
13736 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013737 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013738 pipe.AddShader(&vs);
13739 pipe.AddShader(&fs);
13740
Chris Forbes9f7ff632015-05-25 11:13:08 +120013741 VkDescriptorSetObj descriptorSet(m_device);
13742 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013743 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013744
Tony Barbour5781e8f2015-08-04 16:23:11 -060013745 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013746
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013747 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013748}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013749
Mark Mueller098c9cb2016-09-08 09:01:57 -060013750TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13751 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13752
Tony Barbour1fa09702017-03-16 12:09:08 -060013753 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013754 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13755
13756 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013757 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013758
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013759 char const *vsSource =
13760 "#version 450\n"
13761 "\n"
13762 "out gl_PerVertex {\n"
13763 " vec4 gl_Position;\n"
13764 "};\n"
13765 "void main(){\n"
13766 " gl_Position = vec4(1);\n"
13767 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013768
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013769 char const *fsSource =
13770 "#version 450\n"
13771 "\n"
13772 "layout (constant_id = 0) const float r = 0.0f;\n"
13773 "layout(location = 0) out vec4 uFragColor;\n"
13774 "void main(){\n"
13775 " uFragColor = vec4(r,1,0,1);\n"
13776 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013777
13778 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13779 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13780
13781 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13782 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13783
13784 VkPipelineLayout pipeline_layout;
13785 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13786
13787 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13788 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13789 vp_state_create_info.viewportCount = 1;
13790 VkViewport viewport = {};
13791 vp_state_create_info.pViewports = &viewport;
13792 vp_state_create_info.scissorCount = 1;
13793 VkRect2D scissors = {};
13794 vp_state_create_info.pScissors = &scissors;
13795
13796 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13797
13798 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13799 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13800 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13801 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13802
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013803 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013804
13805 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13806 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13807
13808 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13809 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13810 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13811
13812 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13813 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13814 rasterization_state_create_info.pNext = nullptr;
13815 rasterization_state_create_info.lineWidth = 1.0f;
13816 rasterization_state_create_info.rasterizerDiscardEnable = true;
13817
13818 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13819 color_blend_attachment_state.blendEnable = VK_FALSE;
13820 color_blend_attachment_state.colorWriteMask = 0xf;
13821
13822 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13823 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13824 color_blend_state_create_info.attachmentCount = 1;
13825 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13826
13827 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13828 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13829 graphicspipe_create_info.stageCount = 2;
13830 graphicspipe_create_info.pStages = shader_stage_create_info;
13831 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13832 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13833 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13834 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13835 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13836 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13837 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13838 graphicspipe_create_info.layout = pipeline_layout;
13839 graphicspipe_create_info.renderPass = renderPass();
13840
13841 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13842 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13843
13844 VkPipelineCache pipelineCache;
13845 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13846
13847 // This structure maps constant ids to data locations.
13848 const VkSpecializationMapEntry entry =
13849 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013850 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013851
13852 uint32_t data = 1;
13853
13854 // Set up the info describing spec map and data
13855 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013856 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013857 };
13858 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13859
13860 VkPipeline pipeline;
13861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13862 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13863 m_errorMonitor->VerifyFound();
13864
13865 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13866 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13867}
13868
13869TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13870 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13871
Tony Barbour1fa09702017-03-16 12:09:08 -060013872 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13874
13875 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13876
13877 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13878 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13879 descriptor_pool_type_count[0].descriptorCount = 1;
13880 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13881 descriptor_pool_type_count[1].descriptorCount = 1;
13882
13883 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13884 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13885 descriptor_pool_create_info.maxSets = 1;
13886 descriptor_pool_create_info.poolSizeCount = 2;
13887 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13888 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13889
13890 VkDescriptorPool descriptorset_pool;
13891 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13892
13893 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13894 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13895 descriptorset_layout_binding.descriptorCount = 1;
13896 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013897 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013898
13899 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13900 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13901 descriptorset_layout_create_info.bindingCount = 1;
13902 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13903
13904 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013905 ASSERT_VK_SUCCESS(
13906 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013907
13908 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13909 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13910 descriptorset_allocate_info.descriptorSetCount = 1;
13911 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13912 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13913 VkDescriptorSet descriptorset;
13914 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13915
13916 // Challenge core_validation with a non uniform buffer type.
13917 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13918
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013919 char const *vsSource =
13920 "#version 450\n"
13921 "\n"
13922 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13923 " mat4 mvp;\n"
13924 "} ubuf;\n"
13925 "out gl_PerVertex {\n"
13926 " vec4 gl_Position;\n"
13927 "};\n"
13928 "void main(){\n"
13929 " gl_Position = ubuf.mvp * vec4(1);\n"
13930 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013931
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013932 char const *fsSource =
13933 "#version 450\n"
13934 "\n"
13935 "layout(location = 0) out vec4 uFragColor;\n"
13936 "void main(){\n"
13937 " uFragColor = vec4(0,1,0,1);\n"
13938 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013939
13940 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13941 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13942
13943 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13944 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13945 pipeline_layout_create_info.setLayoutCount = 1;
13946 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13947
13948 VkPipelineLayout pipeline_layout;
13949 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13950
13951 VkPipelineObj pipe(m_device);
13952 pipe.AddColorAttachment();
13953 pipe.AddShader(&vs);
13954 pipe.AddShader(&fs);
13955
13956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13957 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13958 m_errorMonitor->VerifyFound();
13959
13960 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13961 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13962 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13963}
13964
13965TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13966 TEST_DESCRIPTION(
13967 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13968
Tony Barbour1fa09702017-03-16 12:09:08 -060013969 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13971
13972 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13973
13974 VkDescriptorPoolSize descriptor_pool_type_count = {};
13975 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13976 descriptor_pool_type_count.descriptorCount = 1;
13977
13978 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13979 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13980 descriptor_pool_create_info.maxSets = 1;
13981 descriptor_pool_create_info.poolSizeCount = 1;
13982 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13983 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13984
13985 VkDescriptorPool descriptorset_pool;
13986 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13987
13988 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13989 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13990 descriptorset_layout_binding.descriptorCount = 1;
13991 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13992 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013993 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013994
13995 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13996 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13997 descriptorset_layout_create_info.bindingCount = 1;
13998 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13999
14000 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014001 ASSERT_VK_SUCCESS(
14002 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014003
14004 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14005 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14006 descriptorset_allocate_info.descriptorSetCount = 1;
14007 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14008 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14009 VkDescriptorSet descriptorset;
14010 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14011
14012 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14013
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014014 char const *vsSource =
14015 "#version 450\n"
14016 "\n"
14017 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14018 " mat4 mvp;\n"
14019 "} ubuf;\n"
14020 "out gl_PerVertex {\n"
14021 " vec4 gl_Position;\n"
14022 "};\n"
14023 "void main(){\n"
14024 " gl_Position = ubuf.mvp * vec4(1);\n"
14025 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014026
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014027 char const *fsSource =
14028 "#version 450\n"
14029 "\n"
14030 "layout(location = 0) out vec4 uFragColor;\n"
14031 "void main(){\n"
14032 " uFragColor = vec4(0,1,0,1);\n"
14033 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014034
14035 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14036 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14037
14038 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14039 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14040 pipeline_layout_create_info.setLayoutCount = 1;
14041 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14042
14043 VkPipelineLayout pipeline_layout;
14044 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14045
14046 VkPipelineObj pipe(m_device);
14047 pipe.AddColorAttachment();
14048 pipe.AddShader(&vs);
14049 pipe.AddShader(&fs);
14050
14051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14052 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14053 m_errorMonitor->VerifyFound();
14054
14055 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14056 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14057 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14058}
14059
14060TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014061 TEST_DESCRIPTION(
14062 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14063 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014064
Tony Barbour1fa09702017-03-16 12:09:08 -060014065 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014066 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14067
14068 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014069 "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 -060014070
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014071 char const *vsSource =
14072 "#version 450\n"
14073 "\n"
14074 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14075 "out gl_PerVertex {\n"
14076 " vec4 gl_Position;\n"
14077 "};\n"
14078 "void main(){\n"
14079 " gl_Position = vec4(consts.x);\n"
14080 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014081
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014082 char const *fsSource =
14083 "#version 450\n"
14084 "\n"
14085 "layout(location = 0) out vec4 uFragColor;\n"
14086 "void main(){\n"
14087 " uFragColor = vec4(0,1,0,1);\n"
14088 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014089
14090 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14091 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14092
14093 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14094 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14095
14096 // Set up a push constant range
14097 VkPushConstantRange push_constant_ranges = {};
14098 // Set to the wrong stage to challenge core_validation
14099 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14100 push_constant_ranges.size = 4;
14101
14102 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14103 pipeline_layout_create_info.pushConstantRangeCount = 1;
14104
14105 VkPipelineLayout pipeline_layout;
14106 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14107
14108 VkPipelineObj pipe(m_device);
14109 pipe.AddColorAttachment();
14110 pipe.AddShader(&vs);
14111 pipe.AddShader(&fs);
14112
14113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14114 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14115 m_errorMonitor->VerifyFound();
14116
14117 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14118}
14119
14120TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14121 TEST_DESCRIPTION(
14122 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14123
Tony Barbour1fa09702017-03-16 12:09:08 -060014124 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14126
14127 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014128 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014129
14130 // Some awkward steps are required to test with custom device features.
14131 std::vector<const char *> device_extension_names;
14132 auto features = m_device->phy().features();
14133 // Disable support for 64 bit floats
14134 features.shaderFloat64 = false;
14135 // The sacrificial device object
14136 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14137
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014138 char const *vsSource =
14139 "#version 450\n"
14140 "\n"
14141 "out gl_PerVertex {\n"
14142 " vec4 gl_Position;\n"
14143 "};\n"
14144 "void main(){\n"
14145 " gl_Position = vec4(1);\n"
14146 "}\n";
14147 char const *fsSource =
14148 "#version 450\n"
14149 "\n"
14150 "layout(location=0) out vec4 color;\n"
14151 "void main(){\n"
14152 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14153 " color = vec4(green);\n"
14154 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014155
14156 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14157 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14158
14159 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014160
14161 VkPipelineObj pipe(&test_device);
14162 pipe.AddColorAttachment();
14163 pipe.AddShader(&vs);
14164 pipe.AddShader(&fs);
14165
14166 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14167 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14168 VkPipelineLayout pipeline_layout;
14169 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14170
14171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14172 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14173 m_errorMonitor->VerifyFound();
14174
14175 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14176}
14177
Mark Lobodzinski20832822017-03-24 14:49:45 -060014178TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14179 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14180 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014181
Tony Barbour1fa09702017-03-16 12:09:08 -060014182 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14184
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014185 char const *vsSource =
14186 "#version 450\n"
14187 "\n"
14188 "out gl_PerVertex {\n"
14189 " vec4 gl_Position;\n"
14190 "};\n"
14191 "layout(xfb_buffer = 1) out;"
14192 "void main(){\n"
14193 " gl_Position = vec4(1);\n"
14194 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014195
Mark Lobodzinski20832822017-03-24 14:49:45 -060014196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014197
Mark Lobodzinski20832822017-03-24 14:49:45 -060014198 std::vector<unsigned int> spv;
14199 VkShaderModuleCreateInfo module_create_info;
14200 VkShaderModule shader_module;
14201 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14202 module_create_info.pNext = NULL;
14203 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14204 module_create_info.pCode = spv.data();
14205 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14206 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014207
Mark Lobodzinski20832822017-03-24 14:49:45 -060014208 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014209
Mark Lobodzinski20832822017-03-24 14:49:45 -060014210 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014211}
14212
Karl Schultz6addd812016-02-02 17:17:23 -070014213TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014214 TEST_DESCRIPTION(
14215 "Test that an error is produced for a fragment shader input "
14216 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014217
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014219
Tony Barbour1fa09702017-03-16 12:09:08 -060014220 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014222
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014223 char const *vsSource =
14224 "#version 450\n"
14225 "\n"
14226 "out gl_PerVertex {\n"
14227 " vec4 gl_Position;\n"
14228 "};\n"
14229 "void main(){\n"
14230 " gl_Position = vec4(1);\n"
14231 "}\n";
14232 char const *fsSource =
14233 "#version 450\n"
14234 "\n"
14235 "layout(location=0) in float x;\n"
14236 "layout(location=0) out vec4 color;\n"
14237 "void main(){\n"
14238 " color = vec4(x);\n"
14239 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014240
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014241 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14242 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014243
14244 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014245 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014246 pipe.AddShader(&vs);
14247 pipe.AddShader(&fs);
14248
Chris Forbes59cb88d2015-05-25 11:13:13 +120014249 VkDescriptorSetObj descriptorSet(m_device);
14250 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014251 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014252
Tony Barbour5781e8f2015-08-04 16:23:11 -060014253 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014254
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014255 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014256}
14257
Karl Schultz6addd812016-02-02 17:17:23 -070014258TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014259 TEST_DESCRIPTION(
14260 "Test that an error is produced for a fragment shader input "
14261 "within an interace block, which is not present in the outputs "
14262 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014264
Tony Barbour1fa09702017-03-16 12:09:08 -060014265 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014266 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14267
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014268 char const *vsSource =
14269 "#version 450\n"
14270 "\n"
14271 "out gl_PerVertex {\n"
14272 " vec4 gl_Position;\n"
14273 "};\n"
14274 "void main(){\n"
14275 " gl_Position = vec4(1);\n"
14276 "}\n";
14277 char const *fsSource =
14278 "#version 450\n"
14279 "\n"
14280 "in block { layout(location=0) float x; } ins;\n"
14281 "layout(location=0) out vec4 color;\n"
14282 "void main(){\n"
14283 " color = vec4(ins.x);\n"
14284 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014285
14286 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14287 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14288
14289 VkPipelineObj pipe(m_device);
14290 pipe.AddColorAttachment();
14291 pipe.AddShader(&vs);
14292 pipe.AddShader(&fs);
14293
14294 VkDescriptorSetObj descriptorSet(m_device);
14295 descriptorSet.AppendDummy();
14296 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14297
14298 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14299
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014300 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014301}
14302
Karl Schultz6addd812016-02-02 17:17:23 -070014303TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014304 TEST_DESCRIPTION(
14305 "Test that an error is produced for mismatched array sizes "
14306 "across the vertex->fragment shader interface");
14307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14308 "Type mismatch on location 0.0: 'ptr to "
14309 "output arr[2] of float32' vs 'ptr to "
14310 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014311
Tony Barbour1fa09702017-03-16 12:09:08 -060014312 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014313 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014315 char const *vsSource =
14316 "#version 450\n"
14317 "\n"
14318 "layout(location=0) out float x[2];\n"
14319 "out gl_PerVertex {\n"
14320 " vec4 gl_Position;\n"
14321 "};\n"
14322 "void main(){\n"
14323 " x[0] = 0; x[1] = 0;\n"
14324 " gl_Position = vec4(1);\n"
14325 "}\n";
14326 char const *fsSource =
14327 "#version 450\n"
14328 "\n"
14329 "layout(location=0) in float x[1];\n"
14330 "layout(location=0) out vec4 color;\n"
14331 "void main(){\n"
14332 " color = vec4(x[0]);\n"
14333 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014334
14335 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14336 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14337
14338 VkPipelineObj pipe(m_device);
14339 pipe.AddColorAttachment();
14340 pipe.AddShader(&vs);
14341 pipe.AddShader(&fs);
14342
14343 VkDescriptorSetObj descriptorSet(m_device);
14344 descriptorSet.AppendDummy();
14345 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14346
14347 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14348
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014349 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014350}
14351
Karl Schultz6addd812016-02-02 17:17:23 -070014352TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014353 TEST_DESCRIPTION(
14354 "Test that an error is produced for mismatched types across "
14355 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014357
Tony Barbour1fa09702017-03-16 12:09:08 -060014358 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014359 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014360
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014361 char const *vsSource =
14362 "#version 450\n"
14363 "\n"
14364 "layout(location=0) out int x;\n"
14365 "out gl_PerVertex {\n"
14366 " vec4 gl_Position;\n"
14367 "};\n"
14368 "void main(){\n"
14369 " x = 0;\n"
14370 " gl_Position = vec4(1);\n"
14371 "}\n";
14372 char const *fsSource =
14373 "#version 450\n"
14374 "\n"
14375 "layout(location=0) in float x;\n" /* VS writes int */
14376 "layout(location=0) out vec4 color;\n"
14377 "void main(){\n"
14378 " color = vec4(x);\n"
14379 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014380
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014381 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014383
14384 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014385 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014386 pipe.AddShader(&vs);
14387 pipe.AddShader(&fs);
14388
Chris Forbesb56af562015-05-25 11:13:17 +120014389 VkDescriptorSetObj descriptorSet(m_device);
14390 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014391 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014392
Tony Barbour5781e8f2015-08-04 16:23:11 -060014393 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014394
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014395 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014396}
14397
Karl Schultz6addd812016-02-02 17:17:23 -070014398TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014399 TEST_DESCRIPTION(
14400 "Test that an error is produced for mismatched types across "
14401 "the vertex->fragment shader interface, when the variable is contained within "
14402 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014404
Tony Barbour1fa09702017-03-16 12:09:08 -060014405 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14407
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014408 char const *vsSource =
14409 "#version 450\n"
14410 "\n"
14411 "out block { layout(location=0) int x; } outs;\n"
14412 "out gl_PerVertex {\n"
14413 " vec4 gl_Position;\n"
14414 "};\n"
14415 "void main(){\n"
14416 " outs.x = 0;\n"
14417 " gl_Position = vec4(1);\n"
14418 "}\n";
14419 char const *fsSource =
14420 "#version 450\n"
14421 "\n"
14422 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14423 "layout(location=0) out vec4 color;\n"
14424 "void main(){\n"
14425 " color = vec4(ins.x);\n"
14426 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014427
14428 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14429 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14430
14431 VkPipelineObj pipe(m_device);
14432 pipe.AddColorAttachment();
14433 pipe.AddShader(&vs);
14434 pipe.AddShader(&fs);
14435
14436 VkDescriptorSetObj descriptorSet(m_device);
14437 descriptorSet.AppendDummy();
14438 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14439
14440 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14441
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014442 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014443}
14444
14445TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014446 TEST_DESCRIPTION(
14447 "Test that an error is produced for location mismatches across "
14448 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14449 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014450 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 +130014451
Tony Barbour1fa09702017-03-16 12:09:08 -060014452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14454
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014455 char const *vsSource =
14456 "#version 450\n"
14457 "\n"
14458 "out block { layout(location=1) float x; } outs;\n"
14459 "out gl_PerVertex {\n"
14460 " vec4 gl_Position;\n"
14461 "};\n"
14462 "void main(){\n"
14463 " outs.x = 0;\n"
14464 " gl_Position = vec4(1);\n"
14465 "}\n";
14466 char const *fsSource =
14467 "#version 450\n"
14468 "\n"
14469 "in block { layout(location=0) float x; } ins;\n"
14470 "layout(location=0) out vec4 color;\n"
14471 "void main(){\n"
14472 " color = vec4(ins.x);\n"
14473 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014474
14475 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14476 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14477
14478 VkPipelineObj pipe(m_device);
14479 pipe.AddColorAttachment();
14480 pipe.AddShader(&vs);
14481 pipe.AddShader(&fs);
14482
14483 VkDescriptorSetObj descriptorSet(m_device);
14484 descriptorSet.AppendDummy();
14485 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14486
14487 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14488
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014489 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014490}
14491
14492TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014493 TEST_DESCRIPTION(
14494 "Test that an error is produced for component mismatches across the "
14495 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14496 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014497 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 +130014498
Tony Barbour1fa09702017-03-16 12:09:08 -060014499 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14501
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014502 char const *vsSource =
14503 "#version 450\n"
14504 "\n"
14505 "out block { layout(location=0, component=0) float x; } outs;\n"
14506 "out gl_PerVertex {\n"
14507 " vec4 gl_Position;\n"
14508 "};\n"
14509 "void main(){\n"
14510 " outs.x = 0;\n"
14511 " gl_Position = vec4(1);\n"
14512 "}\n";
14513 char const *fsSource =
14514 "#version 450\n"
14515 "\n"
14516 "in block { layout(location=0, component=1) float x; } ins;\n"
14517 "layout(location=0) out vec4 color;\n"
14518 "void main(){\n"
14519 " color = vec4(ins.x);\n"
14520 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014521
14522 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14523 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14524
14525 VkPipelineObj pipe(m_device);
14526 pipe.AddColorAttachment();
14527 pipe.AddShader(&vs);
14528 pipe.AddShader(&fs);
14529
14530 VkDescriptorSetObj descriptorSet(m_device);
14531 descriptorSet.AppendDummy();
14532 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14533
14534 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14535
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014536 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014537}
14538
Chris Forbes1f3b0152016-11-30 12:48:40 +130014539TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14540 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14541
Tony Barbour1fa09702017-03-16 12:09:08 -060014542 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14544
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014545 char const *vsSource =
14546 "#version 450\n"
14547 "layout(location=0) out mediump float x;\n"
14548 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14549 char const *fsSource =
14550 "#version 450\n"
14551 "layout(location=0) in highp float x;\n"
14552 "layout(location=0) out vec4 color;\n"
14553 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014554
14555 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14556 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14557
14558 VkPipelineObj pipe(m_device);
14559 pipe.AddColorAttachment();
14560 pipe.AddShader(&vs);
14561 pipe.AddShader(&fs);
14562
14563 VkDescriptorSetObj descriptorSet(m_device);
14564 descriptorSet.AppendDummy();
14565 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14566
14567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14568
14569 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14570
14571 m_errorMonitor->VerifyFound();
14572}
14573
Chris Forbes870a39e2016-11-30 12:55:56 +130014574TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14575 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14576
Tony Barbour1fa09702017-03-16 12:09:08 -060014577 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14579
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014580 char const *vsSource =
14581 "#version 450\n"
14582 "out block { layout(location=0) mediump float x; };\n"
14583 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14584 char const *fsSource =
14585 "#version 450\n"
14586 "in block { layout(location=0) highp float x; };\n"
14587 "layout(location=0) out vec4 color;\n"
14588 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014589
14590 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14591 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14592
14593 VkPipelineObj pipe(m_device);
14594 pipe.AddColorAttachment();
14595 pipe.AddShader(&vs);
14596 pipe.AddShader(&fs);
14597
14598 VkDescriptorSetObj descriptorSet(m_device);
14599 descriptorSet.AppendDummy();
14600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14601
14602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14603
14604 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14605
14606 m_errorMonitor->VerifyFound();
14607}
14608
Karl Schultz6addd812016-02-02 17:17:23 -070014609TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014610 TEST_DESCRIPTION(
14611 "Test that a warning is produced for a vertex attribute which is "
14612 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014614
Tony Barbour1fa09702017-03-16 12:09:08 -060014615 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014616 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014617
14618 VkVertexInputBindingDescription input_binding;
14619 memset(&input_binding, 0, sizeof(input_binding));
14620
14621 VkVertexInputAttributeDescription input_attrib;
14622 memset(&input_attrib, 0, sizeof(input_attrib));
14623 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14624
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014625 char const *vsSource =
14626 "#version 450\n"
14627 "\n"
14628 "out gl_PerVertex {\n"
14629 " vec4 gl_Position;\n"
14630 "};\n"
14631 "void main(){\n"
14632 " gl_Position = vec4(1);\n"
14633 "}\n";
14634 char const *fsSource =
14635 "#version 450\n"
14636 "\n"
14637 "layout(location=0) out vec4 color;\n"
14638 "void main(){\n"
14639 " color = vec4(1);\n"
14640 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014641
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14643 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014644
14645 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014646 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014647 pipe.AddShader(&vs);
14648 pipe.AddShader(&fs);
14649
14650 pipe.AddVertexInputBindings(&input_binding, 1);
14651 pipe.AddVertexInputAttribs(&input_attrib, 1);
14652
Chris Forbesde136e02015-05-25 11:13:28 +120014653 VkDescriptorSetObj descriptorSet(m_device);
14654 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014655 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014656
Tony Barbour5781e8f2015-08-04 16:23:11 -060014657 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014658
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014659 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014660}
14661
Karl Schultz6addd812016-02-02 17:17:23 -070014662TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014663 TEST_DESCRIPTION(
14664 "Test that a warning is produced for a location mismatch on "
14665 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014667
Tony Barbour1fa09702017-03-16 12:09:08 -060014668 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14670
14671 VkVertexInputBindingDescription input_binding;
14672 memset(&input_binding, 0, sizeof(input_binding));
14673
14674 VkVertexInputAttributeDescription input_attrib;
14675 memset(&input_attrib, 0, sizeof(input_attrib));
14676 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14677
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014678 char const *vsSource =
14679 "#version 450\n"
14680 "\n"
14681 "layout(location=1) in float x;\n"
14682 "out gl_PerVertex {\n"
14683 " vec4 gl_Position;\n"
14684 "};\n"
14685 "void main(){\n"
14686 " gl_Position = vec4(x);\n"
14687 "}\n";
14688 char const *fsSource =
14689 "#version 450\n"
14690 "\n"
14691 "layout(location=0) out vec4 color;\n"
14692 "void main(){\n"
14693 " color = vec4(1);\n"
14694 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014695
14696 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14697 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14698
14699 VkPipelineObj pipe(m_device);
14700 pipe.AddColorAttachment();
14701 pipe.AddShader(&vs);
14702 pipe.AddShader(&fs);
14703
14704 pipe.AddVertexInputBindings(&input_binding, 1);
14705 pipe.AddVertexInputAttribs(&input_attrib, 1);
14706
14707 VkDescriptorSetObj descriptorSet(m_device);
14708 descriptorSet.AppendDummy();
14709 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14710
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014711 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014712 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14713
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014714 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014715}
14716
Karl Schultz6addd812016-02-02 17:17:23 -070014717TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014718 TEST_DESCRIPTION(
14719 "Test that an error is produced for a vertex shader input which is not "
14720 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14722 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014723
Tony Barbour1fa09702017-03-16 12:09:08 -060014724 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014725 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014726
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014727 char const *vsSource =
14728 "#version 450\n"
14729 "\n"
14730 "layout(location=0) in vec4 x;\n" /* not provided */
14731 "out gl_PerVertex {\n"
14732 " vec4 gl_Position;\n"
14733 "};\n"
14734 "void main(){\n"
14735 " gl_Position = x;\n"
14736 "}\n";
14737 char const *fsSource =
14738 "#version 450\n"
14739 "\n"
14740 "layout(location=0) out vec4 color;\n"
14741 "void main(){\n"
14742 " color = vec4(1);\n"
14743 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014744
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014745 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14746 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014747
14748 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014749 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014750 pipe.AddShader(&vs);
14751 pipe.AddShader(&fs);
14752
Chris Forbes62e8e502015-05-25 11:13:29 +120014753 VkDescriptorSetObj descriptorSet(m_device);
14754 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014755 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014756
Tony Barbour5781e8f2015-08-04 16:23:11 -060014757 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014758
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014759 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014760}
14761
Karl Schultz6addd812016-02-02 17:17:23 -070014762TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014763 TEST_DESCRIPTION(
14764 "Test that an error is produced for a mismatch between the "
14765 "fundamental type (float/int/uint) of an attribute and the "
14766 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014767 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 -060014768
Tony Barbour1fa09702017-03-16 12:09:08 -060014769 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014770 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014771
14772 VkVertexInputBindingDescription input_binding;
14773 memset(&input_binding, 0, sizeof(input_binding));
14774
14775 VkVertexInputAttributeDescription input_attrib;
14776 memset(&input_attrib, 0, sizeof(input_attrib));
14777 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14778
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014779 char const *vsSource =
14780 "#version 450\n"
14781 "\n"
14782 "layout(location=0) in int x;\n" /* attrib provided float */
14783 "out gl_PerVertex {\n"
14784 " vec4 gl_Position;\n"
14785 "};\n"
14786 "void main(){\n"
14787 " gl_Position = vec4(x);\n"
14788 "}\n";
14789 char const *fsSource =
14790 "#version 450\n"
14791 "\n"
14792 "layout(location=0) out vec4 color;\n"
14793 "void main(){\n"
14794 " color = vec4(1);\n"
14795 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014796
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014797 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14798 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014799
14800 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014801 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014802 pipe.AddShader(&vs);
14803 pipe.AddShader(&fs);
14804
14805 pipe.AddVertexInputBindings(&input_binding, 1);
14806 pipe.AddVertexInputAttribs(&input_attrib, 1);
14807
Chris Forbesc97d98e2015-05-25 11:13:31 +120014808 VkDescriptorSetObj descriptorSet(m_device);
14809 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014810 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014811
Tony Barbour5781e8f2015-08-04 16:23:11 -060014812 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014813
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014814 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014815}
14816
Chris Forbesc68b43c2016-04-06 11:18:47 +120014817TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014818 TEST_DESCRIPTION(
14819 "Test that an error is produced for a pipeline containing multiple "
14820 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14822 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014823
Tony Barbour1fa09702017-03-16 12:09:08 -060014824 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14826
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014827 char const *vsSource =
14828 "#version 450\n"
14829 "\n"
14830 "out gl_PerVertex {\n"
14831 " vec4 gl_Position;\n"
14832 "};\n"
14833 "void main(){\n"
14834 " gl_Position = vec4(1);\n"
14835 "}\n";
14836 char const *fsSource =
14837 "#version 450\n"
14838 "\n"
14839 "layout(location=0) out vec4 color;\n"
14840 "void main(){\n"
14841 " color = vec4(1);\n"
14842 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014843
14844 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14845 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14846
14847 VkPipelineObj pipe(m_device);
14848 pipe.AddColorAttachment();
14849 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014850 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014851 pipe.AddShader(&fs);
14852
14853 VkDescriptorSetObj descriptorSet(m_device);
14854 descriptorSet.AppendDummy();
14855 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14856
14857 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14858
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014859 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014860}
14861
Chris Forbes82ff92a2016-09-09 10:50:24 +120014862TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014864
Tony Barbour1fa09702017-03-16 12:09:08 -060014865 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14867
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014868 char const *vsSource =
14869 "#version 450\n"
14870 "out gl_PerVertex {\n"
14871 " vec4 gl_Position;\n"
14872 "};\n"
14873 "void main(){\n"
14874 " gl_Position = vec4(0);\n"
14875 "}\n";
14876 char const *fsSource =
14877 "#version 450\n"
14878 "\n"
14879 "layout(location=0) out vec4 color;\n"
14880 "void main(){\n"
14881 " color = vec4(1);\n"
14882 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014883
14884 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14885 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14886
14887 VkPipelineObj pipe(m_device);
14888 pipe.AddColorAttachment();
14889 pipe.AddShader(&vs);
14890 pipe.AddShader(&fs);
14891
14892 VkDescriptorSetObj descriptorSet(m_device);
14893 descriptorSet.AppendDummy();
14894 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14895
14896 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14897
14898 m_errorMonitor->VerifyFound();
14899}
14900
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014901TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14903 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14904 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014905
Tony Barbour1fa09702017-03-16 12:09:08 -060014906 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014907 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14908
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014909 char const *vsSource =
14910 "#version 450\n"
14911 "void main(){ gl_Position = vec4(0); }\n";
14912 char const *fsSource =
14913 "#version 450\n"
14914 "\n"
14915 "layout(location=0) out vec4 color;\n"
14916 "void main(){\n"
14917 " color = vec4(1);\n"
14918 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014919
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 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014933 {
14934 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14935 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14936 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014937 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014938 {
14939 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14940 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14941 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014942 },
14943 };
14944 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014945 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014946 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014947 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14948 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014949 VkRenderPass rp;
14950 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14951 ASSERT_VK_SUCCESS(err);
14952
14953 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14954
14955 m_errorMonitor->VerifyFound();
14956
14957 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14958}
14959
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014960TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014961 TEST_DESCRIPTION(
14962 "Test that an error is produced for a variable output from "
14963 "the TCS without the patch decoration, but consumed in the TES "
14964 "with the decoration.");
14965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14966 "is per-vertex in tessellation control shader stage "
14967 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014968
Tony Barbour1fa09702017-03-16 12:09:08 -060014969 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14971
Chris Forbesc1e852d2016-04-04 19:26:42 +120014972 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014973 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014974 return;
14975 }
14976
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014977 char const *vsSource =
14978 "#version 450\n"
14979 "void main(){}\n";
14980 char const *tcsSource =
14981 "#version 450\n"
14982 "layout(location=0) out int x[];\n"
14983 "layout(vertices=3) out;\n"
14984 "void main(){\n"
14985 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14986 " gl_TessLevelInner[0] = 1;\n"
14987 " x[gl_InvocationID] = gl_InvocationID;\n"
14988 "}\n";
14989 char const *tesSource =
14990 "#version 450\n"
14991 "layout(triangles, equal_spacing, cw) in;\n"
14992 "layout(location=0) patch in int x;\n"
14993 "out gl_PerVertex { vec4 gl_Position; };\n"
14994 "void main(){\n"
14995 " gl_Position.xyz = gl_TessCoord;\n"
14996 " gl_Position.w = x;\n"
14997 "}\n";
14998 char const *fsSource =
14999 "#version 450\n"
15000 "layout(location=0) out vec4 color;\n"
15001 "void main(){\n"
15002 " color = vec4(1);\n"
15003 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015004
15005 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15006 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15007 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15008 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15009
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015010 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15011 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015012
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015013 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015014
15015 VkPipelineObj pipe(m_device);
15016 pipe.SetInputAssembly(&iasci);
15017 pipe.SetTessellation(&tsci);
15018 pipe.AddColorAttachment();
15019 pipe.AddShader(&vs);
15020 pipe.AddShader(&tcs);
15021 pipe.AddShader(&tes);
15022 pipe.AddShader(&fs);
15023
15024 VkDescriptorSetObj descriptorSet(m_device);
15025 descriptorSet.AppendDummy();
15026 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15027
15028 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15029
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015030 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015031}
15032
Karl Schultz6addd812016-02-02 17:17:23 -070015033TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015034 TEST_DESCRIPTION(
15035 "Test that an error is produced for a vertex attribute setup where multiple "
15036 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15038 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015039
Tony Barbour1fa09702017-03-16 12:09:08 -060015040 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015041 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015042
15043 /* Two binding descriptions for binding 0 */
15044 VkVertexInputBindingDescription input_bindings[2];
15045 memset(input_bindings, 0, sizeof(input_bindings));
15046
15047 VkVertexInputAttributeDescription input_attrib;
15048 memset(&input_attrib, 0, sizeof(input_attrib));
15049 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15050
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015051 char const *vsSource =
15052 "#version 450\n"
15053 "\n"
15054 "layout(location=0) in float x;\n" /* attrib provided float */
15055 "out gl_PerVertex {\n"
15056 " vec4 gl_Position;\n"
15057 "};\n"
15058 "void main(){\n"
15059 " gl_Position = vec4(x);\n"
15060 "}\n";
15061 char const *fsSource =
15062 "#version 450\n"
15063 "\n"
15064 "layout(location=0) out vec4 color;\n"
15065 "void main(){\n"
15066 " color = vec4(1);\n"
15067 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015068
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015069 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15070 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015071
15072 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015073 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015074 pipe.AddShader(&vs);
15075 pipe.AddShader(&fs);
15076
15077 pipe.AddVertexInputBindings(input_bindings, 2);
15078 pipe.AddVertexInputAttribs(&input_attrib, 1);
15079
Chris Forbes280ba2c2015-06-12 11:16:41 +120015080 VkDescriptorSetObj descriptorSet(m_device);
15081 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015082 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015083
Tony Barbour5781e8f2015-08-04 16:23:11 -060015084 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015085
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015086 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015087}
Chris Forbes8f68b562015-05-25 11:13:32 +120015088
Karl Schultz6addd812016-02-02 17:17:23 -070015089TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015090 TEST_DESCRIPTION(
15091 "Test that an error is produced for a fragment shader which does not "
15092 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015094
Tony Barbour1fa09702017-03-16 12:09:08 -060015095 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015096
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015097 char const *vsSource =
15098 "#version 450\n"
15099 "\n"
15100 "out gl_PerVertex {\n"
15101 " vec4 gl_Position;\n"
15102 "};\n"
15103 "void main(){\n"
15104 " gl_Position = vec4(1);\n"
15105 "}\n";
15106 char const *fsSource =
15107 "#version 450\n"
15108 "\n"
15109 "void main(){\n"
15110 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015111
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015112 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15113 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015114
15115 VkPipelineObj pipe(m_device);
15116 pipe.AddShader(&vs);
15117 pipe.AddShader(&fs);
15118
Chia-I Wu08accc62015-07-07 11:50:03 +080015119 /* set up CB 0, not written */
15120 pipe.AddColorAttachment();
15121 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015122
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015123 VkDescriptorSetObj descriptorSet(m_device);
15124 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015125 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015126
Tony Barbour5781e8f2015-08-04 16:23:11 -060015127 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015128
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015129 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015130}
15131
Karl Schultz6addd812016-02-02 17:17:23 -070015132TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015133 TEST_DESCRIPTION(
15134 "Test that a warning is produced for a fragment shader which provides a spurious "
15135 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015137 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015138
Tony Barbour1fa09702017-03-16 12:09:08 -060015139 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015140
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015141 char const *vsSource =
15142 "#version 450\n"
15143 "\n"
15144 "out gl_PerVertex {\n"
15145 " vec4 gl_Position;\n"
15146 "};\n"
15147 "void main(){\n"
15148 " gl_Position = vec4(1);\n"
15149 "}\n";
15150 char const *fsSource =
15151 "#version 450\n"
15152 "\n"
15153 "layout(location=0) out vec4 x;\n"
15154 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15155 "void main(){\n"
15156 " x = vec4(1);\n"
15157 " y = vec4(1);\n"
15158 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015159
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015160 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15161 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015162
15163 VkPipelineObj pipe(m_device);
15164 pipe.AddShader(&vs);
15165 pipe.AddShader(&fs);
15166
Chia-I Wu08accc62015-07-07 11:50:03 +080015167 /* set up CB 0, not written */
15168 pipe.AddColorAttachment();
15169 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015170 /* FS writes CB 1, but we don't configure it */
15171
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015172 VkDescriptorSetObj descriptorSet(m_device);
15173 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015174 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015175
Tony Barbour5781e8f2015-08-04 16:23:11 -060015176 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015177
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015178 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015179}
15180
Karl Schultz6addd812016-02-02 17:17:23 -070015181TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015182 TEST_DESCRIPTION(
15183 "Test that an error is produced for a mismatch between the fundamental "
15184 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015186
Tony Barbour1fa09702017-03-16 12:09:08 -060015187 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015188
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015189 char const *vsSource =
15190 "#version 450\n"
15191 "\n"
15192 "out gl_PerVertex {\n"
15193 " vec4 gl_Position;\n"
15194 "};\n"
15195 "void main(){\n"
15196 " gl_Position = vec4(1);\n"
15197 "}\n";
15198 char const *fsSource =
15199 "#version 450\n"
15200 "\n"
15201 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15202 "void main(){\n"
15203 " x = ivec4(1);\n"
15204 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015205
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015206 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15207 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015208
15209 VkPipelineObj pipe(m_device);
15210 pipe.AddShader(&vs);
15211 pipe.AddShader(&fs);
15212
Chia-I Wu08accc62015-07-07 11:50:03 +080015213 /* set up CB 0; type is UNORM by default */
15214 pipe.AddColorAttachment();
15215 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015216
Chris Forbesa36d69e2015-05-25 11:13:44 +120015217 VkDescriptorSetObj descriptorSet(m_device);
15218 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015219 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015220
Tony Barbour5781e8f2015-08-04 16:23:11 -060015221 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015222
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015223 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015224}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015225
Karl Schultz6addd812016-02-02 17:17:23 -070015226TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015227 TEST_DESCRIPTION(
15228 "Test that an error is produced for a shader consuming a uniform "
15229 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015231
Tony Barbour1fa09702017-03-16 12:09:08 -060015232 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015233
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015234 char const *vsSource =
15235 "#version 450\n"
15236 "\n"
15237 "out gl_PerVertex {\n"
15238 " vec4 gl_Position;\n"
15239 "};\n"
15240 "void main(){\n"
15241 " gl_Position = vec4(1);\n"
15242 "}\n";
15243 char const *fsSource =
15244 "#version 450\n"
15245 "\n"
15246 "layout(location=0) out vec4 x;\n"
15247 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15248 "void main(){\n"
15249 " x = vec4(bar.y);\n"
15250 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015251
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015252 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15253 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015254
Chris Forbes556c76c2015-08-14 12:04:59 +120015255 VkPipelineObj pipe(m_device);
15256 pipe.AddShader(&vs);
15257 pipe.AddShader(&fs);
15258
15259 /* set up CB 0; type is UNORM by default */
15260 pipe.AddColorAttachment();
15261 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15262
15263 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015264 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015265
15266 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15267
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015268 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015269}
15270
Chris Forbes5c59e902016-02-26 16:56:09 +130015271TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015272 TEST_DESCRIPTION(
15273 "Test that an error is produced for a shader consuming push constants "
15274 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015276
Tony Barbour1fa09702017-03-16 12:09:08 -060015277 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015278
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015279 char const *vsSource =
15280 "#version 450\n"
15281 "\n"
15282 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15283 "out gl_PerVertex {\n"
15284 " vec4 gl_Position;\n"
15285 "};\n"
15286 "void main(){\n"
15287 " gl_Position = vec4(consts.x);\n"
15288 "}\n";
15289 char const *fsSource =
15290 "#version 450\n"
15291 "\n"
15292 "layout(location=0) out vec4 x;\n"
15293 "void main(){\n"
15294 " x = vec4(1);\n"
15295 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015296
15297 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15298 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15299
15300 VkPipelineObj pipe(m_device);
15301 pipe.AddShader(&vs);
15302 pipe.AddShader(&fs);
15303
15304 /* set up CB 0; type is UNORM by default */
15305 pipe.AddColorAttachment();
15306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15307
15308 VkDescriptorSetObj descriptorSet(m_device);
15309 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15310
15311 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15312
15313 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015314 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015315}
15316
Chris Forbes3fb17902016-08-22 14:57:55 +120015317TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015318 TEST_DESCRIPTION(
15319 "Test that an error is produced for a shader consuming an input attachment "
15320 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15322 "consumes input attachment index 0 but not provided in subpass");
15323
Tony Barbour1fa09702017-03-16 12:09:08 -060015324 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015325
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015326 char const *vsSource =
15327 "#version 450\n"
15328 "\n"
15329 "out gl_PerVertex {\n"
15330 " vec4 gl_Position;\n"
15331 "};\n"
15332 "void main(){\n"
15333 " gl_Position = vec4(1);\n"
15334 "}\n";
15335 char const *fsSource =
15336 "#version 450\n"
15337 "\n"
15338 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15339 "layout(location=0) out vec4 color;\n"
15340 "void main() {\n"
15341 " color = subpassLoad(x);\n"
15342 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015343
15344 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15345 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15346
15347 VkPipelineObj pipe(m_device);
15348 pipe.AddShader(&vs);
15349 pipe.AddShader(&fs);
15350 pipe.AddColorAttachment();
15351 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15352
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015353 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15354 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015355 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015356 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015357 ASSERT_VK_SUCCESS(err);
15358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015359 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015360 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015361 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015362 ASSERT_VK_SUCCESS(err);
15363
15364 // error here.
15365 pipe.CreateVKPipeline(pl, renderPass());
15366
15367 m_errorMonitor->VerifyFound();
15368
15369 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15370 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15371}
15372
Chris Forbes5a9a0472016-08-22 16:02:09 +120015373TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015374 TEST_DESCRIPTION(
15375 "Test that an error is produced for a shader consuming an input attachment "
15376 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15378 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15379
Tony Barbour1fa09702017-03-16 12:09:08 -060015380 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015381
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015382 char const *vsSource =
15383 "#version 450\n"
15384 "\n"
15385 "out gl_PerVertex {\n"
15386 " vec4 gl_Position;\n"
15387 "};\n"
15388 "void main(){\n"
15389 " gl_Position = vec4(1);\n"
15390 "}\n";
15391 char const *fsSource =
15392 "#version 450\n"
15393 "\n"
15394 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15395 "layout(location=0) out vec4 color;\n"
15396 "void main() {\n"
15397 " color = subpassLoad(x);\n"
15398 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015399
15400 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15401 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15402
15403 VkPipelineObj pipe(m_device);
15404 pipe.AddShader(&vs);
15405 pipe.AddShader(&fs);
15406 pipe.AddColorAttachment();
15407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15408
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015409 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15410 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015411 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015412 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015413 ASSERT_VK_SUCCESS(err);
15414
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015415 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015416 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015417 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015418 ASSERT_VK_SUCCESS(err);
15419
15420 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015421 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15422 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15423 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15424 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15425 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 +120015426 };
15427 VkAttachmentReference color = {
15428 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15429 };
15430 VkAttachmentReference input = {
15431 1, VK_IMAGE_LAYOUT_GENERAL,
15432 };
15433
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015434 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015435
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015436 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015437 VkRenderPass rp;
15438 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15439 ASSERT_VK_SUCCESS(err);
15440
15441 // error here.
15442 pipe.CreateVKPipeline(pl, rp);
15443
15444 m_errorMonitor->VerifyFound();
15445
15446 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15447 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15448 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15449}
15450
Chris Forbes541f7b02016-08-22 15:30:27 +120015451TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015452 TEST_DESCRIPTION(
15453 "Test that an error is produced for a shader consuming an input attachment "
15454 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015456 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015457
Tony Barbour1fa09702017-03-16 12:09:08 -060015458 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015459
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015460 char const *vsSource =
15461 "#version 450\n"
15462 "\n"
15463 "out gl_PerVertex {\n"
15464 " vec4 gl_Position;\n"
15465 "};\n"
15466 "void main(){\n"
15467 " gl_Position = vec4(1);\n"
15468 "}\n";
15469 char const *fsSource =
15470 "#version 450\n"
15471 "\n"
15472 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15473 "layout(location=0) out vec4 color;\n"
15474 "void main() {\n"
15475 " color = subpassLoad(xs[0]);\n"
15476 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015477
15478 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15479 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15480
15481 VkPipelineObj pipe(m_device);
15482 pipe.AddShader(&vs);
15483 pipe.AddShader(&fs);
15484 pipe.AddColorAttachment();
15485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15486
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015487 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15488 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015489 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015490 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015491 ASSERT_VK_SUCCESS(err);
15492
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015493 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015494 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015495 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015496 ASSERT_VK_SUCCESS(err);
15497
15498 // error here.
15499 pipe.CreateVKPipeline(pl, renderPass());
15500
15501 m_errorMonitor->VerifyFound();
15502
15503 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15504 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15505}
15506
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015507TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015508 TEST_DESCRIPTION(
15509 "Test that an error is produced for a compute pipeline consuming a "
15510 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015512
Tony Barbour1fa09702017-03-16 12:09:08 -060015513 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015514
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015515 char const *csSource =
15516 "#version 450\n"
15517 "\n"
15518 "layout(local_size_x=1) in;\n"
15519 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15520 "void main(){\n"
15521 " x = vec4(1);\n"
15522 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015523
15524 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15525
15526 VkDescriptorSetObj descriptorSet(m_device);
15527 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15528
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015529 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15530 nullptr,
15531 0,
15532 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15533 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15534 descriptorSet.GetPipelineLayout(),
15535 VK_NULL_HANDLE,
15536 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015537
15538 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015539 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015540
15541 m_errorMonitor->VerifyFound();
15542
15543 if (err == VK_SUCCESS) {
15544 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15545 }
15546}
15547
Chris Forbes22a9b092016-07-19 14:34:05 +120015548TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015549 TEST_DESCRIPTION(
15550 "Test that an error is produced for a pipeline consuming a "
15551 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15553 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015554
Tony Barbour1fa09702017-03-16 12:09:08 -060015555 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015556
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015557 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15558 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015559 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015560 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015561 ASSERT_VK_SUCCESS(err);
15562
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015563 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015564 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015565 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015566 ASSERT_VK_SUCCESS(err);
15567
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015568 char const *csSource =
15569 "#version 450\n"
15570 "\n"
15571 "layout(local_size_x=1) in;\n"
15572 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15573 "void main() {\n"
15574 " x.x = 1.0f;\n"
15575 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015576 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15577
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015578 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15579 nullptr,
15580 0,
15581 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15582 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15583 pl,
15584 VK_NULL_HANDLE,
15585 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015586
15587 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015588 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015589
15590 m_errorMonitor->VerifyFound();
15591
15592 if (err == VK_SUCCESS) {
15593 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15594 }
15595
15596 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15597 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15598}
15599
Chris Forbes50020592016-07-27 13:52:41 +120015600TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015601 TEST_DESCRIPTION(
15602 "Test that an error is produced when an image view type "
15603 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015604
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015605 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 +120015606
Tony Barbour1fa09702017-03-16 12:09:08 -060015607 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15609
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015610 char const *vsSource =
15611 "#version 450\n"
15612 "\n"
15613 "out gl_PerVertex { vec4 gl_Position; };\n"
15614 "void main() { gl_Position = vec4(0); }\n";
15615 char const *fsSource =
15616 "#version 450\n"
15617 "\n"
15618 "layout(set=0, binding=0) uniform sampler3D s;\n"
15619 "layout(location=0) out vec4 color;\n"
15620 "void main() {\n"
15621 " color = texture(s, vec3(0));\n"
15622 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015623 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15624 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15625
15626 VkPipelineObj pipe(m_device);
15627 pipe.AddShader(&vs);
15628 pipe.AddShader(&fs);
15629 pipe.AddColorAttachment();
15630
15631 VkTextureObj texture(m_device, nullptr);
15632 VkSamplerObj sampler(m_device);
15633
15634 VkDescriptorSetObj descriptorSet(m_device);
15635 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15636 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15637
15638 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15639 ASSERT_VK_SUCCESS(err);
15640
Tony Barbour552f6c02016-12-21 14:34:07 -070015641 m_commandBuffer->BeginCommandBuffer();
15642 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015643
15644 m_commandBuffer->BindPipeline(pipe);
15645 m_commandBuffer->BindDescriptorSet(descriptorSet);
15646
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015647 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015648 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015649 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015650 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15651
15652 // error produced here.
15653 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15654
15655 m_errorMonitor->VerifyFound();
15656
Tony Barbour552f6c02016-12-21 14:34:07 -070015657 m_commandBuffer->EndRenderPass();
15658 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015659}
15660
Chris Forbes5533bfc2016-07-27 14:12:34 +120015661TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015662 TEST_DESCRIPTION(
15663 "Test that an error is produced when a multisampled images "
15664 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015665
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015667
Tony Barbour1fa09702017-03-16 12:09:08 -060015668 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015669 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15670
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015671 char const *vsSource =
15672 "#version 450\n"
15673 "\n"
15674 "out gl_PerVertex { vec4 gl_Position; };\n"
15675 "void main() { gl_Position = vec4(0); }\n";
15676 char const *fsSource =
15677 "#version 450\n"
15678 "\n"
15679 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15680 "layout(location=0) out vec4 color;\n"
15681 "void main() {\n"
15682 " color = texelFetch(s, ivec2(0), 0);\n"
15683 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015684 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15685 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15686
15687 VkPipelineObj pipe(m_device);
15688 pipe.AddShader(&vs);
15689 pipe.AddShader(&fs);
15690 pipe.AddColorAttachment();
15691
15692 VkTextureObj texture(m_device, nullptr);
15693 VkSamplerObj sampler(m_device);
15694
15695 VkDescriptorSetObj descriptorSet(m_device);
15696 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15697 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15698
15699 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15700 ASSERT_VK_SUCCESS(err);
15701
Tony Barbour552f6c02016-12-21 14:34:07 -070015702 m_commandBuffer->BeginCommandBuffer();
15703 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015704
15705 m_commandBuffer->BindPipeline(pipe);
15706 m_commandBuffer->BindDescriptorSet(descriptorSet);
15707
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015708 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015709 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015710 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015711 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15712
15713 // error produced here.
15714 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15715
15716 m_errorMonitor->VerifyFound();
15717
Tony Barbour552f6c02016-12-21 14:34:07 -070015718 m_commandBuffer->EndRenderPass();
15719 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015720}
15721
Mark Youngc48c4c12016-04-11 14:26:49 -060015722TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015724
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015725 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15726 {
15727 VkFormatProperties properties;
15728 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15729 if (properties.optimalTilingFeatures == 0) {
15730 printf(" Image format not supported; skipped.\n");
15731 return;
15732 }
15733 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015734
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015735 VkImageCreateInfo info = {};
15736 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15737 info.pNext = NULL;
15738 info.imageType = VK_IMAGE_TYPE_2D;
15739 info.format = format;
15740 info.extent.height = 32;
15741 info.extent.depth = 1;
15742 info.mipLevels = 1;
15743 info.arrayLayers = 1;
15744 info.samples = VK_SAMPLE_COUNT_1_BIT;
15745 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15746 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15747 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015748
15749 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015750 {
15751 VkImageFormatProperties properties;
15752 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15753 info.tiling, info.usage, info.flags, &properties);
15754 ASSERT_VK_SUCCESS(result);
15755 info.extent.width = properties.maxExtent.width + 1;
15756 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015757
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015758 VkImage image;
15759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15760 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015761 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015762}
15763
Mark Youngc48c4c12016-04-11 14:26:49 -060015764TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015765 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015766
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015767 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15768 {
15769 VkFormatProperties properties;
15770 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15771 if (properties.optimalTilingFeatures == 0) {
15772 printf(" Image format not supported; skipped.\n");
15773 return;
15774 }
15775 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015776
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015777 VkImageCreateInfo info = {};
15778 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15779 info.pNext = NULL;
15780 info.imageType = VK_IMAGE_TYPE_2D;
15781 info.format = format;
15782 info.extent.height = 32;
15783 info.extent.depth = 1;
15784 info.mipLevels = 1;
15785 info.arrayLayers = 1;
15786 info.samples = VK_SAMPLE_COUNT_1_BIT;
15787 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15788 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15789 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015790
15791 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015792 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015793
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015794 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015796 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15797 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015798 m_errorMonitor->VerifyFound();
15799}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015800
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015801TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015802 TEST_DESCRIPTION(
15803 "Create a render pass with an attachment description "
15804 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015805
Tony Barbour1fa09702017-03-16 12:09:08 -060015806 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15808
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015810
15811 VkAttachmentReference color_attach = {};
15812 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15813 color_attach.attachment = 0;
15814 VkSubpassDescription subpass = {};
15815 subpass.colorAttachmentCount = 1;
15816 subpass.pColorAttachments = &color_attach;
15817
15818 VkRenderPassCreateInfo rpci = {};
15819 rpci.subpassCount = 1;
15820 rpci.pSubpasses = &subpass;
15821 rpci.attachmentCount = 1;
15822 VkAttachmentDescription attach_desc = {};
15823 attach_desc.format = VK_FORMAT_UNDEFINED;
15824 rpci.pAttachments = &attach_desc;
15825 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15826 VkRenderPass rp;
15827 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15828
15829 m_errorMonitor->VerifyFound();
15830
15831 if (result == VK_SUCCESS) {
15832 vkDestroyRenderPass(m_device->device(), rp, NULL);
15833 }
15834}
15835
Karl Schultz6addd812016-02-02 17:17:23 -070015836TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015837 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015838
Mike Stroyana3082432015-09-25 13:39:21 -060015839 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015840 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15841 const int32_t tex_width = 32;
15842 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015843
15844 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015845 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15846 image_create_info.pNext = NULL;
15847 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15848 image_create_info.format = tex_format;
15849 image_create_info.extent.width = tex_width;
15850 image_create_info.extent.height = tex_height;
15851 image_create_info.extent.depth = 1;
15852 image_create_info.mipLevels = 1;
15853 image_create_info.arrayLayers = 1;
15854 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15855 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15856 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15857 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015858
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015859 VkImage image;
15860 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015861 ASSERT_VK_SUCCESS(err);
15862
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015863 VkMemoryRequirements requirements;
15864 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15865
15866 VkMemoryAllocateInfo alloc_info{};
15867 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15868 alloc_info.pNext = NULL;
15869 alloc_info.memoryTypeIndex = 0;
15870 alloc_info.allocationSize = requirements.size;
15871 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15872 ASSERT_TRUE(pass);
15873
15874 VkDeviceMemory memory;
15875 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15876 ASSERT_VK_SUCCESS(err);
15877
15878 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15879
Tobin Ehliscde08892015-09-22 10:11:37 -060015880 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015881 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015882 image_view_create_info.image = image;
15883 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15884 image_view_create_info.format = tex_format;
15885 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015886 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015887 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015888 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015889
15890 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015892 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015893 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015894
15895 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015896 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015897}
Mike Stroyana3082432015-09-25 13:39:21 -060015898
Mark Youngd339ba32016-05-30 13:28:35 -060015899TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15900 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015902 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015903
Tony Barbour1fa09702017-03-16 12:09:08 -060015904 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015905
15906 // Create an image and try to create a view with no memory backing the image
15907 VkImage image;
15908
15909 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15910 const int32_t tex_width = 32;
15911 const int32_t tex_height = 32;
15912
15913 VkImageCreateInfo image_create_info = {};
15914 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15915 image_create_info.pNext = NULL;
15916 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15917 image_create_info.format = tex_format;
15918 image_create_info.extent.width = tex_width;
15919 image_create_info.extent.height = tex_height;
15920 image_create_info.extent.depth = 1;
15921 image_create_info.mipLevels = 1;
15922 image_create_info.arrayLayers = 1;
15923 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15924 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15925 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15926 image_create_info.flags = 0;
15927
15928 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15929 ASSERT_VK_SUCCESS(err);
15930
15931 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015932 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015933 image_view_create_info.image = image;
15934 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15935 image_view_create_info.format = tex_format;
15936 image_view_create_info.subresourceRange.layerCount = 1;
15937 image_view_create_info.subresourceRange.baseMipLevel = 0;
15938 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015939 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015940
15941 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015942 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015943
15944 m_errorMonitor->VerifyFound();
15945 vkDestroyImage(m_device->device(), image, NULL);
15946 // If last error is success, it still created the view, so delete it.
15947 if (err == VK_SUCCESS) {
15948 vkDestroyImageView(m_device->device(), view, NULL);
15949 }
Mark Youngd339ba32016-05-30 13:28:35 -060015950}
15951
Karl Schultz6addd812016-02-02 17:17:23 -070015952TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015953 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015955
Tony Barbour1fa09702017-03-16 12:09:08 -060015956 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015957
Karl Schultz6addd812016-02-02 17:17:23 -070015958 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015959 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015960 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015961 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015962
15963 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015964 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015965 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015966 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15967 image_view_create_info.format = tex_format;
15968 image_view_create_info.subresourceRange.baseMipLevel = 0;
15969 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015970 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015971 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015972 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015973
15974 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015975 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015976
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015977 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015978}
15979
Mike Weiblena1e13f42017-02-09 21:25:59 -070015980TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15981 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15982
Tony Barbour1fa09702017-03-16 12:09:08 -060015983 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015984 VkSubresourceLayout subres_layout = {};
15985
15986 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15987 {
15988 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15989 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015990 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015991 ASSERT_TRUE(img.initialized());
15992
15993 VkImageSubresource subres = {};
15994 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15995 subres.mipLevel = 0;
15996 subres.arrayLayer = 0;
15997
15998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15999 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16000 m_errorMonitor->VerifyFound();
16001 }
16002
16003 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
16004 {
16005 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016006 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016007 ASSERT_TRUE(img.initialized());
16008
16009 VkImageSubresource subres = {};
16010 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16011 subres.mipLevel = 0;
16012 subres.arrayLayer = 0;
16013
16014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16016 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16017 m_errorMonitor->VerifyFound();
16018 }
16019
16020 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16021 {
16022 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016023 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016024 ASSERT_TRUE(img.initialized());
16025
16026 VkImageSubresource subres = {};
16027 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16028 subres.mipLevel = 1; // ERROR: triggers VU 00739
16029 subres.arrayLayer = 0;
16030
16031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16032 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16033 m_errorMonitor->VerifyFound();
16034 }
16035
16036 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16037 {
16038 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016039 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016040 ASSERT_TRUE(img.initialized());
16041
16042 VkImageSubresource subres = {};
16043 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16044 subres.mipLevel = 0;
16045 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16046
16047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16048 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16049 m_errorMonitor->VerifyFound();
16050 }
16051}
16052
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016053TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016054 VkResult err;
16055 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016056
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016058
Tony Barbour1fa09702017-03-16 12:09:08 -060016059 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016060
16061 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016062 VkImage srcImage;
16063 VkImage dstImage;
16064 VkDeviceMemory srcMem;
16065 VkDeviceMemory destMem;
16066 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016067
16068 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016069 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16070 image_create_info.pNext = NULL;
16071 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16072 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16073 image_create_info.extent.width = 32;
16074 image_create_info.extent.height = 32;
16075 image_create_info.extent.depth = 1;
16076 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016077 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016078 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16079 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16080 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16081 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016082
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016083 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016084 ASSERT_VK_SUCCESS(err);
16085
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016086 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016087 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016088 ASSERT_VK_SUCCESS(err);
16089
16090 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016091 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016092 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16093 memAlloc.pNext = NULL;
16094 memAlloc.allocationSize = 0;
16095 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016096
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016097 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016098 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016099 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016100 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016101 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016102 ASSERT_VK_SUCCESS(err);
16103
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016104 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016105 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016106 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016107 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016108 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016109 ASSERT_VK_SUCCESS(err);
16110
16111 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16112 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016113 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016114 ASSERT_VK_SUCCESS(err);
16115
Tony Barbour552f6c02016-12-21 14:34:07 -070016116 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016117 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016118 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016119 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016120 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016121 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016122 copyRegion.srcOffset.x = 0;
16123 copyRegion.srcOffset.y = 0;
16124 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016125 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016126 copyRegion.dstSubresource.mipLevel = 0;
16127 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016128 // Introduce failure by forcing the dst layerCount to differ from src
16129 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016130 copyRegion.dstOffset.x = 0;
16131 copyRegion.dstOffset.y = 0;
16132 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016133 copyRegion.extent.width = 1;
16134 copyRegion.extent.height = 1;
16135 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016136 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016137 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016138
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016139 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016140
Chia-I Wuf7458c52015-10-26 21:10:41 +080016141 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016142 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016143 vkFreeMemory(m_device->device(), srcMem, NULL);
16144 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016145}
16146
Tony Barbourd6673642016-05-05 14:46:39 -060016147TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016148 TEST_DESCRIPTION("Creating images with unsuported formats ");
16149
Tony Barbour1fa09702017-03-16 12:09:08 -060016150 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016151 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016152
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016153 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016154 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016155 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016156 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16157 image_create_info.format = VK_FORMAT_UNDEFINED;
16158 image_create_info.extent.width = 32;
16159 image_create_info.extent.height = 32;
16160 image_create_info.extent.depth = 1;
16161 image_create_info.mipLevels = 1;
16162 image_create_info.arrayLayers = 1;
16163 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16164 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16165 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016166
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16168 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016169
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016170 VkImage image;
16171 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016172 m_errorMonitor->VerifyFound();
16173
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016174 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016175 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016176 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16177 VkFormat format = static_cast<VkFormat>(f);
16178 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016179 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016180 unsupported = format;
16181 break;
16182 }
16183 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016184
Tony Barbourd6673642016-05-05 14:46:39 -060016185 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016186 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016188
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016189 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016190 m_errorMonitor->VerifyFound();
16191 }
16192}
16193
16194TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016195 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16196
Tony Barbour1fa09702017-03-16 12:09:08 -060016197 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016198 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016199 if (!depth_format) {
16200 return;
16201 }
Tony Barbourd6673642016-05-05 14:46:39 -060016202
16203 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016204 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 -060016205 VK_IMAGE_TILING_OPTIMAL, 0);
16206 ASSERT_TRUE(image.initialized());
16207
16208 VkImageView imgView;
16209 VkImageViewCreateInfo imgViewInfo = {};
16210 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16211 imgViewInfo.image = image.handle();
16212 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16213 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16214 imgViewInfo.subresourceRange.layerCount = 1;
16215 imgViewInfo.subresourceRange.baseMipLevel = 0;
16216 imgViewInfo.subresourceRange.levelCount = 1;
16217 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16218
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016219 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016220 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016222 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16223 m_errorMonitor->VerifyFound();
16224 imgViewInfo.subresourceRange.baseMipLevel = 0;
16225
Tony Barbourd6673642016-05-05 14:46:39 -060016226 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16227 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016229 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16230 m_errorMonitor->VerifyFound();
16231 imgViewInfo.subresourceRange.levelCount = 1;
16232
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016233 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16234 imgViewInfo.subresourceRange.levelCount = 2;
16235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16236 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16237 m_errorMonitor->VerifyFound();
16238 imgViewInfo.subresourceRange.levelCount = 1;
16239
16240 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16241 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16243 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16244 m_errorMonitor->VerifyFound();
16245 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16246
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016247 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16248 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016249 m_errorMonitor->SetDesiredFailureMsg(
16250 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16251 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016252 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16253 m_errorMonitor->VerifyFound();
16254 imgViewInfo.subresourceRange.layerCount = 1;
16255
Tony Barbourd6673642016-05-05 14:46:39 -060016256 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016257 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016258 m_errorMonitor->SetDesiredFailureMsg(
16259 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16260 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016261 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16262 m_errorMonitor->VerifyFound();
16263 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16264
Tony Barbourd6673642016-05-05 14:46:39 -060016265 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16266 // VIEW_CREATE_ERROR
16267 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016269 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16270 m_errorMonitor->VerifyFound();
16271 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16272
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016273 // TODO: Update framework to easily passing mutable flag into ImageObj init
16274 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016275 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16276 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16277 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016278 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16279 // VIEW_CREATE_ERROR
16280 VkImageCreateInfo mutImgInfo = image.create_info();
16281 VkImage mutImage;
16282 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016283 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016284 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16285 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016286 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016287 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016288
16289 VkMemoryRequirements requirements;
16290 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16291
16292 VkMemoryAllocateInfo alloc_info{};
16293 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16294 alloc_info.pNext = NULL;
16295 alloc_info.memoryTypeIndex = 0;
16296 alloc_info.allocationSize = requirements.size;
16297 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16298 ASSERT_TRUE(pass);
16299
16300 VkDeviceMemory memory;
16301 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16302 ASSERT_VK_SUCCESS(ret);
16303
16304 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16305 ASSERT_VK_SUCCESS(ret);
16306
Tony Barbourd6673642016-05-05 14:46:39 -060016307 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016309 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16310 m_errorMonitor->VerifyFound();
16311 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016312
16313 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016314 vkDestroyImage(m_device->handle(), mutImage, NULL);
16315}
16316
Dave Houlton75967fc2017-03-06 17:21:16 -070016317TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16318 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16319
Tony Barbour1fa09702017-03-16 12:09:08 -060016320 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016321
Jamie Madill35127872017-03-15 16:17:46 -040016322 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016323 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16324 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16325 if (device_features.textureCompressionBC) {
16326 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16327 } else if (device_features.textureCompressionETC2) {
16328 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16329 } else if (device_features.textureCompressionASTC_LDR) {
16330 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16331 } else {
16332 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16333 return;
16334 }
16335
16336 VkImageCreateInfo ci;
16337 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16338 ci.pNext = NULL;
16339 ci.flags = 0;
16340 ci.imageType = VK_IMAGE_TYPE_2D;
16341 ci.format = compressed_format;
16342 ci.extent = {32, 32, 1};
16343 ci.mipLevels = 6;
16344 ci.arrayLayers = 1;
16345 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16346 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16347 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16348 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16349 ci.queueFamilyIndexCount = 0;
16350 ci.pQueueFamilyIndices = NULL;
16351 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16352
16353 VkImageObj image(m_device);
16354 image.init(&ci);
16355 ASSERT_TRUE(image.initialized());
16356
16357 VkImageObj odd_image(m_device);
16358 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16359 odd_image.init(&ci);
16360 ASSERT_TRUE(odd_image.initialized());
16361
16362 // Allocate buffers
16363 VkMemoryPropertyFlags reqs = 0;
16364 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16365 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16366 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16367 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16368 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16369
16370 VkBufferImageCopy region = {};
16371 region.bufferRowLength = 0;
16372 region.bufferImageHeight = 0;
16373 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16374 region.imageSubresource.layerCount = 1;
16375 region.imageOffset = {0, 0, 0};
16376 region.bufferOffset = 0;
16377
16378 // start recording
16379 m_commandBuffer->BeginCommandBuffer();
16380
16381 // Mip level copies that work - 5 levels
16382 m_errorMonitor->ExpectSuccess();
16383
16384 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16385 region.imageExtent = {32, 32, 1};
16386 region.imageSubresource.mipLevel = 0;
16387 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16388 &region);
16389 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16390 &region);
16391
16392 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16393 region.imageExtent = {8, 8, 1};
16394 region.imageSubresource.mipLevel = 2;
16395 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16396 &region);
16397 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16398 &region);
16399
16400 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16401 region.imageExtent = {4, 4, 1};
16402 region.imageSubresource.mipLevel = 3;
16403 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16404 &region);
16405 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16406 &region);
16407
16408 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16409 region.imageExtent = {2, 2, 1};
16410 region.imageSubresource.mipLevel = 4;
16411 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16412 &region);
16413 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16414 &region);
16415
16416 region.imageExtent = {1, 1, 1};
16417 region.imageSubresource.mipLevel = 5;
16418 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16419 &region);
16420 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16421 &region);
16422 m_errorMonitor->VerifyNotFound();
16423
16424 // Buffer must accomodate a full compressed block, regardless of texel count
16425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16426 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16427 &region);
16428 m_errorMonitor->VerifyFound();
16429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16430 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16431 &region);
16432 m_errorMonitor->VerifyFound();
16433
16434 // Copy width < compressed block size, but not the full mip width
16435 region.imageExtent = {1, 2, 1};
16436 region.imageSubresource.mipLevel = 4;
16437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16438 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16439 &region);
16440 m_errorMonitor->VerifyFound();
16441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16442 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16443 &region);
16444 m_errorMonitor->VerifyFound();
16445
16446 // Copy height < compressed block size but not the full mip height
16447 region.imageExtent = {2, 1, 1};
16448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16449 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16450 &region);
16451 m_errorMonitor->VerifyFound();
16452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16453 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16454 &region);
16455 m_errorMonitor->VerifyFound();
16456
16457 // Offsets must be multiple of compressed block size
16458 region.imageOffset = {1, 1, 0};
16459 region.imageExtent = {1, 1, 1};
16460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16461 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16462 &region);
16463 m_errorMonitor->VerifyFound();
16464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16465 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16466 &region);
16467 m_errorMonitor->VerifyFound();
16468
16469 // Offset + extent width = mip width - should succeed
16470 region.imageOffset = {4, 4, 0};
16471 region.imageExtent = {3, 4, 1};
16472 region.imageSubresource.mipLevel = 2;
16473 m_errorMonitor->ExpectSuccess();
16474 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16475 &region);
16476 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16477 &region);
16478 m_errorMonitor->VerifyNotFound();
16479
16480 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16481 region.imageExtent = {4, 4, 1};
16482 m_errorMonitor->ExpectSuccess();
16483 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16484 &region);
16485 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16486 &region);
16487 m_errorMonitor->VerifyNotFound();
16488
16489 // Offset + extent width < mip width and not a multiple of block width - should fail
16490 region.imageExtent = {3, 3, 1};
16491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16492 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16493 &region);
16494 m_errorMonitor->VerifyFound();
16495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16496 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16497 &region);
16498 m_errorMonitor->VerifyFound();
16499}
16500
Dave Houlton59a20702017-02-02 17:26:23 -070016501TEST_F(VkLayerTest, ImageBufferCopyTests) {
16502 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16503
Tony Barbour1fa09702017-03-16 12:09:08 -060016504 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016505 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16506 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16507 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16508 return;
16509 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016510
16511 // Bail if any dimension of transfer granularity is 0.
16512 auto index = m_device->graphics_queue_node_index_;
16513 auto queue_family_properties = m_device->phy().queue_properties();
16514 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16515 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16516 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16517 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16518 return;
16519 }
16520
Dave Houlton59a20702017-02-02 17:26:23 -070016521 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16522 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16523 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016524 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16525 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16526 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16527 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16528
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016529 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016530 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16531 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016532 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016533 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16534 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016535 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 -070016536 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016537 ASSERT_TRUE(image_64k.initialized());
16538 ASSERT_TRUE(image_16k.initialized());
16539 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016540
Dave Houltonf3229d52017-02-21 15:59:08 -070016541 // Verify all needed Depth/Stencil formats are supported
16542 bool missing_ds_support = false;
16543 VkFormatProperties props = {0, 0, 0};
16544 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16545 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16546 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16547 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16548 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16549 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16550 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16551 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16552
16553 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016554 ds_image_4D_1S.Init(
16555 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016556 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16557 VK_IMAGE_TILING_OPTIMAL, 0);
16558 ASSERT_TRUE(ds_image_4D_1S.initialized());
16559
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016560 ds_image_3D_1S.Init(
16561 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016562 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16563 VK_IMAGE_TILING_OPTIMAL, 0);
16564 ASSERT_TRUE(ds_image_3D_1S.initialized());
16565
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016566 ds_image_2D.Init(
16567 256, 256, 1, VK_FORMAT_D16_UNORM,
16568 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16569 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016570 ASSERT_TRUE(ds_image_2D.initialized());
16571
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016572 ds_image_1S.Init(
16573 256, 256, 1, VK_FORMAT_S8_UINT,
16574 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16575 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016576 ASSERT_TRUE(ds_image_1S.initialized());
16577 }
16578
16579 // Allocate buffers
16580 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016581 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016582 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16583 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16584 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16585 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016586
16587 VkBufferImageCopy region = {};
16588 region.bufferRowLength = 0;
16589 region.bufferImageHeight = 0;
16590 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16591 region.imageSubresource.layerCount = 1;
16592 region.imageOffset = {0, 0, 0};
16593 region.imageExtent = {64, 64, 1};
16594 region.bufferOffset = 0;
16595
16596 // attempt copies before putting command buffer in recording state
16597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16598 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16599 &region);
16600 m_errorMonitor->VerifyFound();
16601
16602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16603 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16604 &region);
16605 m_errorMonitor->VerifyFound();
16606
16607 // start recording
16608 m_commandBuffer->BeginCommandBuffer();
16609
16610 // successful copies
16611 m_errorMonitor->ExpectSuccess();
16612 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16613 &region);
16614 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16615 &region);
16616 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16617 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16618 &region);
16619 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16620 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16621 &region);
16622 region.imageOffset.x = 0;
16623 region.imageExtent.height = 64;
16624 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16625 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16626 &region);
16627 m_errorMonitor->VerifyNotFound();
16628
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016629 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016630 region.imageExtent = {65, 64, 1};
16631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16632 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16633 &region);
16634 m_errorMonitor->VerifyFound();
16635
16636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16637 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16638 &region);
16639 m_errorMonitor->VerifyFound();
16640
16641 // image/buffer too small (offset) on copy to image
16642 region.imageExtent = {64, 64, 1};
16643 region.imageOffset = {0, 4, 0};
16644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16645 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16646 &region);
16647 m_errorMonitor->VerifyFound();
16648
16649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16650 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16651 &region);
16652 m_errorMonitor->VerifyFound();
16653
16654 // image/buffer too small on copy to buffer
16655 region.imageExtent = {64, 64, 1};
16656 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016657 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16659 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16660 &region);
16661 m_errorMonitor->VerifyFound();
16662
16663 region.imageExtent = {64, 65, 1};
16664 region.bufferOffset = 0;
16665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16666 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16667 &region);
16668 m_errorMonitor->VerifyFound();
16669
16670 // buffer size ok but rowlength causes loose packing
16671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16672 region.imageExtent = {64, 64, 1};
16673 region.bufferRowLength = 68;
16674 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16675 &region);
16676 m_errorMonitor->VerifyFound();
16677
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016678 // An extent with zero area should produce a warning, but no error
16679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16680 region.imageExtent.width = 0;
16681 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16682 &region);
16683 m_errorMonitor->VerifyFound();
16684
Dave Houlton59a20702017-02-02 17:26:23 -070016685 // aspect bits
16686 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16687 region.imageExtent = {64, 64, 1};
16688 region.bufferRowLength = 0;
16689 region.bufferImageHeight = 0;
16690 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16691 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16692 buffer_16k.handle(), 1, &region);
16693 m_errorMonitor->VerifyFound();
16694
16695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16696 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16697 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16698 &region);
16699 m_errorMonitor->VerifyFound();
16700
16701 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16702 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16703 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16704 buffer_16k.handle(), 1, &region);
16705 m_errorMonitor->VerifyFound();
16706
Dave Houltonf3229d52017-02-21 15:59:08 -070016707 // Test Depth/Stencil copies
16708 if (missing_ds_support) {
16709 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16710 } else {
16711 VkBufferImageCopy ds_region = {};
16712 ds_region.bufferOffset = 0;
16713 ds_region.bufferRowLength = 0;
16714 ds_region.bufferImageHeight = 0;
16715 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16716 ds_region.imageSubresource.mipLevel = 0;
16717 ds_region.imageSubresource.baseArrayLayer = 0;
16718 ds_region.imageSubresource.layerCount = 1;
16719 ds_region.imageOffset = {0, 0, 0};
16720 ds_region.imageExtent = {256, 256, 1};
16721
16722 // Depth copies that should succeed
16723 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16724 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16725 buffer_256k.handle(), 1, &ds_region);
16726 m_errorMonitor->VerifyNotFound();
16727
16728 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16729 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16730 buffer_256k.handle(), 1, &ds_region);
16731 m_errorMonitor->VerifyNotFound();
16732
16733 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16734 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16735 buffer_128k.handle(), 1, &ds_region);
16736 m_errorMonitor->VerifyNotFound();
16737
16738 // Depth copies that should fail
16739 ds_region.bufferOffset = 4;
16740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16741 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16742 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16743 buffer_256k.handle(), 1, &ds_region);
16744 m_errorMonitor->VerifyFound();
16745
16746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16747 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16748 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16749 buffer_256k.handle(), 1, &ds_region);
16750 m_errorMonitor->VerifyFound();
16751
16752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16753 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16754 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16755 buffer_128k.handle(), 1, &ds_region);
16756 m_errorMonitor->VerifyFound();
16757
16758 // Stencil copies that should succeed
16759 ds_region.bufferOffset = 0;
16760 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16761 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16762 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16763 buffer_64k.handle(), 1, &ds_region);
16764 m_errorMonitor->VerifyNotFound();
16765
16766 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16767 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16768 buffer_64k.handle(), 1, &ds_region);
16769 m_errorMonitor->VerifyNotFound();
16770
16771 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16772 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16773 buffer_64k.handle(), 1, &ds_region);
16774 m_errorMonitor->VerifyNotFound();
16775
16776 // Stencil copies that should fail
16777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16778 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16779 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16780 buffer_16k.handle(), 1, &ds_region);
16781 m_errorMonitor->VerifyFound();
16782
16783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16784 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16785 ds_region.bufferRowLength = 260;
16786 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16787 buffer_64k.handle(), 1, &ds_region);
16788 m_errorMonitor->VerifyFound();
16789
16790 ds_region.bufferRowLength = 0;
16791 ds_region.bufferOffset = 4;
16792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16793 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16794 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16795 buffer_64k.handle(), 1, &ds_region);
16796 m_errorMonitor->VerifyFound();
16797 }
16798
Dave Houlton584d51e2017-02-16 12:52:54 -070016799 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016800 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016801 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016802 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16803 device_features.textureCompressionASTC_LDR)) {
16804 printf(" No compressed formats supported - block compression tests skipped.\n");
16805 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016806 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16807 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016808 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016809 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16810 0);
16811 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 -070016812 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016813 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016814 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 -070016815 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016816 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 -070016817 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016818 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016819 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 -070016820 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016821 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 -070016822 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016823 }
16824 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016825
Dave Houlton584d51e2017-02-16 12:52:54 -070016826 // Just fits
16827 m_errorMonitor->ExpectSuccess();
16828 region.imageExtent = {128, 128, 1};
16829 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16830 buffer_16k.handle(), 1, &region);
16831 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016832
Dave Houlton584d51e2017-02-16 12:52:54 -070016833 // with offset, too big for buffer
16834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16835 region.bufferOffset = 16;
16836 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16837 buffer_16k.handle(), 1, &region);
16838 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016839 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016840
Dave Houlton67e9b532017-03-02 17:00:10 -070016841 // extents that are not a multiple of compressed block size
16842 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16843 region.imageExtent.width = 66;
16844 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16845 buffer_16k.handle(), 1, &region);
16846 m_errorMonitor->VerifyFound();
16847 region.imageExtent.width = 128;
16848
16849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016850 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016851 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16852 buffer_16k.handle(), 1, &region);
16853 m_errorMonitor->VerifyFound();
16854 region.imageExtent.height = 128;
16855
16856 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16857
16858 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16859 m_errorMonitor->ExpectSuccess();
16860 region.imageExtent.width = 66;
16861 region.imageOffset.x = 64;
16862 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16863 buffer_16k.handle(), 1, &region);
16864 region.imageExtent.width = 16;
16865 region.imageOffset.x = 0;
16866 region.imageExtent.height = 2;
16867 region.imageOffset.y = 128;
16868 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016869 buffer_16k.handle(), 1, &region);
16870 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016871 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016872
Dave Houlton584d51e2017-02-16 12:52:54 -070016873 // buffer offset must be a multiple of texel block size (16)
16874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16876 region.imageExtent = {64, 64, 1};
16877 region.bufferOffset = 24;
16878 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16879 buffer_16k.handle(), 1, &region);
16880 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016881
Dave Houlton584d51e2017-02-16 12:52:54 -070016882 // rowlength not a multiple of block width (4)
16883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16884 region.bufferOffset = 0;
16885 region.bufferRowLength = 130;
16886 region.bufferImageHeight = 0;
16887 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16888 buffer_64k.handle(), 1, &region);
16889 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016890
Dave Houlton584d51e2017-02-16 12:52:54 -070016891 // imageheight not a multiple of block height (4)
16892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16893 region.bufferRowLength = 0;
16894 region.bufferImageHeight = 130;
16895 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16896 buffer_64k.handle(), 1, &region);
16897 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016898 }
Dave Houlton59a20702017-02-02 17:26:23 -070016899}
16900
Tony Barbourd6673642016-05-05 14:46:39 -060016901TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016902 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016903
Tony Barbour1fa09702017-03-16 12:09:08 -060016904 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016905
Rene Lindsay135204f2016-12-22 17:11:09 -070016906 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016907 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016908 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 -070016909 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016910 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016911 vk_testing::Buffer buffer;
16912 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016913 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016914 VkBufferImageCopy region = {};
16915 region.bufferRowLength = 128;
16916 region.bufferImageHeight = 128;
16917 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16918 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016919 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016920 region.imageExtent.height = 4;
16921 region.imageExtent.width = 4;
16922 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016923
16924 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016925 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 -070016926 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016927 ASSERT_TRUE(image2.initialized());
16928 vk_testing::Buffer buffer2;
16929 VkMemoryPropertyFlags reqs2 = 0;
16930 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16931 VkBufferImageCopy region2 = {};
16932 region2.bufferRowLength = 128;
16933 region2.bufferImageHeight = 128;
16934 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16935 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16936 region2.imageSubresource.layerCount = 1;
16937 region2.imageExtent.height = 4;
16938 region2.imageExtent.width = 4;
16939 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016940 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016941
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016942 // Image must have offset.z of 0 and extent.depth of 1
16943 // Introduce failure by setting imageExtent.depth to 0
16944 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016946 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016947 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016948 m_errorMonitor->VerifyFound();
16949
16950 region.imageExtent.depth = 1;
16951
16952 // Image must have offset.z of 0 and extent.depth of 1
16953 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016954 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016955 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016958 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016959 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016960 m_errorMonitor->VerifyFound();
16961
16962 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016963 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16964 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016965 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016967 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16968 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016969 m_errorMonitor->VerifyFound();
16970
16971 // BufferOffset must be a multiple of 4
16972 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016973 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016975 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16976 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016977 m_errorMonitor->VerifyFound();
16978
16979 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16980 region.bufferOffset = 0;
16981 region.imageExtent.height = 128;
16982 region.imageExtent.width = 128;
16983 // Introduce failure by setting bufferRowLength > 0 but less than width
16984 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016986 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16987 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016988 m_errorMonitor->VerifyFound();
16989
16990 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16991 region.bufferRowLength = 128;
16992 // Introduce failure by setting bufferRowHeight > 0 but less than height
16993 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016995 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16996 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016997 m_errorMonitor->VerifyFound();
16998
16999 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060017000 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017001 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 -070017002 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017003 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017004 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 -070017005 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017006 VkImageBlit blitRegion = {};
17007 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17008 blitRegion.srcSubresource.baseArrayLayer = 0;
17009 blitRegion.srcSubresource.layerCount = 1;
17010 blitRegion.srcSubresource.mipLevel = 0;
17011 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17012 blitRegion.dstSubresource.baseArrayLayer = 0;
17013 blitRegion.dstSubresource.layerCount = 1;
17014 blitRegion.dstSubresource.mipLevel = 0;
17015
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017016 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17018 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17020 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017021 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17022 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017023 m_errorMonitor->VerifyFound();
17024
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017025 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017026 VkImageMemoryBarrier img_barrier;
17027 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17028 img_barrier.pNext = NULL;
17029 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17030 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17031 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17032 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17033 img_barrier.image = image.handle();
17034 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17035 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17036 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17037 img_barrier.subresourceRange.baseArrayLayer = 0;
17038 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017039 img_barrier.subresourceRange.layerCount = 0;
17040 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017041 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17042 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017043 m_errorMonitor->VerifyFound();
17044 img_barrier.subresourceRange.layerCount = 1;
17045}
17046
17047TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017048 TEST_DESCRIPTION("Exceed the limits of image format ");
17049
Tony Barbour1fa09702017-03-16 12:09:08 -060017050 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017051
17052 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17053 {
17054 VkFormatProperties properties;
17055 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17056 if (properties.linearTilingFeatures == 0) {
17057 printf(" Image format not supported; skipped.\n");
17058 return;
17059 }
17060 }
17061
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017063 VkImageCreateInfo image_create_info = {};
17064 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17065 image_create_info.pNext = NULL;
17066 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017067 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017068 image_create_info.extent.width = 32;
17069 image_create_info.extent.height = 32;
17070 image_create_info.extent.depth = 1;
17071 image_create_info.mipLevels = 1;
17072 image_create_info.arrayLayers = 1;
17073 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17074 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17075 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17076 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17077 image_create_info.flags = 0;
17078
17079 VkImage nullImg;
17080 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017081 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17082 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017083 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017084 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17085 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17086 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017087 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017088
Tony Barbour0907e362017-03-09 15:05:30 -070017089 uint32_t maxDim =
17090 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17091 // If max mip levels exceeds image extents, skip the max mip levels test
17092 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17094 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17095 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17096 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17097 m_errorMonitor->VerifyFound();
17098 image_create_info.mipLevels = 1;
17099 }
Tony Barbourd6673642016-05-05 14:46:39 -060017100
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017102 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17103 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17104 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17105 m_errorMonitor->VerifyFound();
17106 image_create_info.arrayLayers = 1;
17107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017109 int samples = imgFmtProps.sampleCounts >> 1;
17110 image_create_info.samples = (VkSampleCountFlagBits)samples;
17111 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17112 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17113 m_errorMonitor->VerifyFound();
17114 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17115
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17117 "pCreateInfo->initialLayout, must be "
17118 "VK_IMAGE_LAYOUT_UNDEFINED or "
17119 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017120 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17121 // Expect INVALID_LAYOUT
17122 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17123 m_errorMonitor->VerifyFound();
17124 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17125}
17126
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017127TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017128 // Image copy with source region specified greater than src image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017129 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017130
Dave Houltonfc1a4052017-04-27 14:32:45 -060017131 // Create images with full mip chain
17132 VkImageCreateInfo ci;
17133 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17134 ci.pNext = NULL;
17135 ci.flags = 0;
17136 ci.imageType = VK_IMAGE_TYPE_3D;
17137 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17138 ci.extent = {32, 32, 8};
17139 ci.mipLevels = 6;
17140 ci.arrayLayers = 1;
17141 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17142 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17143 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17144 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17145 ci.queueFamilyIndexCount = 0;
17146 ci.pQueueFamilyIndices = NULL;
17147 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17148
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017149 VkImageObj src_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017150 src_image.init(&ci);
17151 ASSERT_TRUE(src_image.initialized());
17152
17153 // Dest image with one more mip level
17154 ci.extent = {64, 64, 16};
17155 ci.mipLevels = 7;
17156 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017157 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017158 dst_image.init(&ci);
17159 ASSERT_TRUE(dst_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017160
Tony Barbour552f6c02016-12-21 14:34:07 -070017161 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017162
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017163 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017164 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017165 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017166 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017167 copy_region.srcSubresource.mipLevel = 0;
17168 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017169 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017170 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017171 copy_region.srcSubresource.layerCount = 1;
17172 copy_region.dstSubresource.layerCount = 1;
17173 copy_region.srcOffset = {0, 0, 0};
17174 copy_region.dstOffset = {0, 0, 0};
17175
17176 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017177 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17178 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017179 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017180
Dave Houltonfc1a4052017-04-27 14:32:45 -060017181 // Source exceeded in x-dim, VU 01202
17182 copy_region.srcOffset.x = 4;
17183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175); // General "contained within" VU
17184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01202);
17185 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17186 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017187 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017188
17189 // Source exceeded in y-dim, VU 01203
17190 copy_region.srcOffset.x = 0;
17191 copy_region.extent.height = 48;
17192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01203);
17194 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17195 &copy_region);
17196 m_errorMonitor->VerifyFound();
17197
17198 // Source exceeded in z-dim, VU 01204
17199 copy_region.extent = {4, 4, 4};
17200 copy_region.srcSubresource.mipLevel = 2;
17201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
17202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01204);
17203 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17204 &copy_region);
17205 m_errorMonitor->VerifyFound();
17206
17207 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017208}
17209
17210TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017211 // Image copy with dest region specified greater than dest image size
Tony Barbour1fa09702017-03-16 12:09:08 -060017212 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017213
Dave Houltonfc1a4052017-04-27 14:32:45 -060017214 // Create images with full mip chain
17215 VkImageCreateInfo ci;
17216 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17217 ci.pNext = NULL;
17218 ci.flags = 0;
17219 ci.imageType = VK_IMAGE_TYPE_3D;
17220 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17221 ci.extent = {32, 32, 8};
17222 ci.mipLevels = 6;
17223 ci.arrayLayers = 1;
17224 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17225 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17226 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17227 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17228 ci.queueFamilyIndexCount = 0;
17229 ci.pQueueFamilyIndices = NULL;
17230 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17231
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017232 VkImageObj dst_image(m_device);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017233 dst_image.init(&ci);
17234 ASSERT_TRUE(dst_image.initialized());
17235
17236 // Src image with one more mip level
17237 ci.extent = {64, 64, 16};
17238 ci.mipLevels = 7;
17239 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17240 VkImageObj src_image(m_device);
17241 src_image.init(&ci);
17242 ASSERT_TRUE(src_image.initialized());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017243
Tony Barbour552f6c02016-12-21 14:34:07 -070017244 m_commandBuffer->BeginCommandBuffer();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017245
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017246 VkImageCopy copy_region;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017247 copy_region.extent = {32, 32, 8};
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017248 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017249 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Dave Houltoncee81d02017-05-02 11:00:10 -060017250 copy_region.srcSubresource.mipLevel = 0;
17251 copy_region.dstSubresource.mipLevel = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017252 copy_region.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017253 copy_region.dstSubresource.baseArrayLayer = 0;
Dave Houltonfc1a4052017-04-27 14:32:45 -060017254 copy_region.srcSubresource.layerCount = 1;
17255 copy_region.dstSubresource.layerCount = 1;
17256 copy_region.srcOffset = {0, 0, 0};
17257 copy_region.dstOffset = {0, 0, 0};
17258
17259 m_errorMonitor->ExpectSuccess();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017260 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17261 &copy_region);
Dave Houltonfc1a4052017-04-27 14:32:45 -060017262 m_errorMonitor->VerifyNotFound();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017263
Dave Houltonfc1a4052017-04-27 14:32:45 -060017264 // Dest exceeded in x-dim, VU 01205
17265 copy_region.dstOffset.x = 4;
17266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176); // General "contained within" VU
17267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01205);
17268 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17269 &copy_region);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017270 m_errorMonitor->VerifyFound();
Dave Houltonfc1a4052017-04-27 14:32:45 -060017271
17272 // Dest exceeded in y-dim, VU 01206
17273 copy_region.dstOffset.x = 0;
17274 copy_region.extent.height = 48;
17275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01206);
17277 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17278 &copy_region);
17279 m_errorMonitor->VerifyFound();
17280
17281 // Dest exceeded in z-dim, VU 01207
17282 copy_region.extent = {4, 4, 4};
17283 copy_region.dstSubresource.mipLevel = 2;
17284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
17285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01207);
17286 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17287 &copy_region);
17288 m_errorMonitor->VerifyFound();
17289
17290 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017291}
17292
Karl Schultz6addd812016-02-02 17:17:23 -070017293TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017294 VkResult err;
17295 bool pass;
17296
17297 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017299
Tony Barbour1fa09702017-03-16 12:09:08 -060017300 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017301
17302 // Create two images of different types and try to copy between them
17303 VkImage srcImage;
17304 VkImage dstImage;
17305 VkDeviceMemory srcMem;
17306 VkDeviceMemory destMem;
17307 VkMemoryRequirements memReqs;
17308
17309 VkImageCreateInfo image_create_info = {};
17310 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17311 image_create_info.pNext = NULL;
17312 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17313 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17314 image_create_info.extent.width = 32;
17315 image_create_info.extent.height = 32;
17316 image_create_info.extent.depth = 1;
17317 image_create_info.mipLevels = 1;
17318 image_create_info.arrayLayers = 1;
17319 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17320 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17321 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17322 image_create_info.flags = 0;
17323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017324 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017325 ASSERT_VK_SUCCESS(err);
17326
17327 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17328 // Introduce failure by creating second image with a different-sized format.
17329 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017330 VkFormatProperties properties;
17331 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17332 if (properties.optimalTilingFeatures == 0) {
17333 printf(" Image format not supported; skipped.\n");
17334 return;
17335 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017336
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017337 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017338 ASSERT_VK_SUCCESS(err);
17339
17340 // Allocate memory
17341 VkMemoryAllocateInfo memAlloc = {};
17342 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17343 memAlloc.pNext = NULL;
17344 memAlloc.allocationSize = 0;
17345 memAlloc.memoryTypeIndex = 0;
17346
17347 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17348 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017349 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017350 ASSERT_TRUE(pass);
17351 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17352 ASSERT_VK_SUCCESS(err);
17353
17354 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17355 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017356 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017357 ASSERT_TRUE(pass);
17358 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17359 ASSERT_VK_SUCCESS(err);
17360
17361 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17362 ASSERT_VK_SUCCESS(err);
17363 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17364 ASSERT_VK_SUCCESS(err);
17365
Tony Barbour552f6c02016-12-21 14:34:07 -070017366 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017367 VkImageCopy copyRegion;
17368 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17369 copyRegion.srcSubresource.mipLevel = 0;
17370 copyRegion.srcSubresource.baseArrayLayer = 0;
17371 copyRegion.srcSubresource.layerCount = 0;
17372 copyRegion.srcOffset.x = 0;
17373 copyRegion.srcOffset.y = 0;
17374 copyRegion.srcOffset.z = 0;
17375 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17376 copyRegion.dstSubresource.mipLevel = 0;
17377 copyRegion.dstSubresource.baseArrayLayer = 0;
17378 copyRegion.dstSubresource.layerCount = 0;
17379 copyRegion.dstOffset.x = 0;
17380 copyRegion.dstOffset.y = 0;
17381 copyRegion.dstOffset.z = 0;
17382 copyRegion.extent.width = 1;
17383 copyRegion.extent.height = 1;
17384 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017385 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017386 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017387
17388 m_errorMonitor->VerifyFound();
17389
17390 vkDestroyImage(m_device->device(), srcImage, NULL);
17391 vkDestroyImage(m_device->device(), dstImage, NULL);
17392 vkFreeMemory(m_device->device(), srcMem, NULL);
17393 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017394}
17395
Karl Schultz6addd812016-02-02 17:17:23 -070017396TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17397 VkResult err;
17398 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017399
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017400 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17402 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017403
Tony Barbour1fa09702017-03-16 12:09:08 -060017404 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017405 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017406 if (!depth_format) {
17407 return;
17408 }
Mike Stroyana3082432015-09-25 13:39:21 -060017409
17410 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017411 VkImage srcImage;
17412 VkImage dstImage;
17413 VkDeviceMemory srcMem;
17414 VkDeviceMemory destMem;
17415 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017416
17417 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017418 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17419 image_create_info.pNext = NULL;
17420 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017421 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017422 image_create_info.extent.width = 32;
17423 image_create_info.extent.height = 32;
17424 image_create_info.extent.depth = 1;
17425 image_create_info.mipLevels = 1;
17426 image_create_info.arrayLayers = 1;
17427 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060017428 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070017429 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17430 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017431 VkFormatProperties properties;
17432 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17433 if (properties.optimalTilingFeatures == 0) {
17434 printf(" Image format not supported; skipped.\n");
17435 return;
17436 }
Mike Stroyana3082432015-09-25 13:39:21 -060017437
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017438 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017439 ASSERT_VK_SUCCESS(err);
17440
Karl Schultzbdb75952016-04-19 11:36:49 -060017441 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17442
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017443 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017444 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017445 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017446 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017447
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017448 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017449 ASSERT_VK_SUCCESS(err);
17450
17451 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017452 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017453 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17454 memAlloc.pNext = NULL;
17455 memAlloc.allocationSize = 0;
17456 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017457
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017458 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017459 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017460 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017461 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017462 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017463 ASSERT_VK_SUCCESS(err);
17464
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017465 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017466 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017467 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017468 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017469 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017470 ASSERT_VK_SUCCESS(err);
17471
17472 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17473 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017474 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017475 ASSERT_VK_SUCCESS(err);
17476
Tony Barbour552f6c02016-12-21 14:34:07 -070017477 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017478 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017479 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017480 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017481 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017482 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017483 copyRegion.srcOffset.x = 0;
17484 copyRegion.srcOffset.y = 0;
17485 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017486 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017487 copyRegion.dstSubresource.mipLevel = 0;
17488 copyRegion.dstSubresource.baseArrayLayer = 0;
17489 copyRegion.dstSubresource.layerCount = 0;
17490 copyRegion.dstOffset.x = 0;
17491 copyRegion.dstOffset.y = 0;
17492 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017493 copyRegion.extent.width = 1;
17494 copyRegion.extent.height = 1;
17495 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017496 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017497 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017498
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017499 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017500
Chia-I Wuf7458c52015-10-26 21:10:41 +080017501 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017502 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017503 vkFreeMemory(m_device->device(), srcMem, NULL);
17504 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017505}
17506
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017507TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17508 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017509
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017510 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017511
17512 VkImageFormatProperties image_format_properties;
17513 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17514 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17515 &image_format_properties);
17516
17517 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17518 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17519 printf(" Image multi-sample support not found; skipped.\n");
17520 return;
17521 }
17522
17523 VkImageCreateInfo ci;
17524 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17525 ci.pNext = NULL;
17526 ci.flags = 0;
17527 ci.imageType = VK_IMAGE_TYPE_2D;
17528 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17529 ci.extent = {128, 128, 1};
17530 ci.mipLevels = 1;
17531 ci.arrayLayers = 1;
17532 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17533 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17534 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17535 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17536 ci.queueFamilyIndexCount = 0;
17537 ci.pQueueFamilyIndices = NULL;
17538 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17539
17540 VkImageObj image1(m_device);
17541 image1.init(&ci);
17542 ASSERT_TRUE(image1.initialized());
17543
17544 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17545 VkImageObj image2(m_device);
17546 image2.init(&ci);
17547 ASSERT_TRUE(image2.initialized());
17548
17549 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17550 VkImageObj image4(m_device);
17551 image4.init(&ci);
17552 ASSERT_TRUE(image4.initialized());
17553
17554 m_commandBuffer->BeginCommandBuffer();
17555
17556 VkImageCopy copyRegion;
17557 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17558 copyRegion.srcSubresource.mipLevel = 0;
17559 copyRegion.srcSubresource.baseArrayLayer = 0;
17560 copyRegion.srcSubresource.layerCount = 1;
17561 copyRegion.srcOffset = {0, 0, 0};
17562 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17563 copyRegion.dstSubresource.mipLevel = 0;
17564 copyRegion.dstSubresource.baseArrayLayer = 0;
17565 copyRegion.dstSubresource.layerCount = 1;
17566 copyRegion.dstOffset = {0, 0, 0};
17567 copyRegion.extent = {128, 128, 1};
17568
17569 // Copy a single sample image to/from a multi-sample image
17570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17571 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17572 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17573 m_errorMonitor->VerifyFound();
17574
17575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17576 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17577 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17578 m_errorMonitor->VerifyFound();
17579
17580 // Copy between multi-sample images with different sample counts
17581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17582 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17583 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17584 m_errorMonitor->VerifyFound();
17585
17586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17587 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17588 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17589 m_errorMonitor->VerifyFound();
17590
17591 m_commandBuffer->EndCommandBuffer();
17592}
17593
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017594TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17595 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017596 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017597 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017598 if (!ds_format) {
17599 return;
17600 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017601
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017602 VkFormatProperties properties;
17603 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
17604 if (properties.optimalTilingFeatures == 0) {
17605 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
17606 return;
17607 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017608 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017609 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 -060017610 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 -060017611 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017612 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17613 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017614 ASSERT_TRUE(color_image.initialized());
17615 ASSERT_TRUE(depth_image.initialized());
17616 ASSERT_TRUE(ds_image.initialized());
17617
17618 VkImageCopy copyRegion;
17619 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17620 copyRegion.srcSubresource.mipLevel = 0;
17621 copyRegion.srcSubresource.baseArrayLayer = 0;
17622 copyRegion.srcSubresource.layerCount = 1;
17623 copyRegion.srcOffset = {0, 0, 0};
17624 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17625 copyRegion.dstSubresource.mipLevel = 0;
17626 copyRegion.dstSubresource.baseArrayLayer = 0;
17627 copyRegion.dstSubresource.layerCount = 1;
17628 copyRegion.dstOffset = {64, 0, 0};
17629 copyRegion.extent = {64, 128, 1};
17630
17631 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17633 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17634 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17635 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017636 m_errorMonitor->VerifyFound();
17637
17638 m_commandBuffer->BeginCommandBuffer();
17639
17640 // Src and dest aspect masks don't match
17641 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017643 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17644 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017645 m_errorMonitor->VerifyFound();
17646 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17647
17648 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017649 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017650 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17652 // These aspect/format mismatches are redundant but unavoidable here
17653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017655 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17656 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017657 m_errorMonitor->VerifyFound();
17658 // Metadata aspect is illegal - VU 01222
17659 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17660 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17662 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017663 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17664 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017665 m_errorMonitor->VerifyFound();
17666
17667 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17668 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17669
17670 // Aspect mask doesn't match source image format - VU 01200
17671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17672 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17674 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17675 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17676 m_errorMonitor->VerifyFound();
17677
17678 // Aspect mask doesn't match dest image format - VU 01201
17679 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17680 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17682 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17684 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17685 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17686 m_errorMonitor->VerifyFound();
17687
17688 m_commandBuffer->EndCommandBuffer();
17689}
17690
Karl Schultz6addd812016-02-02 17:17:23 -070017691TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17692 VkResult err;
17693 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017694
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17696 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017697
Tony Barbour1fa09702017-03-16 12:09:08 -060017698 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017699
17700 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017701 VkImage srcImage;
17702 VkImage dstImage;
17703 VkDeviceMemory srcMem;
17704 VkDeviceMemory destMem;
17705 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017706
17707 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017708 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17709 image_create_info.pNext = NULL;
17710 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17711 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17712 image_create_info.extent.width = 32;
17713 image_create_info.extent.height = 1;
17714 image_create_info.extent.depth = 1;
17715 image_create_info.mipLevels = 1;
17716 image_create_info.arrayLayers = 1;
17717 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17718 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17719 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17720 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017721
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017722 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017723 ASSERT_VK_SUCCESS(err);
17724
Karl Schultz6addd812016-02-02 17:17:23 -070017725 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017727 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017728 ASSERT_VK_SUCCESS(err);
17729
17730 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017731 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017732 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17733 memAlloc.pNext = NULL;
17734 memAlloc.allocationSize = 0;
17735 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017736
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017737 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017738 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017739 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017740 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017741 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017742 ASSERT_VK_SUCCESS(err);
17743
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017744 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017745 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017746 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017747 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017748 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017749 ASSERT_VK_SUCCESS(err);
17750
17751 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17752 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017753 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017754 ASSERT_VK_SUCCESS(err);
17755
Tony Barbour552f6c02016-12-21 14:34:07 -070017756 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017757 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017758 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17759 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017760 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017761 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017762 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017763 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017764 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017765 resolveRegion.srcOffset.x = 0;
17766 resolveRegion.srcOffset.y = 0;
17767 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017768 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017769 resolveRegion.dstSubresource.mipLevel = 0;
17770 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017771 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017772 resolveRegion.dstOffset.x = 0;
17773 resolveRegion.dstOffset.y = 0;
17774 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017775 resolveRegion.extent.width = 1;
17776 resolveRegion.extent.height = 1;
17777 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017778 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017779 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017780
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017781 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017782
Chia-I Wuf7458c52015-10-26 21:10:41 +080017783 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017784 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017785 vkFreeMemory(m_device->device(), srcMem, NULL);
17786 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017787}
17788
Karl Schultz6addd812016-02-02 17:17:23 -070017789TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17790 VkResult err;
17791 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017792
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17794 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017795
Tony Barbour1fa09702017-03-16 12:09:08 -060017796 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017797
Chris Forbesa7530692016-05-08 12:35:39 +120017798 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017799 VkImage srcImage;
17800 VkImage dstImage;
17801 VkDeviceMemory srcMem;
17802 VkDeviceMemory destMem;
17803 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017804
17805 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017806 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17807 image_create_info.pNext = NULL;
17808 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17809 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17810 image_create_info.extent.width = 32;
17811 image_create_info.extent.height = 1;
17812 image_create_info.extent.depth = 1;
17813 image_create_info.mipLevels = 1;
17814 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017815 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017816 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17817 // Note: Some implementations expect color attachment usage for any
17818 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017819 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017820 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017821
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017822 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017823 ASSERT_VK_SUCCESS(err);
17824
Karl Schultz6addd812016-02-02 17:17:23 -070017825 // Note: Some implementations expect color attachment usage for any
17826 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017827 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017828
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017829 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017830 ASSERT_VK_SUCCESS(err);
17831
17832 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017833 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017834 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17835 memAlloc.pNext = NULL;
17836 memAlloc.allocationSize = 0;
17837 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017838
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017839 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017840 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017841 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017842 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017843 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017844 ASSERT_VK_SUCCESS(err);
17845
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017846 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017847 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017848 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017849 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017850 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017851 ASSERT_VK_SUCCESS(err);
17852
17853 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17854 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017855 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017856 ASSERT_VK_SUCCESS(err);
17857
Tony Barbour552f6c02016-12-21 14:34:07 -070017858 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017859 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017860 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17861 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017862 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017863 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017864 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017865 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017866 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017867 resolveRegion.srcOffset.x = 0;
17868 resolveRegion.srcOffset.y = 0;
17869 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017870 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017871 resolveRegion.dstSubresource.mipLevel = 0;
17872 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017873 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017874 resolveRegion.dstOffset.x = 0;
17875 resolveRegion.dstOffset.y = 0;
17876 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017877 resolveRegion.extent.width = 1;
17878 resolveRegion.extent.height = 1;
17879 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017880 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017881 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017882
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017883 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017884
Chia-I Wuf7458c52015-10-26 21:10:41 +080017885 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017886 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017887 vkFreeMemory(m_device->device(), srcMem, NULL);
17888 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017889}
17890
Karl Schultz6addd812016-02-02 17:17:23 -070017891TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17892 VkResult err;
17893 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017894
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017896 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017897
Tony Barbour1fa09702017-03-16 12:09:08 -060017898 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017899
17900 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017901 VkImage srcImage;
17902 VkImage dstImage;
17903 VkDeviceMemory srcMem;
17904 VkDeviceMemory destMem;
17905 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017906
17907 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017908 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17909 image_create_info.pNext = NULL;
17910 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17911 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17912 image_create_info.extent.width = 32;
17913 image_create_info.extent.height = 1;
17914 image_create_info.extent.depth = 1;
17915 image_create_info.mipLevels = 1;
17916 image_create_info.arrayLayers = 1;
17917 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17918 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17919 // Note: Some implementations expect color attachment usage for any
17920 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017921 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017922 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017923
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017924 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017925 ASSERT_VK_SUCCESS(err);
17926
Karl Schultz6addd812016-02-02 17:17:23 -070017927 // Set format to something other than source image
17928 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17929 // Note: Some implementations expect color attachment usage for any
17930 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017931 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017932 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017933
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017934 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017935 ASSERT_VK_SUCCESS(err);
17936
17937 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017938 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017939 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17940 memAlloc.pNext = NULL;
17941 memAlloc.allocationSize = 0;
17942 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017943
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017944 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017945 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017946 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017947 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017948 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017949 ASSERT_VK_SUCCESS(err);
17950
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017951 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017952 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017953 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017954 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017955 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017956 ASSERT_VK_SUCCESS(err);
17957
17958 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17959 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017960 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017961 ASSERT_VK_SUCCESS(err);
17962
Tony Barbour552f6c02016-12-21 14:34:07 -070017963 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017964 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017965 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17966 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017967 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017968 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017969 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017970 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017971 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017972 resolveRegion.srcOffset.x = 0;
17973 resolveRegion.srcOffset.y = 0;
17974 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017975 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017976 resolveRegion.dstSubresource.mipLevel = 0;
17977 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017978 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017979 resolveRegion.dstOffset.x = 0;
17980 resolveRegion.dstOffset.y = 0;
17981 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017982 resolveRegion.extent.width = 1;
17983 resolveRegion.extent.height = 1;
17984 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017985 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017986 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017987
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017988 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017989
Chia-I Wuf7458c52015-10-26 21:10:41 +080017990 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017991 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017992 vkFreeMemory(m_device->device(), srcMem, NULL);
17993 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017994}
17995
Karl Schultz6addd812016-02-02 17:17:23 -070017996TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17997 VkResult err;
17998 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017999
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070018000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018001 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018002
Tony Barbour1fa09702017-03-16 12:09:08 -060018003 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060018004
18005 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070018006 VkImage srcImage;
18007 VkImage dstImage;
18008 VkDeviceMemory srcMem;
18009 VkDeviceMemory destMem;
18010 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060018011
18012 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018013 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18014 image_create_info.pNext = NULL;
18015 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18016 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
18017 image_create_info.extent.width = 32;
18018 image_create_info.extent.height = 1;
18019 image_create_info.extent.depth = 1;
18020 image_create_info.mipLevels = 1;
18021 image_create_info.arrayLayers = 1;
18022 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
18023 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18024 // Note: Some implementations expect color attachment usage for any
18025 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018026 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018027 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018028
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018029 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018030 ASSERT_VK_SUCCESS(err);
18031
Karl Schultz6addd812016-02-02 17:17:23 -070018032 image_create_info.imageType = VK_IMAGE_TYPE_1D;
18033 // Note: Some implementations expect color attachment usage for any
18034 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018035 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018036 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018037
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018038 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060018039 ASSERT_VK_SUCCESS(err);
18040
18041 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018042 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018043 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18044 memAlloc.pNext = NULL;
18045 memAlloc.allocationSize = 0;
18046 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018047
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060018048 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018049 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018050 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018051 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018052 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018053 ASSERT_VK_SUCCESS(err);
18054
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018055 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060018056 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018057 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060018058 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018059 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060018060 ASSERT_VK_SUCCESS(err);
18061
18062 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
18063 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018064 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060018065 ASSERT_VK_SUCCESS(err);
18066
Tony Barbour552f6c02016-12-21 14:34:07 -070018067 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018068 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070018069 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
18070 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060018071 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018072 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060018073 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060018074 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018075 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060018076 resolveRegion.srcOffset.x = 0;
18077 resolveRegion.srcOffset.y = 0;
18078 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080018079 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018080 resolveRegion.dstSubresource.mipLevel = 0;
18081 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130018082 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018083 resolveRegion.dstOffset.x = 0;
18084 resolveRegion.dstOffset.y = 0;
18085 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060018086 resolveRegion.extent.width = 1;
18087 resolveRegion.extent.height = 1;
18088 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018089 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070018090 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060018091
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018092 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018093
Chia-I Wuf7458c52015-10-26 21:10:41 +080018094 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018095 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018096 vkFreeMemory(m_device->device(), srcMem, NULL);
18097 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018098}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018099
Karl Schultz6addd812016-02-02 17:17:23 -070018100TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018101 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018102 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18103 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018104 // The image format check comes 2nd in validation so we trigger it first,
18105 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018106 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18109 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018110
Tony Barbour1fa09702017-03-16 12:09:08 -060018111 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018112 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018113 if (!depth_format) {
18114 return;
18115 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018116
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018117 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018118 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18119 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018120
18121 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018122 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18123 ds_pool_ci.pNext = NULL;
18124 ds_pool_ci.maxSets = 1;
18125 ds_pool_ci.poolSizeCount = 1;
18126 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018127
18128 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018129 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018130 ASSERT_VK_SUCCESS(err);
18131
18132 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018133 dsl_binding.binding = 0;
18134 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18135 dsl_binding.descriptorCount = 1;
18136 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18137 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018138
18139 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018140 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18141 ds_layout_ci.pNext = NULL;
18142 ds_layout_ci.bindingCount = 1;
18143 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018144 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018145 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018146 ASSERT_VK_SUCCESS(err);
18147
18148 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018149 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018150 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018151 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018152 alloc_info.descriptorPool = ds_pool;
18153 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018154 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018155 ASSERT_VK_SUCCESS(err);
18156
Karl Schultz6addd812016-02-02 17:17:23 -070018157 VkImage image_bad;
18158 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018159 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018160 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018161 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018162 const int32_t tex_width = 32;
18163 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018164
18165 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018166 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18167 image_create_info.pNext = NULL;
18168 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18169 image_create_info.format = tex_format_bad;
18170 image_create_info.extent.width = tex_width;
18171 image_create_info.extent.height = tex_height;
18172 image_create_info.extent.depth = 1;
18173 image_create_info.mipLevels = 1;
18174 image_create_info.arrayLayers = 1;
18175 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18176 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018177 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018178 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018180 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018181 ASSERT_VK_SUCCESS(err);
18182 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018183 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18184 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018185 ASSERT_VK_SUCCESS(err);
18186
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018187 // ---Bind image memory---
18188 VkMemoryRequirements img_mem_reqs;
18189 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18190 VkMemoryAllocateInfo image_alloc_info = {};
18191 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18192 image_alloc_info.pNext = NULL;
18193 image_alloc_info.memoryTypeIndex = 0;
18194 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018195 bool pass =
18196 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 -070018197 ASSERT_TRUE(pass);
18198 VkDeviceMemory mem;
18199 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18200 ASSERT_VK_SUCCESS(err);
18201 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18202 ASSERT_VK_SUCCESS(err);
18203 // -----------------------
18204
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018205 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018206 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018207 image_view_create_info.image = image_bad;
18208 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18209 image_view_create_info.format = tex_format_bad;
18210 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18211 image_view_create_info.subresourceRange.baseMipLevel = 0;
18212 image_view_create_info.subresourceRange.layerCount = 1;
18213 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018214 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018215
18216 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018217 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018218
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018219 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018220
Chia-I Wuf7458c52015-10-26 21:10:41 +080018221 vkDestroyImage(m_device->device(), image_bad, NULL);
18222 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018223 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18224 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018225
18226 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018227}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018228
18229TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018230 TEST_DESCRIPTION(
18231 "Call ClearColorImage w/ a depth|stencil image and "
18232 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018233
Tony Barbour1fa09702017-03-16 12:09:08 -060018234 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018235 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018236 if (!depth_format) {
18237 return;
18238 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018239 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18240
Tony Barbour552f6c02016-12-21 14:34:07 -070018241 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018242
18243 // Color image
18244 VkClearColorValue clear_color;
18245 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18246 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18247 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18248 const int32_t img_width = 32;
18249 const int32_t img_height = 32;
18250 VkImageCreateInfo image_create_info = {};
18251 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18252 image_create_info.pNext = NULL;
18253 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18254 image_create_info.format = color_format;
18255 image_create_info.extent.width = img_width;
18256 image_create_info.extent.height = img_height;
18257 image_create_info.extent.depth = 1;
18258 image_create_info.mipLevels = 1;
18259 image_create_info.arrayLayers = 1;
18260 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18261 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18262 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18263
18264 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018265 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018266
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018267 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018268
18269 // Depth/Stencil image
18270 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018271 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018272 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18273 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018274 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018275 ds_image_create_info.extent.width = 64;
18276 ds_image_create_info.extent.height = 64;
18277 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018278 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 -060018279
18280 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018281 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018282
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018283 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 -060018284
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018286
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018287 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018288 &color_range);
18289
18290 m_errorMonitor->VerifyFound();
18291
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18293 "vkCmdClearColorImage called with "
18294 "image created without "
18295 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018296
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018297 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018298 &color_range);
18299
18300 m_errorMonitor->VerifyFound();
18301
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018302 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18304 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018305
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018306 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18307 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018308
18309 m_errorMonitor->VerifyFound();
18310}
Tobin Ehliscde08892015-09-22 10:11:37 -060018311
Mike Schuchardt35fece12017-03-07 14:40:28 -070018312TEST_F(VkLayerTest, CommandQueueFlags) {
18313 TEST_DESCRIPTION(
18314 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18315 "graphics-only command");
18316
18317 ASSERT_NO_FATAL_FAILURE(Init());
18318
18319 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018320 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018321 printf(" Non-graphics queue family not found; skipped.\n");
18322 return;
18323 } else {
18324 // Create command pool on a non-graphics queue
18325 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18326
18327 // Setup command buffer on pool
18328 VkCommandBufferObj command_buffer(m_device, &command_pool);
18329 command_buffer.BeginCommandBuffer();
18330
18331 // Issue a graphics only command
18332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18333 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18334 command_buffer.SetViewport(0, 1, &viewport);
18335 m_errorMonitor->VerifyFound();
18336 }
18337}
18338
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018339// WSI Enabled Tests
18340//
Chris Forbes09368e42016-10-13 11:59:22 +130018341#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018342TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18343
18344#if defined(VK_USE_PLATFORM_XCB_KHR)
18345 VkSurfaceKHR surface = VK_NULL_HANDLE;
18346
18347 VkResult err;
18348 bool pass;
18349 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18350 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18351 // uint32_t swapchain_image_count = 0;
18352 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18353 // uint32_t image_index = 0;
18354 // VkPresentInfoKHR present_info = {};
18355
Tony Barbour1fa09702017-03-16 12:09:08 -060018356 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018357
18358 // Use the create function from one of the VK_KHR_*_surface extension in
18359 // order to create a surface, testing all known errors in the process,
18360 // before successfully creating a surface:
18361 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18363 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18364 pass = (err != VK_SUCCESS);
18365 ASSERT_TRUE(pass);
18366 m_errorMonitor->VerifyFound();
18367
18368 // Next, try to create a surface with the wrong
18369 // VkXcbSurfaceCreateInfoKHR::sType:
18370 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18371 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18373 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18374 pass = (err != VK_SUCCESS);
18375 ASSERT_TRUE(pass);
18376 m_errorMonitor->VerifyFound();
18377
18378 // Create a native window, and then correctly create a surface:
18379 xcb_connection_t *connection;
18380 xcb_screen_t *screen;
18381 xcb_window_t xcb_window;
18382 xcb_intern_atom_reply_t *atom_wm_delete_window;
18383
18384 const xcb_setup_t *setup;
18385 xcb_screen_iterator_t iter;
18386 int scr;
18387 uint32_t value_mask, value_list[32];
18388 int width = 1;
18389 int height = 1;
18390
18391 connection = xcb_connect(NULL, &scr);
18392 ASSERT_TRUE(connection != NULL);
18393 setup = xcb_get_setup(connection);
18394 iter = xcb_setup_roots_iterator(setup);
18395 while (scr-- > 0)
18396 xcb_screen_next(&iter);
18397 screen = iter.data;
18398
18399 xcb_window = xcb_generate_id(connection);
18400
18401 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18402 value_list[0] = screen->black_pixel;
18403 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18404
18405 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18406 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18407
18408 /* Magic code that will send notification when window is destroyed */
18409 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18410 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18411
18412 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18413 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18414 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18415 free(reply);
18416
18417 xcb_map_window(connection, xcb_window);
18418
18419 // Force the x/y coordinates to 100,100 results are identical in consecutive
18420 // runs
18421 const uint32_t coords[] = { 100, 100 };
18422 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18423
18424 // Finally, try to correctly create a surface:
18425 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18426 xcb_create_info.pNext = NULL;
18427 xcb_create_info.flags = 0;
18428 xcb_create_info.connection = connection;
18429 xcb_create_info.window = xcb_window;
18430 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18431 pass = (err == VK_SUCCESS);
18432 ASSERT_TRUE(pass);
18433
18434 // Check if surface supports presentation:
18435
18436 // 1st, do so without having queried the queue families:
18437 VkBool32 supported = false;
18438 // TODO: Get the following error to come out:
18439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18440 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18441 "function");
18442 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18443 pass = (err != VK_SUCCESS);
18444 // ASSERT_TRUE(pass);
18445 // m_errorMonitor->VerifyFound();
18446
18447 // Next, query a queue family index that's too large:
18448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18449 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18450 pass = (err != VK_SUCCESS);
18451 ASSERT_TRUE(pass);
18452 m_errorMonitor->VerifyFound();
18453
18454 // Finally, do so correctly:
18455 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18456 // SUPPORTED
18457 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18458 pass = (err == VK_SUCCESS);
18459 ASSERT_TRUE(pass);
18460
18461 // Before proceeding, try to create a swapchain without having called
18462 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18463 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18464 swapchain_create_info.pNext = NULL;
18465 swapchain_create_info.flags = 0;
18466 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18467 swapchain_create_info.surface = surface;
18468 swapchain_create_info.imageArrayLayers = 1;
18469 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18470 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18472 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18473 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18474 pass = (err != VK_SUCCESS);
18475 ASSERT_TRUE(pass);
18476 m_errorMonitor->VerifyFound();
18477
18478 // Get the surface capabilities:
18479 VkSurfaceCapabilitiesKHR surface_capabilities;
18480
18481 // Do so correctly (only error logged by this entrypoint is if the
18482 // extension isn't enabled):
18483 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18484 pass = (err == VK_SUCCESS);
18485 ASSERT_TRUE(pass);
18486
18487 // Get the surface formats:
18488 uint32_t surface_format_count;
18489
18490 // First, try without a pointer to surface_format_count:
18491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18492 "specified as NULL");
18493 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18494 pass = (err == VK_SUCCESS);
18495 ASSERT_TRUE(pass);
18496 m_errorMonitor->VerifyFound();
18497
18498 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18499 // correctly done a 1st try (to get the count):
18500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18501 surface_format_count = 0;
18502 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18503 pass = (err == VK_SUCCESS);
18504 ASSERT_TRUE(pass);
18505 m_errorMonitor->VerifyFound();
18506
18507 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18508 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18509 pass = (err == VK_SUCCESS);
18510 ASSERT_TRUE(pass);
18511
18512 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18513 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18514
18515 // Next, do a 2nd try with surface_format_count being set too high:
18516 surface_format_count += 5;
18517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18518 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18519 pass = (err == VK_SUCCESS);
18520 ASSERT_TRUE(pass);
18521 m_errorMonitor->VerifyFound();
18522
18523 // Finally, do a correct 1st and 2nd try:
18524 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18525 pass = (err == VK_SUCCESS);
18526 ASSERT_TRUE(pass);
18527 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18528 pass = (err == VK_SUCCESS);
18529 ASSERT_TRUE(pass);
18530
18531 // Get the surface present modes:
18532 uint32_t surface_present_mode_count;
18533
18534 // First, try without a pointer to surface_format_count:
18535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18536 "specified as NULL");
18537
18538 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18539 pass = (err == VK_SUCCESS);
18540 ASSERT_TRUE(pass);
18541 m_errorMonitor->VerifyFound();
18542
18543 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18544 // correctly done a 1st try (to get the count):
18545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18546 surface_present_mode_count = 0;
18547 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18548 (VkPresentModeKHR *)&surface_present_mode_count);
18549 pass = (err == VK_SUCCESS);
18550 ASSERT_TRUE(pass);
18551 m_errorMonitor->VerifyFound();
18552
18553 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18554 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18555 pass = (err == VK_SUCCESS);
18556 ASSERT_TRUE(pass);
18557
18558 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18559 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18560
18561 // Next, do a 2nd try with surface_format_count being set too high:
18562 surface_present_mode_count += 5;
18563 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18564 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18565 pass = (err == VK_SUCCESS);
18566 ASSERT_TRUE(pass);
18567 m_errorMonitor->VerifyFound();
18568
18569 // Finally, do a correct 1st and 2nd try:
18570 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18571 pass = (err == VK_SUCCESS);
18572 ASSERT_TRUE(pass);
18573 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18574 pass = (err == VK_SUCCESS);
18575 ASSERT_TRUE(pass);
18576
18577 // Create a swapchain:
18578
18579 // First, try without a pointer to swapchain_create_info:
18580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18581 "specified as NULL");
18582
18583 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18584 pass = (err != VK_SUCCESS);
18585 ASSERT_TRUE(pass);
18586 m_errorMonitor->VerifyFound();
18587
18588 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18589 // sType:
18590 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18592
18593 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18594 pass = (err != VK_SUCCESS);
18595 ASSERT_TRUE(pass);
18596 m_errorMonitor->VerifyFound();
18597
18598 // Next, call with a NULL swapchain pointer:
18599 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18600 swapchain_create_info.pNext = NULL;
18601 swapchain_create_info.flags = 0;
18602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18603 "specified as NULL");
18604
18605 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18606 pass = (err != VK_SUCCESS);
18607 ASSERT_TRUE(pass);
18608 m_errorMonitor->VerifyFound();
18609
18610 // TODO: Enhance swapchain layer so that
18611 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18612
18613 // Next, call with a queue family index that's too large:
18614 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18615 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18616 swapchain_create_info.queueFamilyIndexCount = 2;
18617 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18618 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18619 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18620 pass = (err != VK_SUCCESS);
18621 ASSERT_TRUE(pass);
18622 m_errorMonitor->VerifyFound();
18623
18624 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18625 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18626 swapchain_create_info.queueFamilyIndexCount = 1;
18627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18628 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18629 "pCreateInfo->pQueueFamilyIndices).");
18630 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18631 pass = (err != VK_SUCCESS);
18632 ASSERT_TRUE(pass);
18633 m_errorMonitor->VerifyFound();
18634
18635 // Next, call with an invalid imageSharingMode:
18636 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18637 swapchain_create_info.queueFamilyIndexCount = 1;
18638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18639 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18640 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18641 pass = (err != VK_SUCCESS);
18642 ASSERT_TRUE(pass);
18643 m_errorMonitor->VerifyFound();
18644 // Fix for the future:
18645 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18646 // SUPPORTED
18647 swapchain_create_info.queueFamilyIndexCount = 0;
18648 queueFamilyIndex[0] = 0;
18649 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18650
18651 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18652 // Get the images from a swapchain:
18653 // Acquire an image from a swapchain:
18654 // Present an image to a swapchain:
18655 // Destroy the swapchain:
18656
18657 // TODOs:
18658 //
18659 // - Try destroying the device without first destroying the swapchain
18660 //
18661 // - Try destroying the device without first destroying the surface
18662 //
18663 // - Try destroying the surface without first destroying the swapchain
18664
18665 // Destroy the surface:
18666 vkDestroySurfaceKHR(instance(), surface, NULL);
18667
18668 // Tear down the window:
18669 xcb_destroy_window(connection, xcb_window);
18670 xcb_disconnect(connection);
18671
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018672#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018673 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018674#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018675}
Chris Forbes09368e42016-10-13 11:59:22 +130018676#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018677
18678//
18679// POSITIVE VALIDATION TESTS
18680//
18681// These tests do not expect to encounter ANY validation errors pass only if this is true
18682
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018683TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18684 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018685 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18687
18688 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18689 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018690 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018691 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18692 command_buffer_allocate_info.commandBufferCount = 1;
18693
18694 VkCommandBuffer secondary_command_buffer;
18695 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18696 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18697 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18698 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18699 command_buffer_inheritance_info.renderPass = m_renderPass;
18700 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18701
18702 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18703 command_buffer_begin_info.flags =
18704 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18705 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18706
18707 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18708 VkClearAttachment color_attachment;
18709 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18710 color_attachment.clearValue.color.float32[0] = 0;
18711 color_attachment.clearValue.color.float32[1] = 0;
18712 color_attachment.clearValue.color.float32[2] = 0;
18713 color_attachment.clearValue.color.float32[3] = 0;
18714 color_attachment.colorAttachment = 0;
18715 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18716 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18717}
18718
Tobin Ehlise0006882016-11-03 10:14:28 -060018719TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018720 TEST_DESCRIPTION(
18721 "Perform an image layout transition in a secondary command buffer followed "
18722 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018723 VkResult err;
18724 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018725 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018726 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018727 if (!depth_format) {
18728 return;
18729 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018730 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18731 // Allocate a secondary and primary cmd buffer
18732 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18733 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018734 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018735 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18736 command_buffer_allocate_info.commandBufferCount = 1;
18737
18738 VkCommandBuffer secondary_command_buffer;
18739 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18740 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18741 VkCommandBuffer primary_command_buffer;
18742 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18743 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18744 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18745 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18746 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18747 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18748 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18749
18750 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18751 ASSERT_VK_SUCCESS(err);
18752 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018753 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 -060018754 ASSERT_TRUE(image.initialized());
18755 VkImageMemoryBarrier img_barrier = {};
18756 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18757 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18758 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18759 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18760 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18761 img_barrier.image = image.handle();
18762 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18763 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18764 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18765 img_barrier.subresourceRange.baseArrayLayer = 0;
18766 img_barrier.subresourceRange.baseMipLevel = 0;
18767 img_barrier.subresourceRange.layerCount = 1;
18768 img_barrier.subresourceRange.levelCount = 1;
18769 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18770 0, nullptr, 1, &img_barrier);
18771 err = vkEndCommandBuffer(secondary_command_buffer);
18772 ASSERT_VK_SUCCESS(err);
18773
18774 // Now update primary cmd buffer to execute secondary and transitions image
18775 command_buffer_begin_info.pInheritanceInfo = nullptr;
18776 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18777 ASSERT_VK_SUCCESS(err);
18778 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18779 VkImageMemoryBarrier img_barrier2 = {};
18780 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18781 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18782 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18783 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18784 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18785 img_barrier2.image = image.handle();
18786 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18787 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18788 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18789 img_barrier2.subresourceRange.baseArrayLayer = 0;
18790 img_barrier2.subresourceRange.baseMipLevel = 0;
18791 img_barrier2.subresourceRange.layerCount = 1;
18792 img_barrier2.subresourceRange.levelCount = 1;
18793 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18794 nullptr, 1, &img_barrier2);
18795 err = vkEndCommandBuffer(primary_command_buffer);
18796 ASSERT_VK_SUCCESS(err);
18797 VkSubmitInfo submit_info = {};
18798 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18799 submit_info.commandBufferCount = 1;
18800 submit_info.pCommandBuffers = &primary_command_buffer;
18801 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18802 ASSERT_VK_SUCCESS(err);
18803 m_errorMonitor->VerifyNotFound();
18804 err = vkDeviceWaitIdle(m_device->device());
18805 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018806 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18807 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018808}
18809
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018810// This is a positive test. No failures are expected.
18811TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018812 TEST_DESCRIPTION(
18813 "Ensure that the vkUpdateDescriptorSets validation code "
18814 "is ignoring VkWriteDescriptorSet members that are not "
18815 "related to the descriptor type specified by "
18816 "VkWriteDescriptorSet::descriptorType. Correct "
18817 "validation behavior will result in the test running to "
18818 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018819
18820 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18821
Tony Barbour1fa09702017-03-16 12:09:08 -060018822 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018823
18824 // Image Case
18825 {
18826 m_errorMonitor->ExpectSuccess();
18827
18828 VkImage image;
18829 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18830 const int32_t tex_width = 32;
18831 const int32_t tex_height = 32;
18832 VkImageCreateInfo image_create_info = {};
18833 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18834 image_create_info.pNext = NULL;
18835 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18836 image_create_info.format = tex_format;
18837 image_create_info.extent.width = tex_width;
18838 image_create_info.extent.height = tex_height;
18839 image_create_info.extent.depth = 1;
18840 image_create_info.mipLevels = 1;
18841 image_create_info.arrayLayers = 1;
18842 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18843 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18844 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18845 image_create_info.flags = 0;
18846 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18847 ASSERT_VK_SUCCESS(err);
18848
18849 VkMemoryRequirements memory_reqs;
18850 VkDeviceMemory image_memory;
18851 bool pass;
18852 VkMemoryAllocateInfo memory_info = {};
18853 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18854 memory_info.pNext = NULL;
18855 memory_info.allocationSize = 0;
18856 memory_info.memoryTypeIndex = 0;
18857 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18858 memory_info.allocationSize = memory_reqs.size;
18859 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18860 ASSERT_TRUE(pass);
18861 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18862 ASSERT_VK_SUCCESS(err);
18863 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18864 ASSERT_VK_SUCCESS(err);
18865
18866 VkImageViewCreateInfo image_view_create_info = {};
18867 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18868 image_view_create_info.image = image;
18869 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18870 image_view_create_info.format = tex_format;
18871 image_view_create_info.subresourceRange.layerCount = 1;
18872 image_view_create_info.subresourceRange.baseMipLevel = 0;
18873 image_view_create_info.subresourceRange.levelCount = 1;
18874 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18875
18876 VkImageView view;
18877 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18878 ASSERT_VK_SUCCESS(err);
18879
18880 VkDescriptorPoolSize ds_type_count = {};
18881 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18882 ds_type_count.descriptorCount = 1;
18883
18884 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18885 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18886 ds_pool_ci.pNext = NULL;
18887 ds_pool_ci.maxSets = 1;
18888 ds_pool_ci.poolSizeCount = 1;
18889 ds_pool_ci.pPoolSizes = &ds_type_count;
18890
18891 VkDescriptorPool ds_pool;
18892 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18893 ASSERT_VK_SUCCESS(err);
18894
18895 VkDescriptorSetLayoutBinding dsl_binding = {};
18896 dsl_binding.binding = 0;
18897 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18898 dsl_binding.descriptorCount = 1;
18899 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18900 dsl_binding.pImmutableSamplers = NULL;
18901
18902 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18903 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18904 ds_layout_ci.pNext = NULL;
18905 ds_layout_ci.bindingCount = 1;
18906 ds_layout_ci.pBindings = &dsl_binding;
18907 VkDescriptorSetLayout ds_layout;
18908 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18909 ASSERT_VK_SUCCESS(err);
18910
18911 VkDescriptorSet descriptor_set;
18912 VkDescriptorSetAllocateInfo alloc_info = {};
18913 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18914 alloc_info.descriptorSetCount = 1;
18915 alloc_info.descriptorPool = ds_pool;
18916 alloc_info.pSetLayouts = &ds_layout;
18917 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18918 ASSERT_VK_SUCCESS(err);
18919
18920 VkDescriptorImageInfo image_info = {};
18921 image_info.imageView = view;
18922 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18923
18924 VkWriteDescriptorSet descriptor_write;
18925 memset(&descriptor_write, 0, sizeof(descriptor_write));
18926 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18927 descriptor_write.dstSet = descriptor_set;
18928 descriptor_write.dstBinding = 0;
18929 descriptor_write.descriptorCount = 1;
18930 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18931 descriptor_write.pImageInfo = &image_info;
18932
18933 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18934 // be
18935 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18936 // This will most likely produce a crash if the parameter_validation
18937 // layer
18938 // does not correctly ignore pBufferInfo.
18939 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18940 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18941
18942 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18943
18944 m_errorMonitor->VerifyNotFound();
18945
18946 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18947 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18948 vkDestroyImageView(m_device->device(), view, NULL);
18949 vkDestroyImage(m_device->device(), image, NULL);
18950 vkFreeMemory(m_device->device(), image_memory, NULL);
18951 }
18952
18953 // Buffer Case
18954 {
18955 m_errorMonitor->ExpectSuccess();
18956
18957 VkBuffer buffer;
18958 uint32_t queue_family_index = 0;
18959 VkBufferCreateInfo buffer_create_info = {};
18960 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18961 buffer_create_info.size = 1024;
18962 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18963 buffer_create_info.queueFamilyIndexCount = 1;
18964 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18965
18966 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18967 ASSERT_VK_SUCCESS(err);
18968
18969 VkMemoryRequirements memory_reqs;
18970 VkDeviceMemory buffer_memory;
18971 bool pass;
18972 VkMemoryAllocateInfo memory_info = {};
18973 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18974 memory_info.pNext = NULL;
18975 memory_info.allocationSize = 0;
18976 memory_info.memoryTypeIndex = 0;
18977
18978 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18979 memory_info.allocationSize = memory_reqs.size;
18980 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18981 ASSERT_TRUE(pass);
18982
18983 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18984 ASSERT_VK_SUCCESS(err);
18985 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18986 ASSERT_VK_SUCCESS(err);
18987
18988 VkDescriptorPoolSize ds_type_count = {};
18989 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18990 ds_type_count.descriptorCount = 1;
18991
18992 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18993 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18994 ds_pool_ci.pNext = NULL;
18995 ds_pool_ci.maxSets = 1;
18996 ds_pool_ci.poolSizeCount = 1;
18997 ds_pool_ci.pPoolSizes = &ds_type_count;
18998
18999 VkDescriptorPool ds_pool;
19000 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19001 ASSERT_VK_SUCCESS(err);
19002
19003 VkDescriptorSetLayoutBinding dsl_binding = {};
19004 dsl_binding.binding = 0;
19005 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19006 dsl_binding.descriptorCount = 1;
19007 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19008 dsl_binding.pImmutableSamplers = NULL;
19009
19010 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19011 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19012 ds_layout_ci.pNext = NULL;
19013 ds_layout_ci.bindingCount = 1;
19014 ds_layout_ci.pBindings = &dsl_binding;
19015 VkDescriptorSetLayout ds_layout;
19016 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19017 ASSERT_VK_SUCCESS(err);
19018
19019 VkDescriptorSet descriptor_set;
19020 VkDescriptorSetAllocateInfo alloc_info = {};
19021 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19022 alloc_info.descriptorSetCount = 1;
19023 alloc_info.descriptorPool = ds_pool;
19024 alloc_info.pSetLayouts = &ds_layout;
19025 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19026 ASSERT_VK_SUCCESS(err);
19027
19028 VkDescriptorBufferInfo buffer_info = {};
19029 buffer_info.buffer = buffer;
19030 buffer_info.offset = 0;
19031 buffer_info.range = 1024;
19032
19033 VkWriteDescriptorSet descriptor_write;
19034 memset(&descriptor_write, 0, sizeof(descriptor_write));
19035 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19036 descriptor_write.dstSet = descriptor_set;
19037 descriptor_write.dstBinding = 0;
19038 descriptor_write.descriptorCount = 1;
19039 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19040 descriptor_write.pBufferInfo = &buffer_info;
19041
19042 // Set pImageInfo and pTexelBufferView to invalid values, which should
19043 // be
19044 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
19045 // This will most likely produce a crash if the parameter_validation
19046 // layer
19047 // does not correctly ignore pImageInfo.
19048 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19049 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
19050
19051 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19052
19053 m_errorMonitor->VerifyNotFound();
19054
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019055 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19056 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19057 vkDestroyBuffer(m_device->device(), buffer, NULL);
19058 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19059 }
19060
19061 // Texel Buffer Case
19062 {
19063 m_errorMonitor->ExpectSuccess();
19064
19065 VkBuffer buffer;
19066 uint32_t queue_family_index = 0;
19067 VkBufferCreateInfo buffer_create_info = {};
19068 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19069 buffer_create_info.size = 1024;
19070 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
19071 buffer_create_info.queueFamilyIndexCount = 1;
19072 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
19073
19074 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
19075 ASSERT_VK_SUCCESS(err);
19076
19077 VkMemoryRequirements memory_reqs;
19078 VkDeviceMemory buffer_memory;
19079 bool pass;
19080 VkMemoryAllocateInfo memory_info = {};
19081 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19082 memory_info.pNext = NULL;
19083 memory_info.allocationSize = 0;
19084 memory_info.memoryTypeIndex = 0;
19085
19086 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
19087 memory_info.allocationSize = memory_reqs.size;
19088 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19089 ASSERT_TRUE(pass);
19090
19091 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
19092 ASSERT_VK_SUCCESS(err);
19093 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19094 ASSERT_VK_SUCCESS(err);
19095
19096 VkBufferViewCreateInfo buff_view_ci = {};
19097 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
19098 buff_view_ci.buffer = buffer;
19099 buff_view_ci.format = VK_FORMAT_R8_UNORM;
19100 buff_view_ci.range = VK_WHOLE_SIZE;
19101 VkBufferView buffer_view;
19102 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19103
19104 VkDescriptorPoolSize ds_type_count = {};
19105 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19106 ds_type_count.descriptorCount = 1;
19107
19108 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19109 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19110 ds_pool_ci.pNext = NULL;
19111 ds_pool_ci.maxSets = 1;
19112 ds_pool_ci.poolSizeCount = 1;
19113 ds_pool_ci.pPoolSizes = &ds_type_count;
19114
19115 VkDescriptorPool ds_pool;
19116 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19117 ASSERT_VK_SUCCESS(err);
19118
19119 VkDescriptorSetLayoutBinding dsl_binding = {};
19120 dsl_binding.binding = 0;
19121 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19122 dsl_binding.descriptorCount = 1;
19123 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19124 dsl_binding.pImmutableSamplers = NULL;
19125
19126 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19127 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19128 ds_layout_ci.pNext = NULL;
19129 ds_layout_ci.bindingCount = 1;
19130 ds_layout_ci.pBindings = &dsl_binding;
19131 VkDescriptorSetLayout ds_layout;
19132 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19133 ASSERT_VK_SUCCESS(err);
19134
19135 VkDescriptorSet descriptor_set;
19136 VkDescriptorSetAllocateInfo alloc_info = {};
19137 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19138 alloc_info.descriptorSetCount = 1;
19139 alloc_info.descriptorPool = ds_pool;
19140 alloc_info.pSetLayouts = &ds_layout;
19141 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19142 ASSERT_VK_SUCCESS(err);
19143
19144 VkWriteDescriptorSet descriptor_write;
19145 memset(&descriptor_write, 0, sizeof(descriptor_write));
19146 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19147 descriptor_write.dstSet = descriptor_set;
19148 descriptor_write.dstBinding = 0;
19149 descriptor_write.descriptorCount = 1;
19150 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19151 descriptor_write.pTexelBufferView = &buffer_view;
19152
19153 // Set pImageInfo and pBufferInfo to invalid values, which should be
19154 // ignored for descriptorType ==
19155 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19156 // This will most likely produce a crash if the parameter_validation
19157 // layer
19158 // does not correctly ignore pImageInfo and pBufferInfo.
19159 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19160 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19161
19162 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19163
19164 m_errorMonitor->VerifyNotFound();
19165
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019166 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19167 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19168 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19169 vkDestroyBuffer(m_device->device(), buffer, NULL);
19170 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19171 }
19172}
19173
Tobin Ehlisf7428442016-10-25 07:58:24 -060019174TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19175 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19176
Tony Barbour1fa09702017-03-16 12:09:08 -060019177 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019178 // Create layout where two binding #s are "1"
19179 static const uint32_t NUM_BINDINGS = 3;
19180 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19181 dsl_binding[0].binding = 1;
19182 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19183 dsl_binding[0].descriptorCount = 1;
19184 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19185 dsl_binding[0].pImmutableSamplers = NULL;
19186 dsl_binding[1].binding = 0;
19187 dsl_binding[1].descriptorCount = 1;
19188 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19189 dsl_binding[1].descriptorCount = 1;
19190 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19191 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019192 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019193 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19194 dsl_binding[2].descriptorCount = 1;
19195 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19196 dsl_binding[2].pImmutableSamplers = NULL;
19197
19198 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19199 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19200 ds_layout_ci.pNext = NULL;
19201 ds_layout_ci.bindingCount = NUM_BINDINGS;
19202 ds_layout_ci.pBindings = dsl_binding;
19203 VkDescriptorSetLayout ds_layout;
19204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19205 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19206 m_errorMonitor->VerifyFound();
19207}
19208
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019209TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019210 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19211
Tony Barbour1fa09702017-03-16 12:09:08 -060019212 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019213
Tony Barbour552f6c02016-12-21 14:34:07 -070019214 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019215
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019216 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19217
19218 {
19219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19220 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19221 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19222 m_errorMonitor->VerifyFound();
19223 }
19224
19225 {
19226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19227 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19228 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19229 m_errorMonitor->VerifyFound();
19230 }
19231
19232 {
19233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19234 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
19235 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19236 m_errorMonitor->VerifyFound();
19237 }
19238
19239 {
19240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19241 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
19242 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19243 m_errorMonitor->VerifyFound();
19244 }
19245
19246 {
19247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
19248 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
19249 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19250 m_errorMonitor->VerifyFound();
19251 }
19252
19253 {
19254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
19255 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19256 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19257 m_errorMonitor->VerifyFound();
19258 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019259
19260 {
19261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19262 VkRect2D scissor = {{-1, 0}, {16, 16}};
19263 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19264 m_errorMonitor->VerifyFound();
19265 }
19266
19267 {
19268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19269 VkRect2D scissor = {{0, -2}, {16, 16}};
19270 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19271 m_errorMonitor->VerifyFound();
19272 }
19273
19274 {
19275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19276 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
19277 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19278 m_errorMonitor->VerifyFound();
19279 }
19280
19281 {
19282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
19283 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19284 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19285 m_errorMonitor->VerifyFound();
19286 }
19287
Tony Barbour552f6c02016-12-21 14:34:07 -070019288 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019289}
19290
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019291// This is a positive test. No failures are expected.
19292TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19293 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19294 VkResult err;
19295
Tony Barbour1fa09702017-03-16 12:09:08 -060019296 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019297 m_errorMonitor->ExpectSuccess();
19298 VkDescriptorPoolSize ds_type_count = {};
19299 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19300 ds_type_count.descriptorCount = 2;
19301
19302 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19303 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19304 ds_pool_ci.pNext = NULL;
19305 ds_pool_ci.maxSets = 1;
19306 ds_pool_ci.poolSizeCount = 1;
19307 ds_pool_ci.pPoolSizes = &ds_type_count;
19308
19309 VkDescriptorPool ds_pool;
19310 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19311 ASSERT_VK_SUCCESS(err);
19312
19313 // Create layout with two uniform buffer descriptors w/ empty binding between them
19314 static const uint32_t NUM_BINDINGS = 3;
19315 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19316 dsl_binding[0].binding = 0;
19317 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19318 dsl_binding[0].descriptorCount = 1;
19319 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19320 dsl_binding[0].pImmutableSamplers = NULL;
19321 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019322 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019323 dsl_binding[2].binding = 2;
19324 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19325 dsl_binding[2].descriptorCount = 1;
19326 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19327 dsl_binding[2].pImmutableSamplers = NULL;
19328
19329 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19330 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19331 ds_layout_ci.pNext = NULL;
19332 ds_layout_ci.bindingCount = NUM_BINDINGS;
19333 ds_layout_ci.pBindings = dsl_binding;
19334 VkDescriptorSetLayout ds_layout;
19335 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19336 ASSERT_VK_SUCCESS(err);
19337
19338 VkDescriptorSet descriptor_set = {};
19339 VkDescriptorSetAllocateInfo alloc_info = {};
19340 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19341 alloc_info.descriptorSetCount = 1;
19342 alloc_info.descriptorPool = ds_pool;
19343 alloc_info.pSetLayouts = &ds_layout;
19344 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19345 ASSERT_VK_SUCCESS(err);
19346
19347 // Create a buffer to be used for update
19348 VkBufferCreateInfo buff_ci = {};
19349 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19350 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19351 buff_ci.size = 256;
19352 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19353 VkBuffer buffer;
19354 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19355 ASSERT_VK_SUCCESS(err);
19356 // Have to bind memory to buffer before descriptor update
19357 VkMemoryAllocateInfo mem_alloc = {};
19358 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19359 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019360 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019361 mem_alloc.memoryTypeIndex = 0;
19362
19363 VkMemoryRequirements mem_reqs;
19364 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19365 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19366 if (!pass) {
19367 vkDestroyBuffer(m_device->device(), buffer, NULL);
19368 return;
19369 }
19370
19371 VkDeviceMemory mem;
19372 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19373 ASSERT_VK_SUCCESS(err);
19374 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19375 ASSERT_VK_SUCCESS(err);
19376
19377 // Only update the descriptor at binding 2
19378 VkDescriptorBufferInfo buff_info = {};
19379 buff_info.buffer = buffer;
19380 buff_info.offset = 0;
19381 buff_info.range = VK_WHOLE_SIZE;
19382 VkWriteDescriptorSet descriptor_write = {};
19383 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19384 descriptor_write.dstBinding = 2;
19385 descriptor_write.descriptorCount = 1;
19386 descriptor_write.pTexelBufferView = nullptr;
19387 descriptor_write.pBufferInfo = &buff_info;
19388 descriptor_write.pImageInfo = nullptr;
19389 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19390 descriptor_write.dstSet = descriptor_set;
19391
19392 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19393
19394 m_errorMonitor->VerifyNotFound();
19395 // Cleanup
19396 vkFreeMemory(m_device->device(), mem, NULL);
19397 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19398 vkDestroyBuffer(m_device->device(), buffer, NULL);
19399 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19400}
19401
19402// This is a positive test. No failures are expected.
19403TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19404 VkResult err;
19405 bool pass;
19406
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019407 TEST_DESCRIPTION(
19408 "Create a buffer, allocate memory, bind memory, destroy "
19409 "the buffer, create an image, and bind the same memory to "
19410 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019411
19412 m_errorMonitor->ExpectSuccess();
19413
Tony Barbour1fa09702017-03-16 12:09:08 -060019414 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019415
19416 VkBuffer buffer;
19417 VkImage image;
19418 VkDeviceMemory mem;
19419 VkMemoryRequirements mem_reqs;
19420
19421 VkBufferCreateInfo buf_info = {};
19422 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19423 buf_info.pNext = NULL;
19424 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19425 buf_info.size = 256;
19426 buf_info.queueFamilyIndexCount = 0;
19427 buf_info.pQueueFamilyIndices = NULL;
19428 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19429 buf_info.flags = 0;
19430 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19431 ASSERT_VK_SUCCESS(err);
19432
19433 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19434
19435 VkMemoryAllocateInfo alloc_info = {};
19436 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19437 alloc_info.pNext = NULL;
19438 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019439
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019440 // Ensure memory is big enough for both bindings
19441 alloc_info.allocationSize = 0x10000;
19442
19443 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19444 if (!pass) {
19445 vkDestroyBuffer(m_device->device(), buffer, NULL);
19446 return;
19447 }
19448
19449 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19450 ASSERT_VK_SUCCESS(err);
19451
19452 uint8_t *pData;
19453 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19454 ASSERT_VK_SUCCESS(err);
19455
19456 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19457
19458 vkUnmapMemory(m_device->device(), mem);
19459
19460 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19461 ASSERT_VK_SUCCESS(err);
19462
19463 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19464 // memory. In fact, it was never used by the GPU.
19465 // Just be be sure, wait for idle.
19466 vkDestroyBuffer(m_device->device(), buffer, NULL);
19467 vkDeviceWaitIdle(m_device->device());
19468
Tobin Ehlis6a005702016-12-28 15:25:56 -070019469 // Use optimal as some platforms report linear support but then fail image creation
19470 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19471 VkImageFormatProperties image_format_properties;
19472 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19473 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19474 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019475 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019476 vkFreeMemory(m_device->device(), mem, NULL);
19477 return;
19478 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019479 VkImageCreateInfo image_create_info = {};
19480 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19481 image_create_info.pNext = NULL;
19482 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19483 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19484 image_create_info.extent.width = 64;
19485 image_create_info.extent.height = 64;
19486 image_create_info.extent.depth = 1;
19487 image_create_info.mipLevels = 1;
19488 image_create_info.arrayLayers = 1;
19489 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019490 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019491 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19492 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19493 image_create_info.queueFamilyIndexCount = 0;
19494 image_create_info.pQueueFamilyIndices = NULL;
19495 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19496 image_create_info.flags = 0;
19497
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019498 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019499 * to be textures or it will be the staging image if they are not.
19500 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019501 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19502 ASSERT_VK_SUCCESS(err);
19503
19504 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19505
Tobin Ehlis6a005702016-12-28 15:25:56 -070019506 VkMemoryAllocateInfo mem_alloc = {};
19507 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19508 mem_alloc.pNext = NULL;
19509 mem_alloc.allocationSize = 0;
19510 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019511 mem_alloc.allocationSize = mem_reqs.size;
19512
19513 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19514 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019515 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019516 vkDestroyImage(m_device->device(), image, NULL);
19517 return;
19518 }
19519
19520 // VALIDATION FAILURE:
19521 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19522 ASSERT_VK_SUCCESS(err);
19523
19524 m_errorMonitor->VerifyNotFound();
19525
19526 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019527 vkDestroyImage(m_device->device(), image, NULL);
19528}
19529
Tony Barbourab713912017-02-02 14:17:35 -070019530// This is a positive test. No failures are expected.
19531TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19532 VkResult err;
19533
19534 TEST_DESCRIPTION(
19535 "Call all applicable destroy and free routines with NULL"
19536 "handles, expecting no validation errors");
19537
19538 m_errorMonitor->ExpectSuccess();
19539
Tony Barbour1fa09702017-03-16 12:09:08 -060019540 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019541 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19542 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19543 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19544 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19545 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19546 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19547 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19548 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19549 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19550 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19551 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19552 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19553 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19554 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19555 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19556 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19557 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19558 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19559 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19560 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19561
19562 VkCommandPool command_pool;
19563 VkCommandPoolCreateInfo pool_create_info{};
19564 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19565 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19566 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19567 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19568 VkCommandBuffer command_buffers[3] = {};
19569 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19570 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19571 command_buffer_allocate_info.commandPool = command_pool;
19572 command_buffer_allocate_info.commandBufferCount = 1;
19573 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19574 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19575 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19576 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19577
19578 VkDescriptorPoolSize ds_type_count = {};
19579 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19580 ds_type_count.descriptorCount = 1;
19581
19582 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19583 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19584 ds_pool_ci.pNext = NULL;
19585 ds_pool_ci.maxSets = 1;
19586 ds_pool_ci.poolSizeCount = 1;
19587 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19588 ds_pool_ci.pPoolSizes = &ds_type_count;
19589
19590 VkDescriptorPool ds_pool;
19591 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19592 ASSERT_VK_SUCCESS(err);
19593
19594 VkDescriptorSetLayoutBinding dsl_binding = {};
19595 dsl_binding.binding = 2;
19596 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19597 dsl_binding.descriptorCount = 1;
19598 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19599 dsl_binding.pImmutableSamplers = NULL;
19600 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19601 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19602 ds_layout_ci.pNext = NULL;
19603 ds_layout_ci.bindingCount = 1;
19604 ds_layout_ci.pBindings = &dsl_binding;
19605 VkDescriptorSetLayout ds_layout;
19606 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19607 ASSERT_VK_SUCCESS(err);
19608
19609 VkDescriptorSet descriptor_sets[3] = {};
19610 VkDescriptorSetAllocateInfo alloc_info = {};
19611 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19612 alloc_info.descriptorSetCount = 1;
19613 alloc_info.descriptorPool = ds_pool;
19614 alloc_info.pSetLayouts = &ds_layout;
19615 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19616 ASSERT_VK_SUCCESS(err);
19617 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19618 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19619 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19620
19621 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19622
19623 m_errorMonitor->VerifyNotFound();
19624}
19625
Tony Barbour626994c2017-02-08 15:29:37 -070019626TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019627 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019628
19629 m_errorMonitor->ExpectSuccess();
19630
Tony Barbour1fa09702017-03-16 12:09:08 -060019631 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019632 VkCommandBuffer cmd_bufs[4];
19633 VkCommandBufferAllocateInfo alloc_info;
19634 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19635 alloc_info.pNext = NULL;
19636 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019637 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019638 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19639 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19640 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019641 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019642 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19643 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019644 ASSERT_TRUE(image.initialized());
19645 VkCommandBufferBeginInfo cb_binfo;
19646 cb_binfo.pNext = NULL;
19647 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19648 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19649 cb_binfo.flags = 0;
19650 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19651 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19652 VkImageMemoryBarrier img_barrier = {};
19653 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19654 img_barrier.pNext = NULL;
19655 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19656 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19657 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19658 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19659 img_barrier.image = image.handle();
19660 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19661 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19662 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19663 img_barrier.subresourceRange.baseArrayLayer = 0;
19664 img_barrier.subresourceRange.baseMipLevel = 0;
19665 img_barrier.subresourceRange.layerCount = 1;
19666 img_barrier.subresourceRange.levelCount = 1;
19667 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19668 &img_barrier);
19669 vkEndCommandBuffer(cmd_bufs[0]);
19670 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19671 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19672 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19673 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19674 &img_barrier);
19675 vkEndCommandBuffer(cmd_bufs[1]);
19676 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19677 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19678 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19679 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19680 &img_barrier);
19681 vkEndCommandBuffer(cmd_bufs[2]);
19682 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19683 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19684 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19685 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19686 &img_barrier);
19687 vkEndCommandBuffer(cmd_bufs[3]);
19688
19689 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19690 VkSemaphore semaphore1, semaphore2;
19691 VkSemaphoreCreateInfo semaphore_create_info{};
19692 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19693 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19694 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19695 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19696 VkSubmitInfo submit_info[3];
19697 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19698 submit_info[0].pNext = nullptr;
19699 submit_info[0].commandBufferCount = 1;
19700 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19701 submit_info[0].signalSemaphoreCount = 1;
19702 submit_info[0].pSignalSemaphores = &semaphore1;
19703 submit_info[0].waitSemaphoreCount = 0;
19704 submit_info[0].pWaitDstStageMask = nullptr;
19705 submit_info[0].pWaitDstStageMask = flags;
19706 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19707 submit_info[1].pNext = nullptr;
19708 submit_info[1].commandBufferCount = 1;
19709 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19710 submit_info[1].waitSemaphoreCount = 1;
19711 submit_info[1].pWaitSemaphores = &semaphore1;
19712 submit_info[1].signalSemaphoreCount = 1;
19713 submit_info[1].pSignalSemaphores = &semaphore2;
19714 submit_info[1].pWaitDstStageMask = flags;
19715 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19716 submit_info[2].pNext = nullptr;
19717 submit_info[2].commandBufferCount = 2;
19718 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19719 submit_info[2].waitSemaphoreCount = 1;
19720 submit_info[2].pWaitSemaphores = &semaphore2;
19721 submit_info[2].signalSemaphoreCount = 0;
19722 submit_info[2].pSignalSemaphores = nullptr;
19723 submit_info[2].pWaitDstStageMask = flags;
19724 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19725 vkQueueWaitIdle(m_device->m_queue);
19726
19727 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19728 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19729 m_errorMonitor->VerifyNotFound();
19730}
19731
Tobin Ehlis953e8392016-11-17 10:54:13 -070019732TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19733 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19734 // We previously had a bug where dynamic offset of inactive bindings was still being used
19735 VkResult err;
19736 m_errorMonitor->ExpectSuccess();
19737
Tony Barbour1fa09702017-03-16 12:09:08 -060019738 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019739 ASSERT_NO_FATAL_FAILURE(InitViewport());
19740 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19741
19742 VkDescriptorPoolSize ds_type_count = {};
19743 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19744 ds_type_count.descriptorCount = 3;
19745
19746 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19747 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19748 ds_pool_ci.pNext = NULL;
19749 ds_pool_ci.maxSets = 1;
19750 ds_pool_ci.poolSizeCount = 1;
19751 ds_pool_ci.pPoolSizes = &ds_type_count;
19752
19753 VkDescriptorPool ds_pool;
19754 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19755 ASSERT_VK_SUCCESS(err);
19756
19757 const uint32_t BINDING_COUNT = 3;
19758 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019759 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019760 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19761 dsl_binding[0].descriptorCount = 1;
19762 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19763 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019764 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019765 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19766 dsl_binding[1].descriptorCount = 1;
19767 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19768 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019769 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019770 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19771 dsl_binding[2].descriptorCount = 1;
19772 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19773 dsl_binding[2].pImmutableSamplers = NULL;
19774
19775 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19776 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19777 ds_layout_ci.pNext = NULL;
19778 ds_layout_ci.bindingCount = BINDING_COUNT;
19779 ds_layout_ci.pBindings = dsl_binding;
19780 VkDescriptorSetLayout ds_layout;
19781 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19782 ASSERT_VK_SUCCESS(err);
19783
19784 VkDescriptorSet descriptor_set;
19785 VkDescriptorSetAllocateInfo alloc_info = {};
19786 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19787 alloc_info.descriptorSetCount = 1;
19788 alloc_info.descriptorPool = ds_pool;
19789 alloc_info.pSetLayouts = &ds_layout;
19790 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19791 ASSERT_VK_SUCCESS(err);
19792
19793 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19794 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19795 pipeline_layout_ci.pNext = NULL;
19796 pipeline_layout_ci.setLayoutCount = 1;
19797 pipeline_layout_ci.pSetLayouts = &ds_layout;
19798
19799 VkPipelineLayout pipeline_layout;
19800 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19801 ASSERT_VK_SUCCESS(err);
19802
19803 // Create two buffers to update the descriptors with
19804 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19805 uint32_t qfi = 0;
19806 VkBufferCreateInfo buffCI = {};
19807 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19808 buffCI.size = 2048;
19809 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19810 buffCI.queueFamilyIndexCount = 1;
19811 buffCI.pQueueFamilyIndices = &qfi;
19812
19813 VkBuffer dyub1;
19814 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19815 ASSERT_VK_SUCCESS(err);
19816 // buffer2
19817 buffCI.size = 1024;
19818 VkBuffer dyub2;
19819 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19820 ASSERT_VK_SUCCESS(err);
19821 // Allocate memory and bind to buffers
19822 VkMemoryAllocateInfo mem_alloc[2] = {};
19823 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19824 mem_alloc[0].pNext = NULL;
19825 mem_alloc[0].memoryTypeIndex = 0;
19826 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19827 mem_alloc[1].pNext = NULL;
19828 mem_alloc[1].memoryTypeIndex = 0;
19829
19830 VkMemoryRequirements mem_reqs1;
19831 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19832 VkMemoryRequirements mem_reqs2;
19833 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19834 mem_alloc[0].allocationSize = mem_reqs1.size;
19835 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19836 mem_alloc[1].allocationSize = mem_reqs2.size;
19837 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19838 if (!pass) {
19839 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19840 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19841 return;
19842 }
19843
19844 VkDeviceMemory mem1;
19845 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19846 ASSERT_VK_SUCCESS(err);
19847 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19848 ASSERT_VK_SUCCESS(err);
19849 VkDeviceMemory mem2;
19850 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19851 ASSERT_VK_SUCCESS(err);
19852 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19853 ASSERT_VK_SUCCESS(err);
19854 // Update descriptors
19855 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19856 buff_info[0].buffer = dyub1;
19857 buff_info[0].offset = 0;
19858 buff_info[0].range = 256;
19859 buff_info[1].buffer = dyub1;
19860 buff_info[1].offset = 256;
19861 buff_info[1].range = 512;
19862 buff_info[2].buffer = dyub2;
19863 buff_info[2].offset = 0;
19864 buff_info[2].range = 512;
19865
19866 VkWriteDescriptorSet descriptor_write;
19867 memset(&descriptor_write, 0, sizeof(descriptor_write));
19868 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19869 descriptor_write.dstSet = descriptor_set;
19870 descriptor_write.dstBinding = 0;
19871 descriptor_write.descriptorCount = BINDING_COUNT;
19872 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19873 descriptor_write.pBufferInfo = buff_info;
19874
19875 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19876
Tony Barbour552f6c02016-12-21 14:34:07 -070019877 m_commandBuffer->BeginCommandBuffer();
19878 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019879
19880 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019881 char const *vsSource =
19882 "#version 450\n"
19883 "\n"
19884 "out gl_PerVertex { \n"
19885 " vec4 gl_Position;\n"
19886 "};\n"
19887 "void main(){\n"
19888 " gl_Position = vec4(1);\n"
19889 "}\n";
19890 char const *fsSource =
19891 "#version 450\n"
19892 "\n"
19893 "layout(location=0) out vec4 x;\n"
19894 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19895 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19896 "void main(){\n"
19897 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19898 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019899 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19900 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19901 VkPipelineObj pipe(m_device);
19902 pipe.SetViewport(m_viewports);
19903 pipe.SetScissor(m_scissors);
19904 pipe.AddShader(&vs);
19905 pipe.AddShader(&fs);
19906 pipe.AddColorAttachment();
19907 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19908
19909 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19910 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19911 // we used to have a bug in this case.
19912 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19913 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19914 &descriptor_set, BINDING_COUNT, dyn_off);
19915 Draw(1, 0, 0, 0);
19916 m_errorMonitor->VerifyNotFound();
19917
19918 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19919 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19920 vkFreeMemory(m_device->device(), mem1, NULL);
19921 vkFreeMemory(m_device->device(), mem2, NULL);
19922
19923 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19924 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19925 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19926}
19927
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019928TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019929 TEST_DESCRIPTION(
19930 "Ensure that validations handling of non-coherent memory "
19931 "mapping while using VK_WHOLE_SIZE does not cause access "
19932 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019933 VkResult err;
19934 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019935 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019936
19937 VkDeviceMemory mem;
19938 VkMemoryRequirements mem_reqs;
19939 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019940 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019941 VkMemoryAllocateInfo alloc_info = {};
19942 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19943 alloc_info.pNext = NULL;
19944 alloc_info.memoryTypeIndex = 0;
19945
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019946 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019947 alloc_info.allocationSize = allocation_size;
19948
19949 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19950 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 -070019951 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019952 if (!pass) {
19953 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019954 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19955 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019956 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019957 pass = m_device->phy().set_memory_type(
19958 mem_reqs.memoryTypeBits, &alloc_info,
19959 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19960 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019961 if (!pass) {
19962 return;
19963 }
19964 }
19965 }
19966
19967 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19968 ASSERT_VK_SUCCESS(err);
19969
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019970 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019971 m_errorMonitor->ExpectSuccess();
19972 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19973 ASSERT_VK_SUCCESS(err);
19974 VkMappedMemoryRange mmr = {};
19975 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19976 mmr.memory = mem;
19977 mmr.offset = 0;
19978 mmr.size = VK_WHOLE_SIZE;
19979 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19980 ASSERT_VK_SUCCESS(err);
19981 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19982 ASSERT_VK_SUCCESS(err);
19983 m_errorMonitor->VerifyNotFound();
19984 vkUnmapMemory(m_device->device(), mem);
19985
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019986 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019987 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019988 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019989 ASSERT_VK_SUCCESS(err);
19990 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19991 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019992 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019993 mmr.size = VK_WHOLE_SIZE;
19994 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19995 ASSERT_VK_SUCCESS(err);
19996 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19997 ASSERT_VK_SUCCESS(err);
19998 m_errorMonitor->VerifyNotFound();
19999 vkUnmapMemory(m_device->device(), mem);
20000
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020001 // Map with offset and size
20002 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020003 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020004 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020005 ASSERT_VK_SUCCESS(err);
20006 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20007 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020008 mmr.offset = 4 * atom_size;
20009 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020010 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20011 ASSERT_VK_SUCCESS(err);
20012 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
20013 ASSERT_VK_SUCCESS(err);
20014 m_errorMonitor->VerifyNotFound();
20015 vkUnmapMemory(m_device->device(), mem);
20016
20017 // Map without offset and flush WHOLE_SIZE with two separate offsets
20018 m_errorMonitor->ExpectSuccess();
20019 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
20020 ASSERT_VK_SUCCESS(err);
20021 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
20022 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020023 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020024 mmr.size = VK_WHOLE_SIZE;
20025 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20026 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070020027 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020028 mmr.size = VK_WHOLE_SIZE;
20029 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
20030 ASSERT_VK_SUCCESS(err);
20031 m_errorMonitor->VerifyNotFound();
20032 vkUnmapMemory(m_device->device(), mem);
20033
20034 vkFreeMemory(m_device->device(), mem, NULL);
20035}
20036
20037// This is a positive test. We used to expect error in this case but spec now allows it
20038TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
20039 m_errorMonitor->ExpectSuccess();
20040 vk_testing::Fence testFence;
20041 VkFenceCreateInfo fenceInfo = {};
20042 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20043 fenceInfo.pNext = NULL;
20044
Tony Barbour1fa09702017-03-16 12:09:08 -060020045 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020046 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020047 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020048 VkResult result = vkResetFences(m_device->device(), 1, fences);
20049 ASSERT_VK_SUCCESS(result);
20050
20051 m_errorMonitor->VerifyNotFound();
20052}
20053
20054TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
20055 m_errorMonitor->ExpectSuccess();
20056
Tony Barbour1fa09702017-03-16 12:09:08 -060020057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020058 VkResult err;
20059
20060 // Record (empty!) command buffer that can be submitted multiple times
20061 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020062 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
20063 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020064 m_commandBuffer->BeginCommandBuffer(&cbbi);
20065 m_commandBuffer->EndCommandBuffer();
20066
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020067 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020068 VkFence fence;
20069 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
20070 ASSERT_VK_SUCCESS(err);
20071
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020072 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020073 VkSemaphore s1, s2;
20074 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
20075 ASSERT_VK_SUCCESS(err);
20076 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
20077 ASSERT_VK_SUCCESS(err);
20078
20079 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020080 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020081 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
20082 ASSERT_VK_SUCCESS(err);
20083
20084 // Submit CB again, signaling s2.
20085 si.pSignalSemaphores = &s2;
20086 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
20087 ASSERT_VK_SUCCESS(err);
20088
20089 // Wait for fence.
20090 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20091 ASSERT_VK_SUCCESS(err);
20092
20093 // CB is still in flight from second submission, but semaphore s1 is no
20094 // longer in flight. delete it.
20095 vkDestroySemaphore(m_device->device(), s1, nullptr);
20096
20097 m_errorMonitor->VerifyNotFound();
20098
20099 // Force device idle and clean up remaining objects
20100 vkDeviceWaitIdle(m_device->device());
20101 vkDestroySemaphore(m_device->device(), s2, nullptr);
20102 vkDestroyFence(m_device->device(), fence, nullptr);
20103}
20104
20105TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20106 m_errorMonitor->ExpectSuccess();
20107
Tony Barbour1fa09702017-03-16 12:09:08 -060020108 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020109 VkResult err;
20110
20111 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020112 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020113 VkFence f1;
20114 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20115 ASSERT_VK_SUCCESS(err);
20116
20117 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020118 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020119 VkFence f2;
20120 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20121 ASSERT_VK_SUCCESS(err);
20122
20123 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020124 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020125 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20126
20127 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020128 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020129 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20130
20131 // Should have both retired!
20132 vkDestroyFence(m_device->device(), f1, nullptr);
20133 vkDestroyFence(m_device->device(), f2, nullptr);
20134
20135 m_errorMonitor->VerifyNotFound();
20136}
20137
20138TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020139 TEST_DESCRIPTION(
20140 "Verify that creating an image view from an image with valid usage "
20141 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020142
Tony Barbour1fa09702017-03-16 12:09:08 -060020143 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020144
20145 m_errorMonitor->ExpectSuccess();
20146 // Verify that we can create a view with usage INPUT_ATTACHMENT
20147 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020148 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 -060020149 ASSERT_TRUE(image.initialized());
20150 VkImageView imageView;
20151 VkImageViewCreateInfo ivci = {};
20152 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20153 ivci.image = image.handle();
20154 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20155 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20156 ivci.subresourceRange.layerCount = 1;
20157 ivci.subresourceRange.baseMipLevel = 0;
20158 ivci.subresourceRange.levelCount = 1;
20159 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20160
20161 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20162 m_errorMonitor->VerifyNotFound();
20163 vkDestroyImageView(m_device->device(), imageView, NULL);
20164}
20165
20166// This is a positive test. No failures are expected.
20167TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020168 TEST_DESCRIPTION(
20169 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20170 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020171
Tony Barbour1fa09702017-03-16 12:09:08 -060020172 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020173
20174 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020175 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020176 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020177
20178 m_errorMonitor->ExpectSuccess();
20179
20180 VkImage image;
20181 VkImageCreateInfo image_create_info = {};
20182 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20183 image_create_info.pNext = NULL;
20184 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20185 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20186 image_create_info.extent.width = 64;
20187 image_create_info.extent.height = 64;
20188 image_create_info.extent.depth = 1;
20189 image_create_info.mipLevels = 1;
20190 image_create_info.arrayLayers = 1;
20191 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20192 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20193 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20194 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20195 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20196 ASSERT_VK_SUCCESS(err);
20197
20198 VkMemoryRequirements memory_reqs;
20199 VkDeviceMemory memory_one, memory_two;
20200 bool pass;
20201 VkMemoryAllocateInfo memory_info = {};
20202 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20203 memory_info.pNext = NULL;
20204 memory_info.allocationSize = 0;
20205 memory_info.memoryTypeIndex = 0;
20206 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20207 // Find an image big enough to allow sparse mapping of 2 memory regions
20208 // Increase the image size until it is at least twice the
20209 // size of the required alignment, to ensure we can bind both
20210 // allocated memory blocks to the image on aligned offsets.
20211 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20212 vkDestroyImage(m_device->device(), image, nullptr);
20213 image_create_info.extent.width *= 2;
20214 image_create_info.extent.height *= 2;
20215 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20216 ASSERT_VK_SUCCESS(err);
20217 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20218 }
20219 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20220 // at the end of the first
20221 memory_info.allocationSize = memory_reqs.alignment;
20222 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20223 ASSERT_TRUE(pass);
20224 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20225 ASSERT_VK_SUCCESS(err);
20226 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20227 ASSERT_VK_SUCCESS(err);
20228 VkSparseMemoryBind binds[2];
20229 binds[0].flags = 0;
20230 binds[0].memory = memory_one;
20231 binds[0].memoryOffset = 0;
20232 binds[0].resourceOffset = 0;
20233 binds[0].size = memory_info.allocationSize;
20234 binds[1].flags = 0;
20235 binds[1].memory = memory_two;
20236 binds[1].memoryOffset = 0;
20237 binds[1].resourceOffset = memory_info.allocationSize;
20238 binds[1].size = memory_info.allocationSize;
20239
20240 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20241 opaqueBindInfo.image = image;
20242 opaqueBindInfo.bindCount = 2;
20243 opaqueBindInfo.pBinds = binds;
20244
20245 VkFence fence = VK_NULL_HANDLE;
20246 VkBindSparseInfo bindSparseInfo = {};
20247 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20248 bindSparseInfo.imageOpaqueBindCount = 1;
20249 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20250
20251 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20252 vkQueueWaitIdle(m_device->m_queue);
20253 vkDestroyImage(m_device->device(), image, NULL);
20254 vkFreeMemory(m_device->device(), memory_one, NULL);
20255 vkFreeMemory(m_device->device(), memory_two, NULL);
20256 m_errorMonitor->VerifyNotFound();
20257}
20258
20259TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020260 TEST_DESCRIPTION(
20261 "Ensure that CmdBeginRenderPass with an attachment's "
20262 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20263 "the command buffer has prior knowledge of that "
20264 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020265
20266 m_errorMonitor->ExpectSuccess();
20267
Tony Barbour1fa09702017-03-16 12:09:08 -060020268 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020269
20270 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020271 VkAttachmentDescription attachment = {0,
20272 VK_FORMAT_R8G8B8A8_UNORM,
20273 VK_SAMPLE_COUNT_1_BIT,
20274 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20275 VK_ATTACHMENT_STORE_OP_STORE,
20276 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20277 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20278 VK_IMAGE_LAYOUT_UNDEFINED,
20279 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020280
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020281 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020282
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020283 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020284
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020285 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020286
20287 VkRenderPass rp;
20288 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20289 ASSERT_VK_SUCCESS(err);
20290
20291 // A compatible framebuffer.
20292 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020293 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 -060020294 ASSERT_TRUE(image.initialized());
20295
20296 VkImageViewCreateInfo ivci = {
20297 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20298 nullptr,
20299 0,
20300 image.handle(),
20301 VK_IMAGE_VIEW_TYPE_2D,
20302 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020303 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20304 VK_COMPONENT_SWIZZLE_IDENTITY},
20305 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020306 };
20307 VkImageView view;
20308 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20309 ASSERT_VK_SUCCESS(err);
20310
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020311 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020312 VkFramebuffer fb;
20313 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20314 ASSERT_VK_SUCCESS(err);
20315
20316 // Record a single command buffer which uses this renderpass twice. The
20317 // bug is triggered at the beginning of the second renderpass, when the
20318 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020319 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 -070020320 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020321 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20322 vkCmdEndRenderPass(m_commandBuffer->handle());
20323 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20324
20325 m_errorMonitor->VerifyNotFound();
20326
20327 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020328 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020329
20330 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20331 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20332 vkDestroyImageView(m_device->device(), view, nullptr);
20333}
20334
20335TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020336 TEST_DESCRIPTION(
20337 "This test should pass. Create a Framebuffer and "
20338 "command buffer, bind them together, then destroy "
20339 "command pool and framebuffer and verify there are no "
20340 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020341
20342 m_errorMonitor->ExpectSuccess();
20343
Tony Barbour1fa09702017-03-16 12:09:08 -060020344 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020345
20346 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020347 VkAttachmentDescription attachment = {0,
20348 VK_FORMAT_R8G8B8A8_UNORM,
20349 VK_SAMPLE_COUNT_1_BIT,
20350 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20351 VK_ATTACHMENT_STORE_OP_STORE,
20352 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20353 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20354 VK_IMAGE_LAYOUT_UNDEFINED,
20355 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020356
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020357 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020358
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020359 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020360
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020361 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020362
20363 VkRenderPass rp;
20364 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20365 ASSERT_VK_SUCCESS(err);
20366
20367 // A compatible framebuffer.
20368 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020369 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 -060020370 ASSERT_TRUE(image.initialized());
20371
20372 VkImageViewCreateInfo ivci = {
20373 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20374 nullptr,
20375 0,
20376 image.handle(),
20377 VK_IMAGE_VIEW_TYPE_2D,
20378 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020379 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20380 VK_COMPONENT_SWIZZLE_IDENTITY},
20381 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020382 };
20383 VkImageView view;
20384 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20385 ASSERT_VK_SUCCESS(err);
20386
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020387 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020388 VkFramebuffer fb;
20389 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20390 ASSERT_VK_SUCCESS(err);
20391
20392 // Explicitly create a command buffer to bind the FB to so that we can then
20393 // destroy the command pool in order to implicitly free command buffer
20394 VkCommandPool command_pool;
20395 VkCommandPoolCreateInfo pool_create_info{};
20396 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20397 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20398 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20399 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20400
20401 VkCommandBuffer command_buffer;
20402 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20403 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20404 command_buffer_allocate_info.commandPool = command_pool;
20405 command_buffer_allocate_info.commandBufferCount = 1;
20406 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20407 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20408
20409 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020410 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 -060020411 VkCommandBufferBeginInfo begin_info{};
20412 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20413 vkBeginCommandBuffer(command_buffer, &begin_info);
20414
20415 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20416 vkCmdEndRenderPass(command_buffer);
20417 vkEndCommandBuffer(command_buffer);
20418 vkDestroyImageView(m_device->device(), view, nullptr);
20419 // Destroy command pool to implicitly free command buffer
20420 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20421 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20422 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20423 m_errorMonitor->VerifyNotFound();
20424}
20425
20426TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020427 TEST_DESCRIPTION(
20428 "Ensure that CmdBeginRenderPass applies the layout "
20429 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020430
20431 m_errorMonitor->ExpectSuccess();
20432
Tony Barbour1fa09702017-03-16 12:09:08 -060020433 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020434
20435 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020436 VkAttachmentDescription attachment = {0,
20437 VK_FORMAT_R8G8B8A8_UNORM,
20438 VK_SAMPLE_COUNT_1_BIT,
20439 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20440 VK_ATTACHMENT_STORE_OP_STORE,
20441 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20442 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20443 VK_IMAGE_LAYOUT_UNDEFINED,
20444 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020445
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020446 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020447
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020448 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020449
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020450 VkSubpassDependency dep = {0,
20451 0,
20452 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20453 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20454 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20455 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20456 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020457
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020458 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020459
20460 VkResult err;
20461 VkRenderPass rp;
20462 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20463 ASSERT_VK_SUCCESS(err);
20464
20465 // A compatible framebuffer.
20466 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020467 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 -060020468 ASSERT_TRUE(image.initialized());
20469
20470 VkImageViewCreateInfo ivci = {
20471 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20472 nullptr,
20473 0,
20474 image.handle(),
20475 VK_IMAGE_VIEW_TYPE_2D,
20476 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020477 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20478 VK_COMPONENT_SWIZZLE_IDENTITY},
20479 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020480 };
20481 VkImageView view;
20482 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20483 ASSERT_VK_SUCCESS(err);
20484
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020485 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020486 VkFramebuffer fb;
20487 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20488 ASSERT_VK_SUCCESS(err);
20489
20490 // Record a single command buffer which issues a pipeline barrier w/
20491 // image memory barrier for the attachment. This detects the previously
20492 // missing tracking of the subpass layout by throwing a validation error
20493 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020494 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 -070020495 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020496 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20497
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020498 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20499 nullptr,
20500 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20501 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20502 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20503 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20504 VK_QUEUE_FAMILY_IGNORED,
20505 VK_QUEUE_FAMILY_IGNORED,
20506 image.handle(),
20507 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020508 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020509 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20510 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020511
20512 vkCmdEndRenderPass(m_commandBuffer->handle());
20513 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020514 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020515
20516 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20517 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20518 vkDestroyImageView(m_device->device(), view, nullptr);
20519}
20520
20521TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020522 TEST_DESCRIPTION(
20523 "Validate that when an imageView of a depth/stencil image "
20524 "is used as a depth/stencil framebuffer attachment, the "
20525 "aspectMask is ignored and both depth and stencil image "
20526 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020527
Tony Barbour1fa09702017-03-16 12:09:08 -060020528 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020529 VkFormatProperties format_properties;
20530 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20531 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20532 return;
20533 }
20534
20535 m_errorMonitor->ExpectSuccess();
20536
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020537 VkAttachmentDescription attachment = {0,
20538 VK_FORMAT_D32_SFLOAT_S8_UINT,
20539 VK_SAMPLE_COUNT_1_BIT,
20540 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20541 VK_ATTACHMENT_STORE_OP_STORE,
20542 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20543 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20544 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20545 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020546
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020547 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020548
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020549 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020550
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020551 VkSubpassDependency dep = {0,
20552 0,
20553 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20554 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20555 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20556 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20557 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020558
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020559 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020560
20561 VkResult err;
20562 VkRenderPass rp;
20563 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20564 ASSERT_VK_SUCCESS(err);
20565
20566 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020567 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20568 0x26, // usage
20569 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020570 ASSERT_TRUE(image.initialized());
20571 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20572
20573 VkImageViewCreateInfo ivci = {
20574 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20575 nullptr,
20576 0,
20577 image.handle(),
20578 VK_IMAGE_VIEW_TYPE_2D,
20579 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020580 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20581 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020582 };
20583 VkImageView view;
20584 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20585 ASSERT_VK_SUCCESS(err);
20586
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020587 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020588 VkFramebuffer fb;
20589 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20590 ASSERT_VK_SUCCESS(err);
20591
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020592 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 -070020593 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020594 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20595
20596 VkImageMemoryBarrier imb = {};
20597 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20598 imb.pNext = nullptr;
20599 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20600 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20601 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20602 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20603 imb.srcQueueFamilyIndex = 0;
20604 imb.dstQueueFamilyIndex = 0;
20605 imb.image = image.handle();
20606 imb.subresourceRange.aspectMask = 0x6;
20607 imb.subresourceRange.baseMipLevel = 0;
20608 imb.subresourceRange.levelCount = 0x1;
20609 imb.subresourceRange.baseArrayLayer = 0;
20610 imb.subresourceRange.layerCount = 0x1;
20611
20612 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020613 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20614 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020615
20616 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020617 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020618 QueueCommandBuffer(false);
20619 m_errorMonitor->VerifyNotFound();
20620
20621 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20622 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20623 vkDestroyImageView(m_device->device(), view, nullptr);
20624}
20625
20626TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020627 TEST_DESCRIPTION(
20628 "Ensure that layout transitions work correctly without "
20629 "errors, when an attachment reference is "
20630 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020631
20632 m_errorMonitor->ExpectSuccess();
20633
Tony Barbour1fa09702017-03-16 12:09:08 -060020634 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020635
20636 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020637 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020638
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020639 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020640
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020641 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020642
20643 VkRenderPass rp;
20644 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20645 ASSERT_VK_SUCCESS(err);
20646
20647 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020648 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020649 VkFramebuffer fb;
20650 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20651 ASSERT_VK_SUCCESS(err);
20652
20653 // Record a command buffer which just begins and ends the renderpass. The
20654 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020655 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 -070020656 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020657 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20658 vkCmdEndRenderPass(m_commandBuffer->handle());
20659 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020660 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020661
20662 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20663 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20664}
20665
20666// This is a positive test. No errors are expected.
20667TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020668 TEST_DESCRIPTION(
20669 "Create a stencil-only attachment with a LOAD_OP set to "
20670 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020671 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020672 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020673 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020674 if (!depth_format) {
20675 printf(" No Depth + Stencil format found. Skipped.\n");
20676 return;
20677 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020678 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020679 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020680 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20681 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020682 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20683 return;
20684 }
20685
Tony Barbourf887b162017-03-09 10:06:46 -070020686 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020687 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020688 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020689 VkAttachmentDescription att = {};
20690 VkAttachmentReference ref = {};
20691 att.format = depth_stencil_fmt;
20692 att.samples = VK_SAMPLE_COUNT_1_BIT;
20693 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20694 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20695 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20696 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20697 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20698 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20699
20700 VkClearValue clear;
20701 clear.depthStencil.depth = 1.0;
20702 clear.depthStencil.stencil = 0;
20703 ref.attachment = 0;
20704 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20705
20706 VkSubpassDescription subpass = {};
20707 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20708 subpass.flags = 0;
20709 subpass.inputAttachmentCount = 0;
20710 subpass.pInputAttachments = NULL;
20711 subpass.colorAttachmentCount = 0;
20712 subpass.pColorAttachments = NULL;
20713 subpass.pResolveAttachments = NULL;
20714 subpass.pDepthStencilAttachment = &ref;
20715 subpass.preserveAttachmentCount = 0;
20716 subpass.pPreserveAttachments = NULL;
20717
20718 VkRenderPass rp;
20719 VkRenderPassCreateInfo rp_info = {};
20720 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20721 rp_info.attachmentCount = 1;
20722 rp_info.pAttachments = &att;
20723 rp_info.subpassCount = 1;
20724 rp_info.pSubpasses = &subpass;
20725 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20726 ASSERT_VK_SUCCESS(result);
20727
20728 VkImageView *depthView = m_depthStencil->BindInfo();
20729 VkFramebufferCreateInfo fb_info = {};
20730 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20731 fb_info.pNext = NULL;
20732 fb_info.renderPass = rp;
20733 fb_info.attachmentCount = 1;
20734 fb_info.pAttachments = depthView;
20735 fb_info.width = 100;
20736 fb_info.height = 100;
20737 fb_info.layers = 1;
20738 VkFramebuffer fb;
20739 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20740 ASSERT_VK_SUCCESS(result);
20741
20742 VkRenderPassBeginInfo rpbinfo = {};
20743 rpbinfo.clearValueCount = 1;
20744 rpbinfo.pClearValues = &clear;
20745 rpbinfo.pNext = NULL;
20746 rpbinfo.renderPass = rp;
20747 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20748 rpbinfo.renderArea.extent.width = 100;
20749 rpbinfo.renderArea.extent.height = 100;
20750 rpbinfo.renderArea.offset.x = 0;
20751 rpbinfo.renderArea.offset.y = 0;
20752 rpbinfo.framebuffer = fb;
20753
20754 VkFence fence = {};
20755 VkFenceCreateInfo fence_ci = {};
20756 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20757 fence_ci.pNext = nullptr;
20758 fence_ci.flags = 0;
20759 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20760 ASSERT_VK_SUCCESS(result);
20761
20762 m_commandBuffer->BeginCommandBuffer();
20763 m_commandBuffer->BeginRenderPass(rpbinfo);
20764 m_commandBuffer->EndRenderPass();
20765 m_commandBuffer->EndCommandBuffer();
20766 m_commandBuffer->QueueCommandBuffer(fence);
20767
20768 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020769 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 -070020770 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020771 VkImageMemoryBarrier barrier = {};
20772 VkImageSubresourceRange range;
20773 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20774 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20775 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20776 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20777 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20778 barrier.image = m_depthStencil->handle();
20779 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20780 range.baseMipLevel = 0;
20781 range.levelCount = 1;
20782 range.baseArrayLayer = 0;
20783 range.layerCount = 1;
20784 barrier.subresourceRange = range;
20785 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20786 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20787 cmdbuf.BeginCommandBuffer();
20788 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 -070020789 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020790 barrier.srcAccessMask = 0;
20791 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20792 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20793 barrier.image = destImage.handle();
20794 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20795 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 -070020796 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020797 VkImageCopy cregion;
20798 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20799 cregion.srcSubresource.mipLevel = 0;
20800 cregion.srcSubresource.baseArrayLayer = 0;
20801 cregion.srcSubresource.layerCount = 1;
20802 cregion.srcOffset.x = 0;
20803 cregion.srcOffset.y = 0;
20804 cregion.srcOffset.z = 0;
20805 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20806 cregion.dstSubresource.mipLevel = 0;
20807 cregion.dstSubresource.baseArrayLayer = 0;
20808 cregion.dstSubresource.layerCount = 1;
20809 cregion.dstOffset.x = 0;
20810 cregion.dstOffset.y = 0;
20811 cregion.dstOffset.z = 0;
20812 cregion.extent.width = 100;
20813 cregion.extent.height = 100;
20814 cregion.extent.depth = 1;
20815 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020816 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020817 cmdbuf.EndCommandBuffer();
20818
20819 VkSubmitInfo submit_info;
20820 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20821 submit_info.pNext = NULL;
20822 submit_info.waitSemaphoreCount = 0;
20823 submit_info.pWaitSemaphores = NULL;
20824 submit_info.pWaitDstStageMask = NULL;
20825 submit_info.commandBufferCount = 1;
20826 submit_info.pCommandBuffers = &cmdbuf.handle();
20827 submit_info.signalSemaphoreCount = 0;
20828 submit_info.pSignalSemaphores = NULL;
20829
20830 m_errorMonitor->ExpectSuccess();
20831 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20832 m_errorMonitor->VerifyNotFound();
20833
20834 vkQueueWaitIdle(m_device->m_queue);
20835 vkDestroyFence(m_device->device(), fence, nullptr);
20836 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20837 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20838}
20839
20840// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020841TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20842 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20843
20844 m_errorMonitor->ExpectSuccess();
20845
Tony Barbour1fa09702017-03-16 12:09:08 -060020846 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020847 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020848 if (!depth_format) {
20849 printf(" No Depth + Stencil format found. Skipped.\n");
20850 return;
20851 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20853
20854 VkImageMemoryBarrier img_barrier = {};
20855 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20856 img_barrier.pNext = NULL;
20857 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20858 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20859 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20860 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20861 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20862 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20863 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20864 img_barrier.subresourceRange.baseArrayLayer = 0;
20865 img_barrier.subresourceRange.baseMipLevel = 0;
20866 img_barrier.subresourceRange.layerCount = 1;
20867 img_barrier.subresourceRange.levelCount = 1;
20868
20869 {
20870 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020871 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 -070020872 ASSERT_TRUE(img_color.initialized());
20873
20874 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020875 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 -070020876 ASSERT_TRUE(img_ds1.initialized());
20877
20878 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020879 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 -070020880 ASSERT_TRUE(img_ds2.initialized());
20881
20882 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020883 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 -070020884 ASSERT_TRUE(img_xfer_src.initialized());
20885
20886 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020887 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 -070020888 ASSERT_TRUE(img_xfer_dst.initialized());
20889
20890 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020891 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 -070020892 ASSERT_TRUE(img_sampled.initialized());
20893
20894 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020895 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 -070020896 ASSERT_TRUE(img_input.initialized());
20897
20898 const struct {
20899 VkImageObj &image_obj;
20900 VkImageLayout old_layout;
20901 VkImageLayout new_layout;
20902 } buffer_layouts[] = {
20903 // clang-format off
20904 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20905 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20906 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20907 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20908 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20909 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20910 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20911 // clang-format on
20912 };
20913 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20914
20915 m_commandBuffer->BeginCommandBuffer();
20916 for (uint32_t i = 0; i < layout_count; ++i) {
20917 img_barrier.image = buffer_layouts[i].image_obj.handle();
20918 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20919 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20920 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20921 : VK_IMAGE_ASPECT_COLOR_BIT;
20922
20923 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20924 img_barrier.newLayout = buffer_layouts[i].new_layout;
20925 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20926 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20927
20928 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20929 img_barrier.newLayout = buffer_layouts[i].old_layout;
20930 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20931 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20932 }
20933 m_commandBuffer->EndCommandBuffer();
20934
20935 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20936 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20937 }
20938 m_errorMonitor->VerifyNotFound();
20939}
20940
20941// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020942TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20943 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20944
20945 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020946 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020947
20948 VkEvent event;
20949 VkEventCreateInfo event_create_info{};
20950 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20951 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20952
20953 VkCommandPool command_pool;
20954 VkCommandPoolCreateInfo pool_create_info{};
20955 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20956 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20957 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20958 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20959
20960 VkCommandBuffer command_buffer;
20961 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20962 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20963 command_buffer_allocate_info.commandPool = command_pool;
20964 command_buffer_allocate_info.commandBufferCount = 1;
20965 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20966 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20967
20968 VkQueue queue = VK_NULL_HANDLE;
20969 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20970
20971 {
20972 VkCommandBufferBeginInfo begin_info{};
20973 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20974 vkBeginCommandBuffer(command_buffer, &begin_info);
20975
20976 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 -070020977 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020978 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20979 vkEndCommandBuffer(command_buffer);
20980 }
20981 {
20982 VkSubmitInfo submit_info{};
20983 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20984 submit_info.commandBufferCount = 1;
20985 submit_info.pCommandBuffers = &command_buffer;
20986 submit_info.signalSemaphoreCount = 0;
20987 submit_info.pSignalSemaphores = nullptr;
20988 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20989 }
20990 { vkSetEvent(m_device->device(), event); }
20991
20992 vkQueueWaitIdle(queue);
20993
20994 vkDestroyEvent(m_device->device(), event, nullptr);
20995 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20996 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20997
20998 m_errorMonitor->VerifyNotFound();
20999}
21000// This is a positive test. No errors should be generated.
21001TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
21002 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
21003
Tony Barbour1fa09702017-03-16 12:09:08 -060021004 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021005 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021006
21007 m_errorMonitor->ExpectSuccess();
21008
21009 VkQueryPool query_pool;
21010 VkQueryPoolCreateInfo query_pool_create_info{};
21011 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21012 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21013 query_pool_create_info.queryCount = 1;
21014 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21015
21016 VkCommandPool command_pool;
21017 VkCommandPoolCreateInfo pool_create_info{};
21018 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21019 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21020 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21021 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21022
21023 VkCommandBuffer command_buffer;
21024 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21025 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21026 command_buffer_allocate_info.commandPool = command_pool;
21027 command_buffer_allocate_info.commandBufferCount = 1;
21028 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21029 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21030
21031 VkCommandBuffer secondary_command_buffer;
21032 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
21033 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
21034
21035 VkQueue queue = VK_NULL_HANDLE;
21036 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21037
21038 uint32_t qfi = 0;
21039 VkBufferCreateInfo buff_create_info = {};
21040 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21041 buff_create_info.size = 1024;
21042 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21043 buff_create_info.queueFamilyIndexCount = 1;
21044 buff_create_info.pQueueFamilyIndices = &qfi;
21045
21046 VkResult err;
21047 VkBuffer buffer;
21048 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21049 ASSERT_VK_SUCCESS(err);
21050 VkMemoryAllocateInfo mem_alloc = {};
21051 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21052 mem_alloc.pNext = NULL;
21053 mem_alloc.allocationSize = 1024;
21054 mem_alloc.memoryTypeIndex = 0;
21055
21056 VkMemoryRequirements memReqs;
21057 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21058 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21059 if (!pass) {
21060 vkDestroyBuffer(m_device->device(), buffer, NULL);
21061 return;
21062 }
21063
21064 VkDeviceMemory mem;
21065 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21066 ASSERT_VK_SUCCESS(err);
21067 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21068 ASSERT_VK_SUCCESS(err);
21069
21070 VkCommandBufferInheritanceInfo hinfo = {};
21071 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
21072 hinfo.renderPass = VK_NULL_HANDLE;
21073 hinfo.subpass = 0;
21074 hinfo.framebuffer = VK_NULL_HANDLE;
21075 hinfo.occlusionQueryEnable = VK_FALSE;
21076 hinfo.queryFlags = 0;
21077 hinfo.pipelineStatistics = 0;
21078
21079 {
21080 VkCommandBufferBeginInfo begin_info{};
21081 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21082 begin_info.pInheritanceInfo = &hinfo;
21083 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
21084
21085 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
21086 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21087
21088 vkEndCommandBuffer(secondary_command_buffer);
21089
21090 begin_info.pInheritanceInfo = nullptr;
21091 vkBeginCommandBuffer(command_buffer, &begin_info);
21092
21093 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
21094 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
21095
21096 vkEndCommandBuffer(command_buffer);
21097 }
21098 {
21099 VkSubmitInfo submit_info{};
21100 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21101 submit_info.commandBufferCount = 1;
21102 submit_info.pCommandBuffers = &command_buffer;
21103 submit_info.signalSemaphoreCount = 0;
21104 submit_info.pSignalSemaphores = nullptr;
21105 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21106 }
21107
21108 vkQueueWaitIdle(queue);
21109
21110 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21111 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21112 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21113 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21114 vkDestroyBuffer(m_device->device(), buffer, NULL);
21115 vkFreeMemory(m_device->device(), mem, NULL);
21116
21117 m_errorMonitor->VerifyNotFound();
21118}
21119
21120// This is a positive test. No errors should be generated.
21121TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21122 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21123
Tony Barbour1fa09702017-03-16 12:09:08 -060021124 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021125 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021126
21127 m_errorMonitor->ExpectSuccess();
21128
21129 VkQueryPool query_pool;
21130 VkQueryPoolCreateInfo query_pool_create_info{};
21131 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21132 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21133 query_pool_create_info.queryCount = 1;
21134 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21135
21136 VkCommandPool command_pool;
21137 VkCommandPoolCreateInfo pool_create_info{};
21138 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21139 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21140 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21141 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21142
21143 VkCommandBuffer command_buffer[2];
21144 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21145 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21146 command_buffer_allocate_info.commandPool = command_pool;
21147 command_buffer_allocate_info.commandBufferCount = 2;
21148 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21149 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21150
21151 VkQueue queue = VK_NULL_HANDLE;
21152 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21153
21154 uint32_t qfi = 0;
21155 VkBufferCreateInfo buff_create_info = {};
21156 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21157 buff_create_info.size = 1024;
21158 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21159 buff_create_info.queueFamilyIndexCount = 1;
21160 buff_create_info.pQueueFamilyIndices = &qfi;
21161
21162 VkResult err;
21163 VkBuffer buffer;
21164 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21165 ASSERT_VK_SUCCESS(err);
21166 VkMemoryAllocateInfo mem_alloc = {};
21167 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21168 mem_alloc.pNext = NULL;
21169 mem_alloc.allocationSize = 1024;
21170 mem_alloc.memoryTypeIndex = 0;
21171
21172 VkMemoryRequirements memReqs;
21173 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21174 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21175 if (!pass) {
21176 vkDestroyBuffer(m_device->device(), buffer, NULL);
21177 return;
21178 }
21179
21180 VkDeviceMemory mem;
21181 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21182 ASSERT_VK_SUCCESS(err);
21183 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21184 ASSERT_VK_SUCCESS(err);
21185
21186 {
21187 VkCommandBufferBeginInfo begin_info{};
21188 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21189 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21190
21191 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21192 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21193
21194 vkEndCommandBuffer(command_buffer[0]);
21195
21196 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21197
21198 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21199
21200 vkEndCommandBuffer(command_buffer[1]);
21201 }
21202 {
21203 VkSubmitInfo submit_info{};
21204 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21205 submit_info.commandBufferCount = 2;
21206 submit_info.pCommandBuffers = command_buffer;
21207 submit_info.signalSemaphoreCount = 0;
21208 submit_info.pSignalSemaphores = nullptr;
21209 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21210 }
21211
21212 vkQueueWaitIdle(queue);
21213
21214 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21215 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21216 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21217 vkDestroyBuffer(m_device->device(), buffer, NULL);
21218 vkFreeMemory(m_device->device(), mem, NULL);
21219
21220 m_errorMonitor->VerifyNotFound();
21221}
21222
Tony Barbourc46924f2016-11-04 11:49:52 -060021223TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021224 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21225
Tony Barbour1fa09702017-03-16 12:09:08 -060021226 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021227 VkEvent event;
21228 VkEventCreateInfo event_create_info{};
21229 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21230 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21231
21232 VkCommandPool command_pool;
21233 VkCommandPoolCreateInfo pool_create_info{};
21234 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21235 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21236 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21237 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21238
21239 VkCommandBuffer command_buffer;
21240 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21241 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21242 command_buffer_allocate_info.commandPool = command_pool;
21243 command_buffer_allocate_info.commandBufferCount = 1;
21244 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21245 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21246
21247 VkQueue queue = VK_NULL_HANDLE;
21248 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21249
21250 {
21251 VkCommandBufferBeginInfo begin_info{};
21252 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21253 vkBeginCommandBuffer(command_buffer, &begin_info);
21254
21255 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021256 vkEndCommandBuffer(command_buffer);
21257 }
21258 {
21259 VkSubmitInfo submit_info{};
21260 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21261 submit_info.commandBufferCount = 1;
21262 submit_info.pCommandBuffers = &command_buffer;
21263 submit_info.signalSemaphoreCount = 0;
21264 submit_info.pSignalSemaphores = nullptr;
21265 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21266 }
21267 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21269 "that is already in use by a "
21270 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021271 vkSetEvent(m_device->device(), event);
21272 m_errorMonitor->VerifyFound();
21273 }
21274
21275 vkQueueWaitIdle(queue);
21276
21277 vkDestroyEvent(m_device->device(), event, nullptr);
21278 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21279 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21280}
21281
21282// This is a positive test. No errors should be generated.
21283TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021284 TEST_DESCRIPTION(
21285 "Two command buffers with two separate fences are each "
21286 "run through a Submit & WaitForFences cycle 3 times. This "
21287 "previously revealed a bug so running this positive test "
21288 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021289 m_errorMonitor->ExpectSuccess();
21290
Tony Barbour1fa09702017-03-16 12:09:08 -060021291 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021292 VkQueue queue = VK_NULL_HANDLE;
21293 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21294
21295 static const uint32_t NUM_OBJECTS = 2;
21296 static const uint32_t NUM_FRAMES = 3;
21297 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21298 VkFence fences[NUM_OBJECTS] = {};
21299
21300 VkCommandPool cmd_pool;
21301 VkCommandPoolCreateInfo cmd_pool_ci = {};
21302 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21303 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
21304 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21305 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
21306 ASSERT_VK_SUCCESS(err);
21307
21308 VkCommandBufferAllocateInfo cmd_buf_info = {};
21309 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21310 cmd_buf_info.commandPool = cmd_pool;
21311 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21312 cmd_buf_info.commandBufferCount = 1;
21313
21314 VkFenceCreateInfo fence_ci = {};
21315 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21316 fence_ci.pNext = nullptr;
21317 fence_ci.flags = 0;
21318
21319 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21320 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21321 ASSERT_VK_SUCCESS(err);
21322 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21323 ASSERT_VK_SUCCESS(err);
21324 }
21325
21326 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21327 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21328 // Create empty cmd buffer
21329 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21330 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21331
21332 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21333 ASSERT_VK_SUCCESS(err);
21334 err = vkEndCommandBuffer(cmd_buffers[obj]);
21335 ASSERT_VK_SUCCESS(err);
21336
21337 VkSubmitInfo submit_info = {};
21338 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21339 submit_info.commandBufferCount = 1;
21340 submit_info.pCommandBuffers = &cmd_buffers[obj];
21341 // Submit cmd buffer and wait for fence
21342 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21343 ASSERT_VK_SUCCESS(err);
21344 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21345 ASSERT_VK_SUCCESS(err);
21346 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21347 ASSERT_VK_SUCCESS(err);
21348 }
21349 }
21350 m_errorMonitor->VerifyNotFound();
21351 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21352 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21353 vkDestroyFence(m_device->device(), fences[i], nullptr);
21354 }
21355}
21356// This is a positive test. No errors should be generated.
21357TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021358 TEST_DESCRIPTION(
21359 "Two command buffers, each in a separate QueueSubmit call "
21360 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021361
Tony Barbour1fa09702017-03-16 12:09:08 -060021362 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021363 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021364
21365 m_errorMonitor->ExpectSuccess();
21366
21367 VkSemaphore semaphore;
21368 VkSemaphoreCreateInfo semaphore_create_info{};
21369 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21370 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21371
21372 VkCommandPool command_pool;
21373 VkCommandPoolCreateInfo pool_create_info{};
21374 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21375 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21376 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21377 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21378
21379 VkCommandBuffer command_buffer[2];
21380 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21381 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21382 command_buffer_allocate_info.commandPool = command_pool;
21383 command_buffer_allocate_info.commandBufferCount = 2;
21384 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21385 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21386
21387 VkQueue queue = VK_NULL_HANDLE;
21388 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21389
21390 {
21391 VkCommandBufferBeginInfo begin_info{};
21392 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21393 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21394
21395 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 -070021396 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021397
21398 VkViewport viewport{};
21399 viewport.maxDepth = 1.0f;
21400 viewport.minDepth = 0.0f;
21401 viewport.width = 512;
21402 viewport.height = 512;
21403 viewport.x = 0;
21404 viewport.y = 0;
21405 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21406 vkEndCommandBuffer(command_buffer[0]);
21407 }
21408 {
21409 VkCommandBufferBeginInfo begin_info{};
21410 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21411 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21412
21413 VkViewport viewport{};
21414 viewport.maxDepth = 1.0f;
21415 viewport.minDepth = 0.0f;
21416 viewport.width = 512;
21417 viewport.height = 512;
21418 viewport.x = 0;
21419 viewport.y = 0;
21420 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21421 vkEndCommandBuffer(command_buffer[1]);
21422 }
21423 {
21424 VkSubmitInfo submit_info{};
21425 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21426 submit_info.commandBufferCount = 1;
21427 submit_info.pCommandBuffers = &command_buffer[0];
21428 submit_info.signalSemaphoreCount = 1;
21429 submit_info.pSignalSemaphores = &semaphore;
21430 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21431 }
21432 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021433 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021434 VkSubmitInfo submit_info{};
21435 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21436 submit_info.commandBufferCount = 1;
21437 submit_info.pCommandBuffers = &command_buffer[1];
21438 submit_info.waitSemaphoreCount = 1;
21439 submit_info.pWaitSemaphores = &semaphore;
21440 submit_info.pWaitDstStageMask = flags;
21441 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21442 }
21443
21444 vkQueueWaitIdle(m_device->m_queue);
21445
21446 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21447 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21448 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21449
21450 m_errorMonitor->VerifyNotFound();
21451}
21452
21453// This is a positive test. No errors should be generated.
21454TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021455 TEST_DESCRIPTION(
21456 "Two command buffers, each in a separate QueueSubmit call "
21457 "submitted on separate queues, the second having a fence"
21458 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021459
Tony Barbour1fa09702017-03-16 12:09:08 -060021460 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021461 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021462
21463 m_errorMonitor->ExpectSuccess();
21464
21465 VkFence fence;
21466 VkFenceCreateInfo fence_create_info{};
21467 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21468 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21469
21470 VkSemaphore semaphore;
21471 VkSemaphoreCreateInfo semaphore_create_info{};
21472 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21473 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21474
21475 VkCommandPool command_pool;
21476 VkCommandPoolCreateInfo pool_create_info{};
21477 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21478 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21479 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21480 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21481
21482 VkCommandBuffer command_buffer[2];
21483 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21484 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21485 command_buffer_allocate_info.commandPool = command_pool;
21486 command_buffer_allocate_info.commandBufferCount = 2;
21487 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21488 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21489
21490 VkQueue queue = VK_NULL_HANDLE;
21491 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21492
21493 {
21494 VkCommandBufferBeginInfo begin_info{};
21495 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21496 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21497
21498 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 -070021499 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021500
21501 VkViewport viewport{};
21502 viewport.maxDepth = 1.0f;
21503 viewport.minDepth = 0.0f;
21504 viewport.width = 512;
21505 viewport.height = 512;
21506 viewport.x = 0;
21507 viewport.y = 0;
21508 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21509 vkEndCommandBuffer(command_buffer[0]);
21510 }
21511 {
21512 VkCommandBufferBeginInfo begin_info{};
21513 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21514 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21515
21516 VkViewport viewport{};
21517 viewport.maxDepth = 1.0f;
21518 viewport.minDepth = 0.0f;
21519 viewport.width = 512;
21520 viewport.height = 512;
21521 viewport.x = 0;
21522 viewport.y = 0;
21523 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21524 vkEndCommandBuffer(command_buffer[1]);
21525 }
21526 {
21527 VkSubmitInfo submit_info{};
21528 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21529 submit_info.commandBufferCount = 1;
21530 submit_info.pCommandBuffers = &command_buffer[0];
21531 submit_info.signalSemaphoreCount = 1;
21532 submit_info.pSignalSemaphores = &semaphore;
21533 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21534 }
21535 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021536 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021537 VkSubmitInfo submit_info{};
21538 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21539 submit_info.commandBufferCount = 1;
21540 submit_info.pCommandBuffers = &command_buffer[1];
21541 submit_info.waitSemaphoreCount = 1;
21542 submit_info.pWaitSemaphores = &semaphore;
21543 submit_info.pWaitDstStageMask = flags;
21544 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21545 }
21546
21547 vkQueueWaitIdle(m_device->m_queue);
21548
21549 vkDestroyFence(m_device->device(), fence, nullptr);
21550 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21551 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21552 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21553
21554 m_errorMonitor->VerifyNotFound();
21555}
21556
21557// This is a positive test. No errors should be generated.
21558TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021559 TEST_DESCRIPTION(
21560 "Two command buffers, each in a separate QueueSubmit call "
21561 "submitted on separate queues, the second having a fence"
21562 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021563
Tony Barbour1fa09702017-03-16 12:09:08 -060021564 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021565 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021566
21567 m_errorMonitor->ExpectSuccess();
21568
21569 VkFence fence;
21570 VkFenceCreateInfo fence_create_info{};
21571 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21572 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21573
21574 VkSemaphore semaphore;
21575 VkSemaphoreCreateInfo semaphore_create_info{};
21576 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21577 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21578
21579 VkCommandPool command_pool;
21580 VkCommandPoolCreateInfo pool_create_info{};
21581 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21582 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21583 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21584 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21585
21586 VkCommandBuffer command_buffer[2];
21587 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21588 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21589 command_buffer_allocate_info.commandPool = command_pool;
21590 command_buffer_allocate_info.commandBufferCount = 2;
21591 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21592 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21593
21594 VkQueue queue = VK_NULL_HANDLE;
21595 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21596
21597 {
21598 VkCommandBufferBeginInfo begin_info{};
21599 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21600 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21601
21602 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 -070021603 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021604
21605 VkViewport viewport{};
21606 viewport.maxDepth = 1.0f;
21607 viewport.minDepth = 0.0f;
21608 viewport.width = 512;
21609 viewport.height = 512;
21610 viewport.x = 0;
21611 viewport.y = 0;
21612 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21613 vkEndCommandBuffer(command_buffer[0]);
21614 }
21615 {
21616 VkCommandBufferBeginInfo begin_info{};
21617 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21618 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21619
21620 VkViewport viewport{};
21621 viewport.maxDepth = 1.0f;
21622 viewport.minDepth = 0.0f;
21623 viewport.width = 512;
21624 viewport.height = 512;
21625 viewport.x = 0;
21626 viewport.y = 0;
21627 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21628 vkEndCommandBuffer(command_buffer[1]);
21629 }
21630 {
21631 VkSubmitInfo submit_info{};
21632 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21633 submit_info.commandBufferCount = 1;
21634 submit_info.pCommandBuffers = &command_buffer[0];
21635 submit_info.signalSemaphoreCount = 1;
21636 submit_info.pSignalSemaphores = &semaphore;
21637 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21638 }
21639 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021640 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021641 VkSubmitInfo submit_info{};
21642 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21643 submit_info.commandBufferCount = 1;
21644 submit_info.pCommandBuffers = &command_buffer[1];
21645 submit_info.waitSemaphoreCount = 1;
21646 submit_info.pWaitSemaphores = &semaphore;
21647 submit_info.pWaitDstStageMask = flags;
21648 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21649 }
21650
21651 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21652 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21653
21654 vkDestroyFence(m_device->device(), fence, nullptr);
21655 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21656 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21657 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21658
21659 m_errorMonitor->VerifyNotFound();
21660}
21661
21662TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021663 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021664 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021665 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021666 return;
21667 }
21668
21669 VkResult err;
21670
21671 m_errorMonitor->ExpectSuccess();
21672
21673 VkQueue q0 = m_device->m_queue;
21674 VkQueue q1 = nullptr;
21675 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21676 ASSERT_NE(q1, nullptr);
21677
21678 // An (empty) command buffer. We must have work in the first submission --
21679 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021680 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021681 VkCommandPool pool;
21682 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21683 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021684 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21685 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021686 VkCommandBuffer cb;
21687 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21688 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021689 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021690 err = vkBeginCommandBuffer(cb, &cbbi);
21691 ASSERT_VK_SUCCESS(err);
21692 err = vkEndCommandBuffer(cb);
21693 ASSERT_VK_SUCCESS(err);
21694
21695 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021696 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021697 VkSemaphore s;
21698 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21699 ASSERT_VK_SUCCESS(err);
21700
21701 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021702 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021703
21704 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21705 ASSERT_VK_SUCCESS(err);
21706
21707 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021708 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021709 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021710
21711 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21712 ASSERT_VK_SUCCESS(err);
21713
21714 // Wait for q0 idle
21715 err = vkQueueWaitIdle(q0);
21716 ASSERT_VK_SUCCESS(err);
21717
21718 // Command buffer should have been completed (it was on q0); reset the pool.
21719 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21720
21721 m_errorMonitor->VerifyNotFound();
21722
21723 // Force device completely idle and clean up resources
21724 vkDeviceWaitIdle(m_device->device());
21725 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21726 vkDestroySemaphore(m_device->device(), s, nullptr);
21727}
21728
21729// This is a positive test. No errors should be generated.
21730TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021731 TEST_DESCRIPTION(
21732 "Two command buffers, each in a separate QueueSubmit call "
21733 "submitted on separate queues, the second having a fence, "
21734 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021735
Tony Barbour1fa09702017-03-16 12:09:08 -060021736 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021737 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021738
21739 m_errorMonitor->ExpectSuccess();
21740
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021741 VkFence fence;
21742 VkFenceCreateInfo fence_create_info{};
21743 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21744 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21745
21746 VkSemaphore semaphore;
21747 VkSemaphoreCreateInfo semaphore_create_info{};
21748 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21749 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21750
21751 VkCommandPool command_pool;
21752 VkCommandPoolCreateInfo pool_create_info{};
21753 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21754 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21755 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21756 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21757
21758 VkCommandBuffer command_buffer[2];
21759 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21760 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21761 command_buffer_allocate_info.commandPool = command_pool;
21762 command_buffer_allocate_info.commandBufferCount = 2;
21763 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21764 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21765
21766 VkQueue queue = VK_NULL_HANDLE;
21767 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21768
21769 {
21770 VkCommandBufferBeginInfo begin_info{};
21771 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21772 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21773
21774 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 -070021775 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021776
21777 VkViewport viewport{};
21778 viewport.maxDepth = 1.0f;
21779 viewport.minDepth = 0.0f;
21780 viewport.width = 512;
21781 viewport.height = 512;
21782 viewport.x = 0;
21783 viewport.y = 0;
21784 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21785 vkEndCommandBuffer(command_buffer[0]);
21786 }
21787 {
21788 VkCommandBufferBeginInfo begin_info{};
21789 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21790 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21791
21792 VkViewport viewport{};
21793 viewport.maxDepth = 1.0f;
21794 viewport.minDepth = 0.0f;
21795 viewport.width = 512;
21796 viewport.height = 512;
21797 viewport.x = 0;
21798 viewport.y = 0;
21799 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21800 vkEndCommandBuffer(command_buffer[1]);
21801 }
21802 {
21803 VkSubmitInfo submit_info{};
21804 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21805 submit_info.commandBufferCount = 1;
21806 submit_info.pCommandBuffers = &command_buffer[0];
21807 submit_info.signalSemaphoreCount = 1;
21808 submit_info.pSignalSemaphores = &semaphore;
21809 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21810 }
21811 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021812 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021813 VkSubmitInfo submit_info{};
21814 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21815 submit_info.commandBufferCount = 1;
21816 submit_info.pCommandBuffers = &command_buffer[1];
21817 submit_info.waitSemaphoreCount = 1;
21818 submit_info.pWaitSemaphores = &semaphore;
21819 submit_info.pWaitDstStageMask = flags;
21820 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21821 }
21822
21823 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21824
21825 vkDestroyFence(m_device->device(), fence, nullptr);
21826 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21827 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21828 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21829
21830 m_errorMonitor->VerifyNotFound();
21831}
21832
21833// This is a positive test. No errors should be generated.
21834TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021835 TEST_DESCRIPTION(
21836 "Two command buffers, each in a separate QueueSubmit call "
21837 "on the same queue, sharing a signal/wait semaphore, the "
21838 "second having a fence, "
21839 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021840
21841 m_errorMonitor->ExpectSuccess();
21842
Tony Barbour1fa09702017-03-16 12:09:08 -060021843 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021844 VkFence fence;
21845 VkFenceCreateInfo fence_create_info{};
21846 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21847 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21848
21849 VkSemaphore semaphore;
21850 VkSemaphoreCreateInfo semaphore_create_info{};
21851 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21852 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21853
21854 VkCommandPool command_pool;
21855 VkCommandPoolCreateInfo pool_create_info{};
21856 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21857 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21858 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21859 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21860
21861 VkCommandBuffer command_buffer[2];
21862 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21863 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21864 command_buffer_allocate_info.commandPool = command_pool;
21865 command_buffer_allocate_info.commandBufferCount = 2;
21866 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21867 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21868
21869 {
21870 VkCommandBufferBeginInfo begin_info{};
21871 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21872 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21873
21874 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 -070021875 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021876
21877 VkViewport viewport{};
21878 viewport.maxDepth = 1.0f;
21879 viewport.minDepth = 0.0f;
21880 viewport.width = 512;
21881 viewport.height = 512;
21882 viewport.x = 0;
21883 viewport.y = 0;
21884 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21885 vkEndCommandBuffer(command_buffer[0]);
21886 }
21887 {
21888 VkCommandBufferBeginInfo begin_info{};
21889 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21890 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21891
21892 VkViewport viewport{};
21893 viewport.maxDepth = 1.0f;
21894 viewport.minDepth = 0.0f;
21895 viewport.width = 512;
21896 viewport.height = 512;
21897 viewport.x = 0;
21898 viewport.y = 0;
21899 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21900 vkEndCommandBuffer(command_buffer[1]);
21901 }
21902 {
21903 VkSubmitInfo submit_info{};
21904 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21905 submit_info.commandBufferCount = 1;
21906 submit_info.pCommandBuffers = &command_buffer[0];
21907 submit_info.signalSemaphoreCount = 1;
21908 submit_info.pSignalSemaphores = &semaphore;
21909 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21910 }
21911 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021912 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021913 VkSubmitInfo submit_info{};
21914 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21915 submit_info.commandBufferCount = 1;
21916 submit_info.pCommandBuffers = &command_buffer[1];
21917 submit_info.waitSemaphoreCount = 1;
21918 submit_info.pWaitSemaphores = &semaphore;
21919 submit_info.pWaitDstStageMask = flags;
21920 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21921 }
21922
21923 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21924
21925 vkDestroyFence(m_device->device(), fence, nullptr);
21926 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21927 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21928 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21929
21930 m_errorMonitor->VerifyNotFound();
21931}
21932
21933// This is a positive test. No errors should be generated.
21934TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021935 TEST_DESCRIPTION(
21936 "Two command buffers, each in a separate QueueSubmit call "
21937 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21938 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021939
21940 m_errorMonitor->ExpectSuccess();
21941
Tony Barbour1fa09702017-03-16 12:09:08 -060021942 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021943 VkFence fence;
21944 VkFenceCreateInfo fence_create_info{};
21945 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21946 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21947
21948 VkCommandPool command_pool;
21949 VkCommandPoolCreateInfo pool_create_info{};
21950 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21951 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21952 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21953 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21954
21955 VkCommandBuffer command_buffer[2];
21956 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21957 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21958 command_buffer_allocate_info.commandPool = command_pool;
21959 command_buffer_allocate_info.commandBufferCount = 2;
21960 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21961 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21962
21963 {
21964 VkCommandBufferBeginInfo begin_info{};
21965 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21966 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21967
21968 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 -070021969 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021970
21971 VkViewport viewport{};
21972 viewport.maxDepth = 1.0f;
21973 viewport.minDepth = 0.0f;
21974 viewport.width = 512;
21975 viewport.height = 512;
21976 viewport.x = 0;
21977 viewport.y = 0;
21978 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21979 vkEndCommandBuffer(command_buffer[0]);
21980 }
21981 {
21982 VkCommandBufferBeginInfo begin_info{};
21983 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21984 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21985
21986 VkViewport viewport{};
21987 viewport.maxDepth = 1.0f;
21988 viewport.minDepth = 0.0f;
21989 viewport.width = 512;
21990 viewport.height = 512;
21991 viewport.x = 0;
21992 viewport.y = 0;
21993 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21994 vkEndCommandBuffer(command_buffer[1]);
21995 }
21996 {
21997 VkSubmitInfo submit_info{};
21998 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21999 submit_info.commandBufferCount = 1;
22000 submit_info.pCommandBuffers = &command_buffer[0];
22001 submit_info.signalSemaphoreCount = 0;
22002 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22003 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22004 }
22005 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022006 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022007 VkSubmitInfo submit_info{};
22008 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22009 submit_info.commandBufferCount = 1;
22010 submit_info.pCommandBuffers = &command_buffer[1];
22011 submit_info.waitSemaphoreCount = 0;
22012 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22013 submit_info.pWaitDstStageMask = flags;
22014 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22015 }
22016
22017 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
22018
22019 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22020 ASSERT_VK_SUCCESS(err);
22021
22022 vkDestroyFence(m_device->device(), fence, nullptr);
22023 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22024 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22025
22026 m_errorMonitor->VerifyNotFound();
22027}
22028
22029// This is a positive test. No errors should be generated.
22030TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022031 TEST_DESCRIPTION(
22032 "Two command buffers, each in a separate QueueSubmit call "
22033 "on the same queue, the second having a fence, followed "
22034 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022035
22036 m_errorMonitor->ExpectSuccess();
22037
Tony Barbour1fa09702017-03-16 12:09:08 -060022038 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022039 VkFence fence;
22040 VkFenceCreateInfo fence_create_info{};
22041 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22042 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22043
22044 VkCommandPool command_pool;
22045 VkCommandPoolCreateInfo pool_create_info{};
22046 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22047 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22048 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22049 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22050
22051 VkCommandBuffer command_buffer[2];
22052 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22053 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22054 command_buffer_allocate_info.commandPool = command_pool;
22055 command_buffer_allocate_info.commandBufferCount = 2;
22056 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22057 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22058
22059 {
22060 VkCommandBufferBeginInfo begin_info{};
22061 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22062 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22063
22064 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 -070022065 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022066
22067 VkViewport viewport{};
22068 viewport.maxDepth = 1.0f;
22069 viewport.minDepth = 0.0f;
22070 viewport.width = 512;
22071 viewport.height = 512;
22072 viewport.x = 0;
22073 viewport.y = 0;
22074 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22075 vkEndCommandBuffer(command_buffer[0]);
22076 }
22077 {
22078 VkCommandBufferBeginInfo begin_info{};
22079 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22080 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22081
22082 VkViewport viewport{};
22083 viewport.maxDepth = 1.0f;
22084 viewport.minDepth = 0.0f;
22085 viewport.width = 512;
22086 viewport.height = 512;
22087 viewport.x = 0;
22088 viewport.y = 0;
22089 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22090 vkEndCommandBuffer(command_buffer[1]);
22091 }
22092 {
22093 VkSubmitInfo submit_info{};
22094 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22095 submit_info.commandBufferCount = 1;
22096 submit_info.pCommandBuffers = &command_buffer[0];
22097 submit_info.signalSemaphoreCount = 0;
22098 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22099 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22100 }
22101 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022102 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022103 VkSubmitInfo submit_info{};
22104 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22105 submit_info.commandBufferCount = 1;
22106 submit_info.pCommandBuffers = &command_buffer[1];
22107 submit_info.waitSemaphoreCount = 0;
22108 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22109 submit_info.pWaitDstStageMask = flags;
22110 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22111 }
22112
22113 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22114
22115 vkDestroyFence(m_device->device(), fence, nullptr);
22116 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22117 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22118
22119 m_errorMonitor->VerifyNotFound();
22120}
22121
22122// This is a positive test. No errors should be generated.
22123TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022124 TEST_DESCRIPTION(
22125 "Two command buffers each in a separate SubmitInfo sent in a single "
22126 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022127 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022128
22129 m_errorMonitor->ExpectSuccess();
22130
22131 VkFence fence;
22132 VkFenceCreateInfo fence_create_info{};
22133 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22134 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22135
22136 VkSemaphore semaphore;
22137 VkSemaphoreCreateInfo semaphore_create_info{};
22138 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22139 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22140
22141 VkCommandPool command_pool;
22142 VkCommandPoolCreateInfo pool_create_info{};
22143 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22144 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22145 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22146 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22147
22148 VkCommandBuffer command_buffer[2];
22149 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22150 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22151 command_buffer_allocate_info.commandPool = command_pool;
22152 command_buffer_allocate_info.commandBufferCount = 2;
22153 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22154 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22155
22156 {
22157 VkCommandBufferBeginInfo begin_info{};
22158 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22159 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22160
22161 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 -070022162 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022163
22164 VkViewport viewport{};
22165 viewport.maxDepth = 1.0f;
22166 viewport.minDepth = 0.0f;
22167 viewport.width = 512;
22168 viewport.height = 512;
22169 viewport.x = 0;
22170 viewport.y = 0;
22171 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22172 vkEndCommandBuffer(command_buffer[0]);
22173 }
22174 {
22175 VkCommandBufferBeginInfo begin_info{};
22176 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22177 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22178
22179 VkViewport viewport{};
22180 viewport.maxDepth = 1.0f;
22181 viewport.minDepth = 0.0f;
22182 viewport.width = 512;
22183 viewport.height = 512;
22184 viewport.x = 0;
22185 viewport.y = 0;
22186 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22187 vkEndCommandBuffer(command_buffer[1]);
22188 }
22189 {
22190 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022191 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022192
22193 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22194 submit_info[0].pNext = NULL;
22195 submit_info[0].commandBufferCount = 1;
22196 submit_info[0].pCommandBuffers = &command_buffer[0];
22197 submit_info[0].signalSemaphoreCount = 1;
22198 submit_info[0].pSignalSemaphores = &semaphore;
22199 submit_info[0].waitSemaphoreCount = 0;
22200 submit_info[0].pWaitSemaphores = NULL;
22201 submit_info[0].pWaitDstStageMask = 0;
22202
22203 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22204 submit_info[1].pNext = NULL;
22205 submit_info[1].commandBufferCount = 1;
22206 submit_info[1].pCommandBuffers = &command_buffer[1];
22207 submit_info[1].waitSemaphoreCount = 1;
22208 submit_info[1].pWaitSemaphores = &semaphore;
22209 submit_info[1].pWaitDstStageMask = flags;
22210 submit_info[1].signalSemaphoreCount = 0;
22211 submit_info[1].pSignalSemaphores = NULL;
22212 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22213 }
22214
22215 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22216
22217 vkDestroyFence(m_device->device(), fence, nullptr);
22218 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22219 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22220 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22221
22222 m_errorMonitor->VerifyNotFound();
22223}
22224
22225TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22226 m_errorMonitor->ExpectSuccess();
22227
Tony Barbour1fa09702017-03-16 12:09:08 -060022228 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022229 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22230
Tony Barbour552f6c02016-12-21 14:34:07 -070022231 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022232
22233 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22234 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22235 m_errorMonitor->VerifyNotFound();
22236 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22237 m_errorMonitor->VerifyNotFound();
22238 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22239 m_errorMonitor->VerifyNotFound();
22240
22241 m_commandBuffer->EndCommandBuffer();
22242 m_errorMonitor->VerifyNotFound();
22243}
22244
22245TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022246 TEST_DESCRIPTION(
22247 "Positive test where we create a renderpass with an "
22248 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22249 "has a valid layout, and a second subpass then uses a "
22250 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022251 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022252 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022253 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022254 if (!depth_format) {
22255 printf(" No Depth + Stencil format found. Skipped.\n");
22256 return;
22257 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022258
22259 VkAttachmentReference attach[2] = {};
22260 attach[0].attachment = 0;
22261 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22262 attach[1].attachment = 0;
22263 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22264 VkSubpassDescription subpasses[2] = {};
22265 // First subpass clears DS attach on load
22266 subpasses[0].pDepthStencilAttachment = &attach[0];
22267 // 2nd subpass reads in DS as input attachment
22268 subpasses[1].inputAttachmentCount = 1;
22269 subpasses[1].pInputAttachments = &attach[1];
22270 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022271 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022272 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22273 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22274 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22275 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22276 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22277 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22278 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22279 VkRenderPassCreateInfo rpci = {};
22280 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22281 rpci.attachmentCount = 1;
22282 rpci.pAttachments = &attach_desc;
22283 rpci.subpassCount = 2;
22284 rpci.pSubpasses = subpasses;
22285
22286 // Now create RenderPass and verify no errors
22287 VkRenderPass rp;
22288 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22289 m_errorMonitor->VerifyNotFound();
22290
22291 vkDestroyRenderPass(m_device->device(), rp, NULL);
22292}
22293
Tobin Ehlis01103de2017-02-16 13:22:47 -070022294TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22295 TEST_DESCRIPTION(
22296 "Create a render pass with depth-stencil attachment where layout transition "
22297 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22298 "transition has correctly occurred at queue submit time with no validation errors.");
22299
Tony Barbour1fa09702017-03-16 12:09:08 -060022300 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022301 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022302 if (!depth_format) {
22303 printf(" No Depth + Stencil format found. Skipped.\n");
22304 return;
22305 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070022306 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070022307 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022308 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22309 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022310 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022311 return;
22312 }
22313
22314 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22316
22317 // A renderpass with one depth/stencil attachment.
22318 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022319 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022320 VK_SAMPLE_COUNT_1_BIT,
22321 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22322 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22323 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22324 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22325 VK_IMAGE_LAYOUT_UNDEFINED,
22326 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22327
22328 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22329
22330 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22331
22332 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22333
22334 VkRenderPass rp;
22335 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22336 ASSERT_VK_SUCCESS(err);
22337 // A compatible ds image.
22338 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022339 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 -070022340 ASSERT_TRUE(image.initialized());
22341
22342 VkImageViewCreateInfo ivci = {
22343 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22344 nullptr,
22345 0,
22346 image.handle(),
22347 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022348 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022349 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22350 VK_COMPONENT_SWIZZLE_IDENTITY},
22351 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22352 };
22353 VkImageView view;
22354 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22355 ASSERT_VK_SUCCESS(err);
22356
22357 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22358 VkFramebuffer fb;
22359 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22360 ASSERT_VK_SUCCESS(err);
22361
22362 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22363 m_commandBuffer->BeginCommandBuffer();
22364 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22365 vkCmdEndRenderPass(m_commandBuffer->handle());
22366 m_commandBuffer->EndCommandBuffer();
22367 QueueCommandBuffer(false);
22368 m_errorMonitor->VerifyNotFound();
22369
22370 // Cleanup
22371 vkDestroyImageView(m_device->device(), view, NULL);
22372 vkDestroyRenderPass(m_device->device(), rp, NULL);
22373 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22374}
22375
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022376TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022377 TEST_DESCRIPTION(
22378 "Test that pipeline validation accepts matrices passed "
22379 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022380 m_errorMonitor->ExpectSuccess();
22381
Tony Barbour1fa09702017-03-16 12:09:08 -060022382 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22384
22385 VkVertexInputBindingDescription input_binding;
22386 memset(&input_binding, 0, sizeof(input_binding));
22387
22388 VkVertexInputAttributeDescription input_attribs[2];
22389 memset(input_attribs, 0, sizeof(input_attribs));
22390
22391 for (int i = 0; i < 2; i++) {
22392 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22393 input_attribs[i].location = i;
22394 }
22395
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022396 char const *vsSource =
22397 "#version 450\n"
22398 "\n"
22399 "layout(location=0) in mat2x4 x;\n"
22400 "out gl_PerVertex {\n"
22401 " vec4 gl_Position;\n"
22402 "};\n"
22403 "void main(){\n"
22404 " gl_Position = x[0] + x[1];\n"
22405 "}\n";
22406 char const *fsSource =
22407 "#version 450\n"
22408 "\n"
22409 "layout(location=0) out vec4 color;\n"
22410 "void main(){\n"
22411 " color = vec4(1);\n"
22412 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022413
22414 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22415 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22416
22417 VkPipelineObj pipe(m_device);
22418 pipe.AddColorAttachment();
22419 pipe.AddShader(&vs);
22420 pipe.AddShader(&fs);
22421
22422 pipe.AddVertexInputBindings(&input_binding, 1);
22423 pipe.AddVertexInputAttribs(input_attribs, 2);
22424
22425 VkDescriptorSetObj descriptorSet(m_device);
22426 descriptorSet.AppendDummy();
22427 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22428
22429 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22430
22431 /* expect success */
22432 m_errorMonitor->VerifyNotFound();
22433}
22434
22435TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22436 m_errorMonitor->ExpectSuccess();
22437
Tony Barbour1fa09702017-03-16 12:09:08 -060022438 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22440
22441 VkVertexInputBindingDescription input_binding;
22442 memset(&input_binding, 0, sizeof(input_binding));
22443
22444 VkVertexInputAttributeDescription input_attribs[2];
22445 memset(input_attribs, 0, sizeof(input_attribs));
22446
22447 for (int i = 0; i < 2; i++) {
22448 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22449 input_attribs[i].location = i;
22450 }
22451
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022452 char const *vsSource =
22453 "#version 450\n"
22454 "\n"
22455 "layout(location=0) in vec4 x[2];\n"
22456 "out gl_PerVertex {\n"
22457 " vec4 gl_Position;\n"
22458 "};\n"
22459 "void main(){\n"
22460 " gl_Position = x[0] + x[1];\n"
22461 "}\n";
22462 char const *fsSource =
22463 "#version 450\n"
22464 "\n"
22465 "layout(location=0) out vec4 color;\n"
22466 "void main(){\n"
22467 " color = vec4(1);\n"
22468 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022469
22470 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22471 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22472
22473 VkPipelineObj pipe(m_device);
22474 pipe.AddColorAttachment();
22475 pipe.AddShader(&vs);
22476 pipe.AddShader(&fs);
22477
22478 pipe.AddVertexInputBindings(&input_binding, 1);
22479 pipe.AddVertexInputAttribs(input_attribs, 2);
22480
22481 VkDescriptorSetObj descriptorSet(m_device);
22482 descriptorSet.AppendDummy();
22483 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22484
22485 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22486
22487 m_errorMonitor->VerifyNotFound();
22488}
22489
22490TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022491 TEST_DESCRIPTION(
22492 "Test that pipeline validation accepts consuming a vertex attribute "
22493 "through multiple vertex shader inputs, each consuming a different "
22494 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022495 m_errorMonitor->ExpectSuccess();
22496
Tony Barbour1fa09702017-03-16 12:09:08 -060022497 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022498 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22499
22500 VkVertexInputBindingDescription input_binding;
22501 memset(&input_binding, 0, sizeof(input_binding));
22502
22503 VkVertexInputAttributeDescription input_attribs[3];
22504 memset(input_attribs, 0, sizeof(input_attribs));
22505
22506 for (int i = 0; i < 3; i++) {
22507 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22508 input_attribs[i].location = i;
22509 }
22510
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022511 char const *vsSource =
22512 "#version 450\n"
22513 "\n"
22514 "layout(location=0) in vec4 x;\n"
22515 "layout(location=1) in vec3 y1;\n"
22516 "layout(location=1, component=3) in float y2;\n"
22517 "layout(location=2) in vec4 z;\n"
22518 "out gl_PerVertex {\n"
22519 " vec4 gl_Position;\n"
22520 "};\n"
22521 "void main(){\n"
22522 " gl_Position = x + vec4(y1, y2) + z;\n"
22523 "}\n";
22524 char const *fsSource =
22525 "#version 450\n"
22526 "\n"
22527 "layout(location=0) out vec4 color;\n"
22528 "void main(){\n"
22529 " color = vec4(1);\n"
22530 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022531
22532 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22533 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22534
22535 VkPipelineObj pipe(m_device);
22536 pipe.AddColorAttachment();
22537 pipe.AddShader(&vs);
22538 pipe.AddShader(&fs);
22539
22540 pipe.AddVertexInputBindings(&input_binding, 1);
22541 pipe.AddVertexInputAttribs(input_attribs, 3);
22542
22543 VkDescriptorSetObj descriptorSet(m_device);
22544 descriptorSet.AppendDummy();
22545 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22546
22547 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22548
22549 m_errorMonitor->VerifyNotFound();
22550}
22551
22552TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22553 m_errorMonitor->ExpectSuccess();
22554
Tony Barbour1fa09702017-03-16 12:09:08 -060022555 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022556 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22557
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022558 char const *vsSource =
22559 "#version 450\n"
22560 "out gl_PerVertex {\n"
22561 " vec4 gl_Position;\n"
22562 "};\n"
22563 "void main(){\n"
22564 " gl_Position = vec4(0);\n"
22565 "}\n";
22566 char const *fsSource =
22567 "#version 450\n"
22568 "\n"
22569 "layout(location=0) out vec4 color;\n"
22570 "void main(){\n"
22571 " color = vec4(1);\n"
22572 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022573
22574 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22575 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22576
22577 VkPipelineObj pipe(m_device);
22578 pipe.AddColorAttachment();
22579 pipe.AddShader(&vs);
22580 pipe.AddShader(&fs);
22581
22582 VkDescriptorSetObj descriptorSet(m_device);
22583 descriptorSet.AppendDummy();
22584 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22585
22586 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22587
22588 m_errorMonitor->VerifyNotFound();
22589}
22590
22591TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022592 TEST_DESCRIPTION(
22593 "Test that pipeline validation accepts the relaxed type matching rules "
22594 "set out in 14.1.3: fundamental type must match, and producer side must "
22595 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022596 m_errorMonitor->ExpectSuccess();
22597
22598 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22599
Tony Barbour1fa09702017-03-16 12:09:08 -060022600 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022601 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22602
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022603 char const *vsSource =
22604 "#version 450\n"
22605 "out gl_PerVertex {\n"
22606 " vec4 gl_Position;\n"
22607 "};\n"
22608 "layout(location=0) out vec3 x;\n"
22609 "layout(location=1) out ivec3 y;\n"
22610 "layout(location=2) out vec3 z;\n"
22611 "void main(){\n"
22612 " gl_Position = vec4(0);\n"
22613 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22614 "}\n";
22615 char const *fsSource =
22616 "#version 450\n"
22617 "\n"
22618 "layout(location=0) out vec4 color;\n"
22619 "layout(location=0) in float x;\n"
22620 "layout(location=1) flat in int y;\n"
22621 "layout(location=2) in vec2 z;\n"
22622 "void main(){\n"
22623 " color = vec4(1 + x + y + z.x);\n"
22624 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022625
22626 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22627 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22628
22629 VkPipelineObj pipe(m_device);
22630 pipe.AddColorAttachment();
22631 pipe.AddShader(&vs);
22632 pipe.AddShader(&fs);
22633
22634 VkDescriptorSetObj descriptorSet(m_device);
22635 descriptorSet.AppendDummy();
22636 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22637
22638 VkResult err = VK_SUCCESS;
22639 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22640 ASSERT_VK_SUCCESS(err);
22641
22642 m_errorMonitor->VerifyNotFound();
22643}
22644
22645TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022646 TEST_DESCRIPTION(
22647 "Test that pipeline validation accepts per-vertex variables "
22648 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022649 m_errorMonitor->ExpectSuccess();
22650
Tony Barbour1fa09702017-03-16 12:09:08 -060022651 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022652 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22653
22654 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022655 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022656 return;
22657 }
22658
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022659 char const *vsSource =
22660 "#version 450\n"
22661 "void main(){}\n";
22662 char const *tcsSource =
22663 "#version 450\n"
22664 "layout(location=0) out int x[];\n"
22665 "layout(vertices=3) out;\n"
22666 "void main(){\n"
22667 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22668 " gl_TessLevelInner[0] = 1;\n"
22669 " x[gl_InvocationID] = gl_InvocationID;\n"
22670 "}\n";
22671 char const *tesSource =
22672 "#version 450\n"
22673 "layout(triangles, equal_spacing, cw) in;\n"
22674 "layout(location=0) in int x[];\n"
22675 "out gl_PerVertex { vec4 gl_Position; };\n"
22676 "void main(){\n"
22677 " gl_Position.xyz = gl_TessCoord;\n"
22678 " gl_Position.w = x[0] + x[1] + x[2];\n"
22679 "}\n";
22680 char const *fsSource =
22681 "#version 450\n"
22682 "layout(location=0) out vec4 color;\n"
22683 "void main(){\n"
22684 " color = vec4(1);\n"
22685 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022686
22687 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22688 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22689 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22690 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22691
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022692 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22693 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022694
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022695 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022696
22697 VkPipelineObj pipe(m_device);
22698 pipe.SetInputAssembly(&iasci);
22699 pipe.SetTessellation(&tsci);
22700 pipe.AddColorAttachment();
22701 pipe.AddShader(&vs);
22702 pipe.AddShader(&tcs);
22703 pipe.AddShader(&tes);
22704 pipe.AddShader(&fs);
22705
22706 VkDescriptorSetObj descriptorSet(m_device);
22707 descriptorSet.AppendDummy();
22708 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22709
22710 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22711
22712 m_errorMonitor->VerifyNotFound();
22713}
22714
22715TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022716 TEST_DESCRIPTION(
22717 "Test that pipeline validation accepts a user-defined "
22718 "interface block passed into the geometry shader. This "
22719 "is interesting because the 'extra' array level is not "
22720 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022721 m_errorMonitor->ExpectSuccess();
22722
Tony Barbour1fa09702017-03-16 12:09:08 -060022723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22725
22726 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022727 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022728 return;
22729 }
22730
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022731 char const *vsSource =
22732 "#version 450\n"
22733 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22734 "void main(){\n"
22735 " vs_out.x = vec4(1);\n"
22736 "}\n";
22737 char const *gsSource =
22738 "#version 450\n"
22739 "layout(triangles) in;\n"
22740 "layout(triangle_strip, max_vertices=3) out;\n"
22741 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22742 "out gl_PerVertex { vec4 gl_Position; };\n"
22743 "void main() {\n"
22744 " gl_Position = gs_in[0].x;\n"
22745 " EmitVertex();\n"
22746 "}\n";
22747 char const *fsSource =
22748 "#version 450\n"
22749 "layout(location=0) out vec4 color;\n"
22750 "void main(){\n"
22751 " color = vec4(1);\n"
22752 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022753
22754 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22755 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22756 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22757
22758 VkPipelineObj pipe(m_device);
22759 pipe.AddColorAttachment();
22760 pipe.AddShader(&vs);
22761 pipe.AddShader(&gs);
22762 pipe.AddShader(&fs);
22763
22764 VkDescriptorSetObj descriptorSet(m_device);
22765 descriptorSet.AppendDummy();
22766 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22767
22768 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22769
22770 m_errorMonitor->VerifyNotFound();
22771}
22772
22773TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022774 TEST_DESCRIPTION(
22775 "Test that pipeline validation accepts basic use of 64bit vertex "
22776 "attributes. This is interesting because they consume multiple "
22777 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022778 m_errorMonitor->ExpectSuccess();
22779
Tony Barbour1fa09702017-03-16 12:09:08 -060022780 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022781 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22782
22783 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022784 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022785 return;
22786 }
22787
22788 VkVertexInputBindingDescription input_bindings[1];
22789 memset(input_bindings, 0, sizeof(input_bindings));
22790
22791 VkVertexInputAttributeDescription input_attribs[4];
22792 memset(input_attribs, 0, sizeof(input_attribs));
22793 input_attribs[0].location = 0;
22794 input_attribs[0].offset = 0;
22795 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22796 input_attribs[1].location = 2;
22797 input_attribs[1].offset = 32;
22798 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22799 input_attribs[2].location = 4;
22800 input_attribs[2].offset = 64;
22801 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22802 input_attribs[3].location = 6;
22803 input_attribs[3].offset = 96;
22804 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22805
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022806 char const *vsSource =
22807 "#version 450\n"
22808 "\n"
22809 "layout(location=0) in dmat4 x;\n"
22810 "out gl_PerVertex {\n"
22811 " vec4 gl_Position;\n"
22812 "};\n"
22813 "void main(){\n"
22814 " gl_Position = vec4(x[0][0]);\n"
22815 "}\n";
22816 char const *fsSource =
22817 "#version 450\n"
22818 "\n"
22819 "layout(location=0) out vec4 color;\n"
22820 "void main(){\n"
22821 " color = vec4(1);\n"
22822 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022823
22824 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22825 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22826
22827 VkPipelineObj pipe(m_device);
22828 pipe.AddColorAttachment();
22829 pipe.AddShader(&vs);
22830 pipe.AddShader(&fs);
22831
22832 pipe.AddVertexInputBindings(input_bindings, 1);
22833 pipe.AddVertexInputAttribs(input_attribs, 4);
22834
22835 VkDescriptorSetObj descriptorSet(m_device);
22836 descriptorSet.AppendDummy();
22837 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22838
22839 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22840
22841 m_errorMonitor->VerifyNotFound();
22842}
22843
22844TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22845 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22846 m_errorMonitor->ExpectSuccess();
22847
Tony Barbour1fa09702017-03-16 12:09:08 -060022848 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022849
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022850 char const *vsSource =
22851 "#version 450\n"
22852 "\n"
22853 "out gl_PerVertex {\n"
22854 " vec4 gl_Position;\n"
22855 "};\n"
22856 "void main(){\n"
22857 " gl_Position = vec4(1);\n"
22858 "}\n";
22859 char const *fsSource =
22860 "#version 450\n"
22861 "\n"
22862 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22863 "layout(location=0) out vec4 color;\n"
22864 "void main() {\n"
22865 " color = subpassLoad(x);\n"
22866 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022867
22868 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22869 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22870
22871 VkPipelineObj pipe(m_device);
22872 pipe.AddShader(&vs);
22873 pipe.AddShader(&fs);
22874 pipe.AddColorAttachment();
22875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22876
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022877 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22878 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022879 VkDescriptorSetLayout dsl;
22880 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22881 ASSERT_VK_SUCCESS(err);
22882
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022883 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022884 VkPipelineLayout pl;
22885 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22886 ASSERT_VK_SUCCESS(err);
22887
22888 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022889 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22890 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22891 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22892 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22893 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 -060022894 };
22895 VkAttachmentReference color = {
22896 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22897 };
22898 VkAttachmentReference input = {
22899 1, VK_IMAGE_LAYOUT_GENERAL,
22900 };
22901
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022902 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022903
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022904 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022905 VkRenderPass rp;
22906 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22907 ASSERT_VK_SUCCESS(err);
22908
22909 // should be OK. would go wrong here if it's going to...
22910 pipe.CreateVKPipeline(pl, rp);
22911
22912 m_errorMonitor->VerifyNotFound();
22913
22914 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22915 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22916 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22917}
22918
22919TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022920 TEST_DESCRIPTION(
22921 "Test that pipeline validation accepts a compute pipeline which declares a "
22922 "descriptor-backed resource which is not provided, but the shader does not "
22923 "statically use it. This is interesting because it requires compute pipelines "
22924 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022925 m_errorMonitor->ExpectSuccess();
22926
Tony Barbour1fa09702017-03-16 12:09:08 -060022927 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022928
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022929 char const *csSource =
22930 "#version 450\n"
22931 "\n"
22932 "layout(local_size_x=1) in;\n"
22933 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22934 "void main(){\n"
22935 " // x is not used.\n"
22936 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022937
22938 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22939
22940 VkDescriptorSetObj descriptorSet(m_device);
22941 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22942
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022943 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22944 nullptr,
22945 0,
22946 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22947 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22948 descriptorSet.GetPipelineLayout(),
22949 VK_NULL_HANDLE,
22950 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022951
22952 VkPipeline pipe;
22953 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22954
22955 m_errorMonitor->VerifyNotFound();
22956
22957 if (err == VK_SUCCESS) {
22958 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22959 }
22960}
22961
22962TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022963 TEST_DESCRIPTION(
22964 "Test that pipeline validation accepts a shader consuming only the "
22965 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022966 m_errorMonitor->ExpectSuccess();
22967
Tony Barbour1fa09702017-03-16 12:09:08 -060022968 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022969
22970 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022971 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22972 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22973 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022974 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022975 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022976 VkDescriptorSetLayout dsl;
22977 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22978 ASSERT_VK_SUCCESS(err);
22979
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022980 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022981 VkPipelineLayout pl;
22982 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22983 ASSERT_VK_SUCCESS(err);
22984
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022985 char const *csSource =
22986 "#version 450\n"
22987 "\n"
22988 "layout(local_size_x=1) in;\n"
22989 "layout(set=0, binding=0) uniform sampler s;\n"
22990 "layout(set=0, binding=1) uniform texture2D t;\n"
22991 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22992 "void main() {\n"
22993 " x = texture(sampler2D(t, s), vec2(0));\n"
22994 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022995 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22996
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022997 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22998 nullptr,
22999 0,
23000 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23001 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23002 pl,
23003 VK_NULL_HANDLE,
23004 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023005
23006 VkPipeline pipe;
23007 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23008
23009 m_errorMonitor->VerifyNotFound();
23010
23011 if (err == VK_SUCCESS) {
23012 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23013 }
23014
23015 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23016 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23017}
23018
23019TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023020 TEST_DESCRIPTION(
23021 "Test that pipeline validation accepts a shader consuming only the "
23022 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023023 m_errorMonitor->ExpectSuccess();
23024
Tony Barbour1fa09702017-03-16 12:09:08 -060023025 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023026
23027 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023028 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23029 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23030 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023031 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023032 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023033 VkDescriptorSetLayout dsl;
23034 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23035 ASSERT_VK_SUCCESS(err);
23036
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023037 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023038 VkPipelineLayout pl;
23039 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23040 ASSERT_VK_SUCCESS(err);
23041
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023042 char const *csSource =
23043 "#version 450\n"
23044 "\n"
23045 "layout(local_size_x=1) in;\n"
23046 "layout(set=0, binding=0) uniform texture2D t;\n"
23047 "layout(set=0, binding=1) uniform sampler s;\n"
23048 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
23049 "void main() {\n"
23050 " x = texture(sampler2D(t, s), vec2(0));\n"
23051 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023052 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23053
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023054 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23055 nullptr,
23056 0,
23057 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23058 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23059 pl,
23060 VK_NULL_HANDLE,
23061 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023062
23063 VkPipeline pipe;
23064 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23065
23066 m_errorMonitor->VerifyNotFound();
23067
23068 if (err == VK_SUCCESS) {
23069 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23070 }
23071
23072 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23073 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23074}
23075
23076TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023077 TEST_DESCRIPTION(
23078 "Test that pipeline validation accepts a shader consuming "
23079 "both the sampler and the image of a combined image+sampler "
23080 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023081 m_errorMonitor->ExpectSuccess();
23082
Tony Barbour1fa09702017-03-16 12:09:08 -060023083 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023084
23085 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023086 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
23087 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023088 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023089 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023090 VkDescriptorSetLayout dsl;
23091 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
23092 ASSERT_VK_SUCCESS(err);
23093
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023094 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023095 VkPipelineLayout pl;
23096 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23097 ASSERT_VK_SUCCESS(err);
23098
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023099 char const *csSource =
23100 "#version 450\n"
23101 "\n"
23102 "layout(local_size_x=1) in;\n"
23103 "layout(set=0, binding=0) uniform texture2D t;\n"
23104 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23105 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23106 "void main() {\n"
23107 " x = texture(sampler2D(t, s), vec2(0));\n"
23108 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023109 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23110
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023111 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23112 nullptr,
23113 0,
23114 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23115 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23116 pl,
23117 VK_NULL_HANDLE,
23118 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023119
23120 VkPipeline pipe;
23121 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23122
23123 m_errorMonitor->VerifyNotFound();
23124
23125 if (err == VK_SUCCESS) {
23126 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23127 }
23128
23129 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23130 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23131}
23132
Tony Barbour3ed87a02017-03-15 16:19:02 -060023133TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023134 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23135
Tony Barbour3ed87a02017-03-15 16:19:02 -060023136 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023137 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023138
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023139 // Ensure that extension is available and enabled.
23140 uint32_t extension_count = 0;
23141 bool supports_maintenance1_extension = false;
23142 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23143 ASSERT_VK_SUCCESS(err);
23144 if (extension_count > 0) {
23145 std::vector<VkExtensionProperties> available_extensions(extension_count);
23146
23147 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23148 ASSERT_VK_SUCCESS(err);
23149 for (const auto &extension_props : available_extensions) {
23150 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23151 supports_maintenance1_extension = true;
23152 }
23153 }
23154 }
23155
23156 // Proceed if extension is supported by hardware
23157 if (!supports_maintenance1_extension) {
23158 printf(" Maintenance1 Extension not supported, skipping tests\n");
23159 return;
23160 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023161
23162 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023163 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023164 VkCommandBuffer cmd_buf;
23165 VkCommandBufferAllocateInfo alloc_info;
23166 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23167 alloc_info.pNext = NULL;
23168 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023169 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023170 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23171 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23172
23173 VkCommandBufferBeginInfo cb_binfo;
23174 cb_binfo.pNext = NULL;
23175 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23176 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23177 cb_binfo.flags = 0;
23178 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23179 // Set Negative height, should give error if Maintenance 1 is not enabled
23180 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23181 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23182 vkEndCommandBuffer(cmd_buf);
23183
23184 m_errorMonitor->VerifyNotFound();
23185}
23186
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023187TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23188 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23189
23190 ASSERT_NO_FATAL_FAILURE(Init());
23191
23192 uint32_t extension_count = 0;
23193 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23194 ASSERT_VK_SUCCESS(err);
23195
23196 if (extension_count > 0) {
23197 std::vector<VkExtensionProperties> available_extensions(extension_count);
23198 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23199 ASSERT_VK_SUCCESS(err);
23200
23201 for (const auto &extension_props : available_extensions) {
23202 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23203 // Create two pNext structures which by themselves would be valid
23204 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23205 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23206 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23207 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23208 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23209
23210 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23211 dedicated_buffer_create_info_2.pNext = nullptr;
23212 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23213
23214 uint32_t queue_family_index = 0;
23215 VkBufferCreateInfo buffer_create_info = {};
23216 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23217 buffer_create_info.pNext = &dedicated_buffer_create_info;
23218 buffer_create_info.size = 1024;
23219 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23220 buffer_create_info.queueFamilyIndexCount = 1;
23221 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23222
23223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23224 VkBuffer buffer;
23225 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23226 m_errorMonitor->VerifyFound();
23227 }
23228 }
23229 }
23230}
23231
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023232TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23233 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23234
Tony Barbour1fa09702017-03-16 12:09:08 -060023235 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023236
23237 // Positive test to check parameter_validation and unique_objects support
23238 // for NV_dedicated_allocation
23239 uint32_t extension_count = 0;
23240 bool supports_nv_dedicated_allocation = false;
23241 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23242 ASSERT_VK_SUCCESS(err);
23243
23244 if (extension_count > 0) {
23245 std::vector<VkExtensionProperties> available_extensions(extension_count);
23246
23247 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23248 ASSERT_VK_SUCCESS(err);
23249
23250 for (const auto &extension_props : available_extensions) {
23251 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23252 supports_nv_dedicated_allocation = true;
23253 }
23254 }
23255 }
23256
23257 if (supports_nv_dedicated_allocation) {
23258 m_errorMonitor->ExpectSuccess();
23259
23260 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23261 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23262 dedicated_buffer_create_info.pNext = nullptr;
23263 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23264
23265 uint32_t queue_family_index = 0;
23266 VkBufferCreateInfo buffer_create_info = {};
23267 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23268 buffer_create_info.pNext = &dedicated_buffer_create_info;
23269 buffer_create_info.size = 1024;
23270 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23271 buffer_create_info.queueFamilyIndexCount = 1;
23272 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23273
23274 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023275 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023276 ASSERT_VK_SUCCESS(err);
23277
23278 VkMemoryRequirements memory_reqs;
23279 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23280
23281 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23282 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23283 dedicated_memory_info.pNext = nullptr;
23284 dedicated_memory_info.buffer = buffer;
23285 dedicated_memory_info.image = VK_NULL_HANDLE;
23286
23287 VkMemoryAllocateInfo memory_info = {};
23288 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23289 memory_info.pNext = &dedicated_memory_info;
23290 memory_info.allocationSize = memory_reqs.size;
23291
23292 bool pass;
23293 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23294 ASSERT_TRUE(pass);
23295
23296 VkDeviceMemory buffer_memory;
23297 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23298 ASSERT_VK_SUCCESS(err);
23299
23300 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
23301 ASSERT_VK_SUCCESS(err);
23302
23303 vkDestroyBuffer(m_device->device(), buffer, NULL);
23304 vkFreeMemory(m_device->device(), buffer_memory, NULL);
23305
23306 m_errorMonitor->VerifyNotFound();
23307 }
23308}
23309
23310TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23311 VkResult err;
23312
23313 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23314
Tony Barbour1fa09702017-03-16 12:09:08 -060023315 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023316 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23317
23318 std::vector<const char *> device_extension_names;
23319 auto features = m_device->phy().features();
23320 // Artificially disable support for non-solid fill modes
23321 features.fillModeNonSolid = false;
23322 // The sacrificial device object
23323 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23324
23325 VkRenderpassObj render_pass(&test_device);
23326
23327 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23328 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23329 pipeline_layout_ci.setLayoutCount = 0;
23330 pipeline_layout_ci.pSetLayouts = NULL;
23331
23332 VkPipelineLayout pipeline_layout;
23333 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23334 ASSERT_VK_SUCCESS(err);
23335
23336 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23337 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23338 rs_ci.pNext = nullptr;
23339 rs_ci.lineWidth = 1.0f;
23340 rs_ci.rasterizerDiscardEnable = true;
23341
23342 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23343 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23344
23345 // Set polygonMode=FILL. No error is expected
23346 m_errorMonitor->ExpectSuccess();
23347 {
23348 VkPipelineObj pipe(&test_device);
23349 pipe.AddShader(&vs);
23350 pipe.AddShader(&fs);
23351 pipe.AddColorAttachment();
23352 // Set polygonMode to a good value
23353 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23354 pipe.SetRasterization(&rs_ci);
23355 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23356 }
23357 m_errorMonitor->VerifyNotFound();
23358
23359 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23360}
23361
Dave Houlton1150cf52017-04-27 14:38:11 -060023362TEST_F(VkPositiveLayerTest, LongSemaphoreChain) {
Chris Forbes94196952017-04-06 16:30:59 -070023363 m_errorMonitor->ExpectSuccess();
23364
23365 ASSERT_NO_FATAL_FAILURE(Init());
23366 VkResult err;
23367
23368 std::vector<VkSemaphore> semaphores;
23369
23370 const int chainLength = 32768;
23371 VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
23372
23373 for (int i = 0; i < chainLength; i++) {
Dave Houlton1150cf52017-04-27 14:38:11 -060023374 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070023375 VkSemaphore semaphore;
23376 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &semaphore);
23377 ASSERT_VK_SUCCESS(err);
23378
23379 semaphores.push_back(semaphore);
23380
Chris Forbesfc50aaa2017-05-01 10:20:17 -070023381 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO,
23382 nullptr,
23383 semaphores.size() > 1 ? 1u : 0u,
23384 semaphores.size() > 1 ? &semaphores[semaphores.size() - 2] : nullptr,
23385 &flags,
23386 0,
23387 nullptr,
23388 1,
23389 &semaphores[semaphores.size() - 1]};
Chris Forbes94196952017-04-06 16:30:59 -070023390 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
23391 ASSERT_VK_SUCCESS(err);
23392 }
23393
Dave Houlton1150cf52017-04-27 14:38:11 -060023394 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Chris Forbes94196952017-04-06 16:30:59 -070023395 VkFence fence;
23396 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23397 ASSERT_VK_SUCCESS(err);
Dave Houlton1150cf52017-04-27 14:38:11 -060023398 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &semaphores.back(), &flags, 0, nullptr, 0, nullptr};
Chris Forbes94196952017-04-06 16:30:59 -070023399 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23400 ASSERT_VK_SUCCESS(err);
23401
23402 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23403
Dave Houlton1150cf52017-04-27 14:38:11 -060023404 for (auto semaphore : semaphores) vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Chris Forbes94196952017-04-06 16:30:59 -070023405
23406 vkDestroyFence(m_device->device(), fence, nullptr);
23407
23408 m_errorMonitor->VerifyNotFound();
23409}
23410
Mike Stroyanca855662017-05-02 11:06:27 -060023411extern "C" void *ReleaseNullFence(void *arg) {
23412 struct thread_data_struct *data = (struct thread_data_struct *)arg;
23413
23414 for (int i = 0; i < 40000; i++) {
23415 vkDestroyFence(data->device, VK_NULL_HANDLE, NULL);
23416 if (data->bailout) {
23417 break;
23418 }
23419 }
23420 return NULL;
23421}
23422
23423TEST_F(VkPositiveLayerTest, ThreadNullFenceCollision) {
23424 test_platform_thread thread;
23425
23426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
23427
23428 ASSERT_NO_FATAL_FAILURE(Init());
23429
23430 struct thread_data_struct data;
23431 data.device = m_device->device();
23432 data.bailout = false;
23433 m_errorMonitor->SetBailout(&data.bailout);
23434
23435 // Call vkDestroyFence of VK_NULL_HANDLE repeatedly using multiple threads.
23436 // There should be no validation error from collision of that non-object.
23437 test_platform_thread_create(&thread, ReleaseNullFence, (void *)&data);
23438 for (int i = 0; i < 40000; i++) {
23439 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
23440 }
23441 test_platform_thread_join(thread, NULL);
23442
23443 m_errorMonitor->SetBailout(NULL);
23444
23445 m_errorMonitor->VerifyNotFound();
23446}
23447
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023448#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023449TEST_F(VkPositiveLayerTest, LongFenceChain)
23450{
23451 m_errorMonitor->ExpectSuccess();
23452
Tony Barbour1fa09702017-03-16 12:09:08 -060023453 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023454 VkResult err;
23455
23456 std::vector<VkFence> fences;
23457
23458 const int chainLength = 32768;
23459
23460 for (int i = 0; i < chainLength; i++) {
23461 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23462 VkFence fence;
23463 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23464 ASSERT_VK_SUCCESS(err);
23465
23466 fences.push_back(fence);
23467
23468 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23469 0, nullptr, 0, nullptr };
23470 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23471 ASSERT_VK_SUCCESS(err);
23472
23473 }
23474
23475 // BOOM, stack overflow.
23476 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23477
23478 for (auto fence : fences)
23479 vkDestroyFence(m_device->device(), fence, nullptr);
23480
23481 m_errorMonitor->VerifyNotFound();
23482}
23483#endif
23484
Cody Northrop1242dfd2016-07-13 17:24:59 -060023485#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023486const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023487static bool initialized = false;
23488static bool active = false;
23489
23490// Convert Intents to argv
23491// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023492std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023493 std::vector<std::string> args;
23494 JavaVM &vm = *app.activity->vm;
23495 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023496 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023497
23498 JNIEnv &env = *p_env;
23499 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023500 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023501 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023502 jmethodID get_string_extra_method =
23503 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023504 jvalue get_string_extra_args;
23505 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023506 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023507
23508 std::string args_str;
23509 if (extra_str) {
23510 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23511 args_str = extra_utf;
23512 env.ReleaseStringUTFChars(extra_str, extra_utf);
23513 env.DeleteLocalRef(extra_str);
23514 }
23515
23516 env.DeleteLocalRef(get_string_extra_args.l);
23517 env.DeleteLocalRef(intent);
23518 vm.DetachCurrentThread();
23519
23520 // split args_str
23521 std::stringstream ss(args_str);
23522 std::string arg;
23523 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023524 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023525 }
23526
23527 return args;
23528}
23529
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023530void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
23531 const char *const type_param = test_info.type_param();
23532 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060023533
23534 if (type_param != NULL || value_param != NULL) {
23535 error_message.append(", where ");
23536 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023537 error_message.append("TypeParam = ").append(type_param);
23538 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060023539 }
23540 if (value_param != NULL) {
23541 error_message.append("GetParam() = ").append(value_param);
23542 }
23543 }
23544}
23545
23546// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23547class LogcatPrinter : public ::testing::EmptyTestEventListener {
23548 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023549 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023550 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23551 }
23552
23553 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023554 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060023555 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023556 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060023557
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023558 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
23559 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060023560 }
23561
23562 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023563 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023564 std::string result;
23565 if (info.result()->Passed()) {
23566 result.append("[ OK ]");
23567 } else {
23568 result.append("[ FAILED ]");
23569 }
23570 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023571 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060023572
23573 if (::testing::GTEST_FLAG(print_time)) {
23574 std::ostringstream os;
23575 os << info.result()->elapsed_time();
23576 result.append(" (").append(os.str()).append(" ms)");
23577 }
23578
23579 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23580 };
23581};
23582
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023583static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023584
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023585static void processCommand(struct android_app *app, int32_t cmd) {
23586 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023587 case APP_CMD_INIT_WINDOW: {
23588 if (app->window) {
23589 initialized = true;
23590 }
23591 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023592 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023593 case APP_CMD_GAINED_FOCUS: {
23594 active = true;
23595 break;
23596 }
23597 case APP_CMD_LOST_FOCUS: {
23598 active = false;
23599 break;
23600 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023601 }
23602}
23603
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023604void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023605 app_dummy();
23606
Cody Northrop1242dfd2016-07-13 17:24:59 -060023607 int vulkanSupport = InitVulkan();
23608 if (vulkanSupport == 0) {
23609 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23610 return;
23611 }
23612
23613 app->onAppCmd = processCommand;
23614 app->onInputEvent = processInput;
23615
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023616 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023617 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023618 struct android_poll_source *source;
23619 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023620 if (source) {
23621 source->process(app, source);
23622 }
23623
23624 if (app->destroyRequested != 0) {
23625 VkTestFramework::Finish();
23626 return;
23627 }
23628 }
23629
23630 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023631 // Use the following key to send arguments to gtest, i.e.
23632 // --es args "--gtest_filter=-VkLayerTest.foo"
23633 const char key[] = "args";
23634 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023635
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023636 std::string filter = "";
23637 if (args.size() > 0) {
23638 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23639 filter += args[0];
23640 } else {
23641 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23642 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023643
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023644 int argc = 2;
23645 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23646 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023647
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023648 // Route output to files until we can override the gtest output
23649 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23650 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023651
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023652 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023653
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023654 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060023655 listeners.Append(new LogcatPrinter);
23656
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023657 VkTestFramework::InitArgs(&argc, argv);
23658 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023659
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023660 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023661
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023662 if (result != 0) {
23663 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23664 } else {
23665 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23666 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023667
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023668 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023669
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023670 fclose(stdout);
23671 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023672
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023673 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023674 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023675 }
23676 }
23677}
23678#endif
23679
Tony Barbour300a6082015-04-07 13:44:53 -060023680int main(int argc, char **argv) {
23681 int result;
23682
Cody Northrop8e54a402016-03-08 22:25:52 -070023683#ifdef ANDROID
23684 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023685 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023686#endif
23687
Tony Barbour300a6082015-04-07 13:44:53 -060023688 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023689 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023690
23691 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23692
23693 result = RUN_ALL_TESTS();
23694
Tony Barbour6918cd52015-04-09 12:58:51 -060023695 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023696 return result;
23697}