blob: ddf23458f2326fe06121f2a35f4efec72594288d [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 Stroyanaccf7692015-05-12 16:00:45 -060013542 VkEvent event;
13543 bool bailout;
13544};
13545
Karl Schultz6addd812016-02-02 17:17:23 -070013546extern "C" void *AddToCommandBuffer(void *arg) {
13547 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013548
Mike Stroyana6d14942016-07-13 15:10:05 -060013549 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013550 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013551 if (data->bailout) {
13552 break;
13553 }
13554 }
13555 return NULL;
13556}
13557
Karl Schultz6addd812016-02-02 17:17:23 -070013558TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013559 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013560
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013562
Tony Barbour1fa09702017-03-16 12:09:08 -060013563 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013564 ASSERT_NO_FATAL_FAILURE(InitViewport());
13565 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13566
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013567 // Calls AllocateCommandBuffers
13568 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013569
13570 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013571 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013572
13573 VkEventCreateInfo event_info;
13574 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013575 VkResult err;
13576
13577 memset(&event_info, 0, sizeof(event_info));
13578 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13579
Chia-I Wuf7458c52015-10-26 21:10:41 +080013580 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013581 ASSERT_VK_SUCCESS(err);
13582
Mike Stroyanaccf7692015-05-12 16:00:45 -060013583 err = vkResetEvent(device(), event);
13584 ASSERT_VK_SUCCESS(err);
13585
13586 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013587 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013588 data.event = event;
13589 data.bailout = false;
13590 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013591
13592 // First do some correct operations using multiple threads.
13593 // Add many entries to command buffer from another thread.
13594 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13595 // Make non-conflicting calls from this thread at the same time.
13596 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013597 uint32_t count;
13598 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013599 }
13600 test_platform_thread_join(thread, NULL);
13601
13602 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013603 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013604 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013605 // Add many entries to command buffer from this thread at the same time.
13606 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013607
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013608 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013609 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013610
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013611 m_errorMonitor->SetBailout(NULL);
13612
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013613 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013614
Chia-I Wuf7458c52015-10-26 21:10:41 +080013615 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013616}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013617#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013618
Karl Schultz6addd812016-02-02 17:17:23 -070013619TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013620 TEST_DESCRIPTION(
13621 "Test that an error is produced for a spirv module "
13622 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013625
Tony Barbour1fa09702017-03-16 12:09:08 -060013626 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13628
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013629 VkShaderModule module;
13630 VkShaderModuleCreateInfo moduleCreateInfo;
13631 struct icd_spv_header spv;
13632
13633 spv.magic = ICD_SPV_MAGIC;
13634 spv.version = ICD_SPV_VERSION;
13635 spv.gen_magic = 0;
13636
13637 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13638 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013639 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013640 moduleCreateInfo.codeSize = 4;
13641 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013642 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013643
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013644 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013645}
13646
Karl Schultz6addd812016-02-02 17:17:23 -070013647TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013648 TEST_DESCRIPTION(
13649 "Test that an error is produced for a spirv module "
13650 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013651
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013653
Tony Barbour1fa09702017-03-16 12:09:08 -060013654 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013655 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13656
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013657 VkShaderModule module;
13658 VkShaderModuleCreateInfo moduleCreateInfo;
13659 struct icd_spv_header spv;
13660
13661 spv.magic = ~ICD_SPV_MAGIC;
13662 spv.version = ICD_SPV_VERSION;
13663 spv.gen_magic = 0;
13664
13665 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13666 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013667 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013668 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13669 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013670 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013671
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013672 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013673}
13674
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013675#if 0
13676// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013677TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013679 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013680
Tony Barbour1fa09702017-03-16 12:09:08 -060013681 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013682 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13683
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013684 VkShaderModule module;
13685 VkShaderModuleCreateInfo moduleCreateInfo;
13686 struct icd_spv_header spv;
13687
13688 spv.magic = ICD_SPV_MAGIC;
13689 spv.version = ~ICD_SPV_VERSION;
13690 spv.gen_magic = 0;
13691
13692 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13693 moduleCreateInfo.pNext = NULL;
13694
Karl Schultz6addd812016-02-02 17:17:23 -070013695 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013696 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13697 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013698 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013699
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013700 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013701}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013702#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013703
Karl Schultz6addd812016-02-02 17:17:23 -070013704TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013705 TEST_DESCRIPTION(
13706 "Test that a warning is produced for a vertex output that "
13707 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013709
Tony Barbour1fa09702017-03-16 12:09:08 -060013710 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013713 char const *vsSource =
13714 "#version 450\n"
13715 "\n"
13716 "layout(location=0) out float x;\n"
13717 "out gl_PerVertex {\n"
13718 " vec4 gl_Position;\n"
13719 "};\n"
13720 "void main(){\n"
13721 " gl_Position = vec4(1);\n"
13722 " x = 0;\n"
13723 "}\n";
13724 char const *fsSource =
13725 "#version 450\n"
13726 "\n"
13727 "layout(location=0) out vec4 color;\n"
13728 "void main(){\n"
13729 " color = vec4(1);\n"
13730 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013731
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013732 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13733 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013734
13735 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013736 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013737 pipe.AddShader(&vs);
13738 pipe.AddShader(&fs);
13739
Chris Forbes9f7ff632015-05-25 11:13:08 +120013740 VkDescriptorSetObj descriptorSet(m_device);
13741 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013742 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013743
Tony Barbour5781e8f2015-08-04 16:23:11 -060013744 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013745
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013746 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013747}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013748
Mark Mueller098c9cb2016-09-08 09:01:57 -060013749TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13750 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13751
Tony Barbour1fa09702017-03-16 12:09:08 -060013752 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13754
13755 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013756 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013757
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013758 char const *vsSource =
13759 "#version 450\n"
13760 "\n"
13761 "out gl_PerVertex {\n"
13762 " vec4 gl_Position;\n"
13763 "};\n"
13764 "void main(){\n"
13765 " gl_Position = vec4(1);\n"
13766 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013767
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013768 char const *fsSource =
13769 "#version 450\n"
13770 "\n"
13771 "layout (constant_id = 0) const float r = 0.0f;\n"
13772 "layout(location = 0) out vec4 uFragColor;\n"
13773 "void main(){\n"
13774 " uFragColor = vec4(r,1,0,1);\n"
13775 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013776
13777 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13778 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13779
13780 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13781 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13782
13783 VkPipelineLayout pipeline_layout;
13784 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13785
13786 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13787 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13788 vp_state_create_info.viewportCount = 1;
13789 VkViewport viewport = {};
13790 vp_state_create_info.pViewports = &viewport;
13791 vp_state_create_info.scissorCount = 1;
13792 VkRect2D scissors = {};
13793 vp_state_create_info.pScissors = &scissors;
13794
13795 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13796
13797 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13798 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13799 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13800 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13801
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013802 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013803
13804 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13805 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13806
13807 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13808 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13809 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13810
13811 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13812 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13813 rasterization_state_create_info.pNext = nullptr;
13814 rasterization_state_create_info.lineWidth = 1.0f;
13815 rasterization_state_create_info.rasterizerDiscardEnable = true;
13816
13817 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13818 color_blend_attachment_state.blendEnable = VK_FALSE;
13819 color_blend_attachment_state.colorWriteMask = 0xf;
13820
13821 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13822 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13823 color_blend_state_create_info.attachmentCount = 1;
13824 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13825
13826 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13827 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13828 graphicspipe_create_info.stageCount = 2;
13829 graphicspipe_create_info.pStages = shader_stage_create_info;
13830 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13831 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13832 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13833 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13834 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13835 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13836 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13837 graphicspipe_create_info.layout = pipeline_layout;
13838 graphicspipe_create_info.renderPass = renderPass();
13839
13840 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13841 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13842
13843 VkPipelineCache pipelineCache;
13844 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13845
13846 // This structure maps constant ids to data locations.
13847 const VkSpecializationMapEntry entry =
13848 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013849 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013850
13851 uint32_t data = 1;
13852
13853 // Set up the info describing spec map and data
13854 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013855 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013856 };
13857 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13858
13859 VkPipeline pipeline;
13860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13861 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13862 m_errorMonitor->VerifyFound();
13863
13864 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13865 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13866}
13867
13868TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13869 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13870
Tony Barbour1fa09702017-03-16 12:09:08 -060013871 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013872 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13873
13874 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13875
13876 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13877 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13878 descriptor_pool_type_count[0].descriptorCount = 1;
13879 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13880 descriptor_pool_type_count[1].descriptorCount = 1;
13881
13882 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13883 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13884 descriptor_pool_create_info.maxSets = 1;
13885 descriptor_pool_create_info.poolSizeCount = 2;
13886 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13887 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13888
13889 VkDescriptorPool descriptorset_pool;
13890 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13891
13892 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13893 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13894 descriptorset_layout_binding.descriptorCount = 1;
13895 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013896 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013897
13898 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13899 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13900 descriptorset_layout_create_info.bindingCount = 1;
13901 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13902
13903 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013904 ASSERT_VK_SUCCESS(
13905 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013906
13907 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13908 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13909 descriptorset_allocate_info.descriptorSetCount = 1;
13910 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13911 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13912 VkDescriptorSet descriptorset;
13913 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13914
13915 // Challenge core_validation with a non uniform buffer type.
13916 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13917
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013918 char const *vsSource =
13919 "#version 450\n"
13920 "\n"
13921 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13922 " mat4 mvp;\n"
13923 "} ubuf;\n"
13924 "out gl_PerVertex {\n"
13925 " vec4 gl_Position;\n"
13926 "};\n"
13927 "void main(){\n"
13928 " gl_Position = ubuf.mvp * vec4(1);\n"
13929 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013930
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013931 char const *fsSource =
13932 "#version 450\n"
13933 "\n"
13934 "layout(location = 0) out vec4 uFragColor;\n"
13935 "void main(){\n"
13936 " uFragColor = vec4(0,1,0,1);\n"
13937 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013938
13939 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13940 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13941
13942 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13943 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13944 pipeline_layout_create_info.setLayoutCount = 1;
13945 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13946
13947 VkPipelineLayout pipeline_layout;
13948 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13949
13950 VkPipelineObj pipe(m_device);
13951 pipe.AddColorAttachment();
13952 pipe.AddShader(&vs);
13953 pipe.AddShader(&fs);
13954
13955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13956 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13957 m_errorMonitor->VerifyFound();
13958
13959 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13960 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13961 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13962}
13963
13964TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13965 TEST_DESCRIPTION(
13966 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13967
Tony Barbour1fa09702017-03-16 12:09:08 -060013968 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13970
13971 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13972
13973 VkDescriptorPoolSize descriptor_pool_type_count = {};
13974 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13975 descriptor_pool_type_count.descriptorCount = 1;
13976
13977 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13978 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13979 descriptor_pool_create_info.maxSets = 1;
13980 descriptor_pool_create_info.poolSizeCount = 1;
13981 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13982 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13983
13984 VkDescriptorPool descriptorset_pool;
13985 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13986
13987 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13988 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13989 descriptorset_layout_binding.descriptorCount = 1;
13990 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13991 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013992 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013993
13994 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13995 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13996 descriptorset_layout_create_info.bindingCount = 1;
13997 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13998
13999 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014000 ASSERT_VK_SUCCESS(
14001 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060014002
14003 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
14004 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
14005 descriptorset_allocate_info.descriptorSetCount = 1;
14006 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
14007 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
14008 VkDescriptorSet descriptorset;
14009 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
14010
14011 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
14012
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014013 char const *vsSource =
14014 "#version 450\n"
14015 "\n"
14016 "layout (std140, set = 0, binding = 0) uniform buf {\n"
14017 " mat4 mvp;\n"
14018 "} ubuf;\n"
14019 "out gl_PerVertex {\n"
14020 " vec4 gl_Position;\n"
14021 "};\n"
14022 "void main(){\n"
14023 " gl_Position = ubuf.mvp * vec4(1);\n"
14024 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014025
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014026 char const *fsSource =
14027 "#version 450\n"
14028 "\n"
14029 "layout(location = 0) out vec4 uFragColor;\n"
14030 "void main(){\n"
14031 " uFragColor = vec4(0,1,0,1);\n"
14032 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014033
14034 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14035 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14036
14037 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14038 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14039 pipeline_layout_create_info.setLayoutCount = 1;
14040 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14041
14042 VkPipelineLayout pipeline_layout;
14043 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14044
14045 VkPipelineObj pipe(m_device);
14046 pipe.AddColorAttachment();
14047 pipe.AddShader(&vs);
14048 pipe.AddShader(&fs);
14049
14050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14051 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14052 m_errorMonitor->VerifyFound();
14053
14054 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14055 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14056 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14057}
14058
14059TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014060 TEST_DESCRIPTION(
14061 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14062 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014063
Tony Barbour1fa09702017-03-16 12:09:08 -060014064 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14066
14067 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014068 "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 -060014069
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014070 char const *vsSource =
14071 "#version 450\n"
14072 "\n"
14073 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14074 "out gl_PerVertex {\n"
14075 " vec4 gl_Position;\n"
14076 "};\n"
14077 "void main(){\n"
14078 " gl_Position = vec4(consts.x);\n"
14079 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014080
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014081 char const *fsSource =
14082 "#version 450\n"
14083 "\n"
14084 "layout(location = 0) out vec4 uFragColor;\n"
14085 "void main(){\n"
14086 " uFragColor = vec4(0,1,0,1);\n"
14087 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014088
14089 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14090 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14091
14092 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14093 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14094
14095 // Set up a push constant range
14096 VkPushConstantRange push_constant_ranges = {};
14097 // Set to the wrong stage to challenge core_validation
14098 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14099 push_constant_ranges.size = 4;
14100
14101 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14102 pipeline_layout_create_info.pushConstantRangeCount = 1;
14103
14104 VkPipelineLayout pipeline_layout;
14105 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14106
14107 VkPipelineObj pipe(m_device);
14108 pipe.AddColorAttachment();
14109 pipe.AddShader(&vs);
14110 pipe.AddShader(&fs);
14111
14112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14113 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14114 m_errorMonitor->VerifyFound();
14115
14116 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14117}
14118
14119TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14120 TEST_DESCRIPTION(
14121 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14122
Tony Barbour1fa09702017-03-16 12:09:08 -060014123 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014124 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14125
14126 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014127 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014128
14129 // Some awkward steps are required to test with custom device features.
14130 std::vector<const char *> device_extension_names;
14131 auto features = m_device->phy().features();
14132 // Disable support for 64 bit floats
14133 features.shaderFloat64 = false;
14134 // The sacrificial device object
14135 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14136
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014137 char const *vsSource =
14138 "#version 450\n"
14139 "\n"
14140 "out gl_PerVertex {\n"
14141 " vec4 gl_Position;\n"
14142 "};\n"
14143 "void main(){\n"
14144 " gl_Position = vec4(1);\n"
14145 "}\n";
14146 char const *fsSource =
14147 "#version 450\n"
14148 "\n"
14149 "layout(location=0) out vec4 color;\n"
14150 "void main(){\n"
14151 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14152 " color = vec4(green);\n"
14153 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014154
14155 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14156 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14157
14158 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014159
14160 VkPipelineObj pipe(&test_device);
14161 pipe.AddColorAttachment();
14162 pipe.AddShader(&vs);
14163 pipe.AddShader(&fs);
14164
14165 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14166 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14167 VkPipelineLayout pipeline_layout;
14168 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14169
14170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14171 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14172 m_errorMonitor->VerifyFound();
14173
14174 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14175}
14176
Mark Lobodzinski20832822017-03-24 14:49:45 -060014177TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14178 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14179 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014180
Tony Barbour1fa09702017-03-16 12:09:08 -060014181 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014182 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14183
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014184 char const *vsSource =
14185 "#version 450\n"
14186 "\n"
14187 "out gl_PerVertex {\n"
14188 " vec4 gl_Position;\n"
14189 "};\n"
14190 "layout(xfb_buffer = 1) out;"
14191 "void main(){\n"
14192 " gl_Position = vec4(1);\n"
14193 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014194
Mark Lobodzinski20832822017-03-24 14:49:45 -060014195 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014196
Mark Lobodzinski20832822017-03-24 14:49:45 -060014197 std::vector<unsigned int> spv;
14198 VkShaderModuleCreateInfo module_create_info;
14199 VkShaderModule shader_module;
14200 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14201 module_create_info.pNext = NULL;
14202 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14203 module_create_info.pCode = spv.data();
14204 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14205 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014206
Mark Lobodzinski20832822017-03-24 14:49:45 -060014207 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014208
Mark Lobodzinski20832822017-03-24 14:49:45 -060014209 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014210}
14211
Karl Schultz6addd812016-02-02 17:17:23 -070014212TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014213 TEST_DESCRIPTION(
14214 "Test that an error is produced for a fragment shader input "
14215 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014216
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014218
Tony Barbour1fa09702017-03-16 12:09:08 -060014219 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014220 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014221
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014222 char const *vsSource =
14223 "#version 450\n"
14224 "\n"
14225 "out gl_PerVertex {\n"
14226 " vec4 gl_Position;\n"
14227 "};\n"
14228 "void main(){\n"
14229 " gl_Position = vec4(1);\n"
14230 "}\n";
14231 char const *fsSource =
14232 "#version 450\n"
14233 "\n"
14234 "layout(location=0) in float x;\n"
14235 "layout(location=0) out vec4 color;\n"
14236 "void main(){\n"
14237 " color = vec4(x);\n"
14238 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014239
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014240 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14241 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014242
14243 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014244 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014245 pipe.AddShader(&vs);
14246 pipe.AddShader(&fs);
14247
Chris Forbes59cb88d2015-05-25 11:13:13 +120014248 VkDescriptorSetObj descriptorSet(m_device);
14249 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014250 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014251
Tony Barbour5781e8f2015-08-04 16:23:11 -060014252 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014253
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014254 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014255}
14256
Karl Schultz6addd812016-02-02 17:17:23 -070014257TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014258 TEST_DESCRIPTION(
14259 "Test that an error is produced for a fragment shader input "
14260 "within an interace block, which is not present in the outputs "
14261 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014263
Tony Barbour1fa09702017-03-16 12:09:08 -060014264 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014265 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14266
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014267 char const *vsSource =
14268 "#version 450\n"
14269 "\n"
14270 "out gl_PerVertex {\n"
14271 " vec4 gl_Position;\n"
14272 "};\n"
14273 "void main(){\n"
14274 " gl_Position = vec4(1);\n"
14275 "}\n";
14276 char const *fsSource =
14277 "#version 450\n"
14278 "\n"
14279 "in block { layout(location=0) float x; } ins;\n"
14280 "layout(location=0) out vec4 color;\n"
14281 "void main(){\n"
14282 " color = vec4(ins.x);\n"
14283 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014284
14285 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14286 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14287
14288 VkPipelineObj pipe(m_device);
14289 pipe.AddColorAttachment();
14290 pipe.AddShader(&vs);
14291 pipe.AddShader(&fs);
14292
14293 VkDescriptorSetObj descriptorSet(m_device);
14294 descriptorSet.AppendDummy();
14295 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14296
14297 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14298
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014299 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014300}
14301
Karl Schultz6addd812016-02-02 17:17:23 -070014302TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014303 TEST_DESCRIPTION(
14304 "Test that an error is produced for mismatched array sizes "
14305 "across the vertex->fragment shader interface");
14306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14307 "Type mismatch on location 0.0: 'ptr to "
14308 "output arr[2] of float32' vs 'ptr to "
14309 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014310
Tony Barbour1fa09702017-03-16 12:09:08 -060014311 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014312 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14313
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014314 char const *vsSource =
14315 "#version 450\n"
14316 "\n"
14317 "layout(location=0) out float x[2];\n"
14318 "out gl_PerVertex {\n"
14319 " vec4 gl_Position;\n"
14320 "};\n"
14321 "void main(){\n"
14322 " x[0] = 0; x[1] = 0;\n"
14323 " gl_Position = vec4(1);\n"
14324 "}\n";
14325 char const *fsSource =
14326 "#version 450\n"
14327 "\n"
14328 "layout(location=0) in float x[1];\n"
14329 "layout(location=0) out vec4 color;\n"
14330 "void main(){\n"
14331 " color = vec4(x[0]);\n"
14332 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014333
14334 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14335 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14336
14337 VkPipelineObj pipe(m_device);
14338 pipe.AddColorAttachment();
14339 pipe.AddShader(&vs);
14340 pipe.AddShader(&fs);
14341
14342 VkDescriptorSetObj descriptorSet(m_device);
14343 descriptorSet.AppendDummy();
14344 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14345
14346 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14347
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014348 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014349}
14350
Karl Schultz6addd812016-02-02 17:17:23 -070014351TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014352 TEST_DESCRIPTION(
14353 "Test that an error is produced for mismatched types across "
14354 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014356
Tony Barbour1fa09702017-03-16 12:09:08 -060014357 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014358 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014359
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014360 char const *vsSource =
14361 "#version 450\n"
14362 "\n"
14363 "layout(location=0) out int x;\n"
14364 "out gl_PerVertex {\n"
14365 " vec4 gl_Position;\n"
14366 "};\n"
14367 "void main(){\n"
14368 " x = 0;\n"
14369 " gl_Position = vec4(1);\n"
14370 "}\n";
14371 char const *fsSource =
14372 "#version 450\n"
14373 "\n"
14374 "layout(location=0) in float x;\n" /* VS writes int */
14375 "layout(location=0) out vec4 color;\n"
14376 "void main(){\n"
14377 " color = vec4(x);\n"
14378 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014379
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014380 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14381 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014382
14383 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014384 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014385 pipe.AddShader(&vs);
14386 pipe.AddShader(&fs);
14387
Chris Forbesb56af562015-05-25 11:13:17 +120014388 VkDescriptorSetObj descriptorSet(m_device);
14389 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014390 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014391
Tony Barbour5781e8f2015-08-04 16:23:11 -060014392 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014393
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014394 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014395}
14396
Karl Schultz6addd812016-02-02 17:17:23 -070014397TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014398 TEST_DESCRIPTION(
14399 "Test that an error is produced for mismatched types across "
14400 "the vertex->fragment shader interface, when the variable is contained within "
14401 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014403
Tony Barbour1fa09702017-03-16 12:09:08 -060014404 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14406
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014407 char const *vsSource =
14408 "#version 450\n"
14409 "\n"
14410 "out block { layout(location=0) int x; } outs;\n"
14411 "out gl_PerVertex {\n"
14412 " vec4 gl_Position;\n"
14413 "};\n"
14414 "void main(){\n"
14415 " outs.x = 0;\n"
14416 " gl_Position = vec4(1);\n"
14417 "}\n";
14418 char const *fsSource =
14419 "#version 450\n"
14420 "\n"
14421 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14422 "layout(location=0) out vec4 color;\n"
14423 "void main(){\n"
14424 " color = vec4(ins.x);\n"
14425 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014426
14427 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14428 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14429
14430 VkPipelineObj pipe(m_device);
14431 pipe.AddColorAttachment();
14432 pipe.AddShader(&vs);
14433 pipe.AddShader(&fs);
14434
14435 VkDescriptorSetObj descriptorSet(m_device);
14436 descriptorSet.AppendDummy();
14437 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14438
14439 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14440
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014441 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014442}
14443
14444TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014445 TEST_DESCRIPTION(
14446 "Test that an error is produced for location mismatches across "
14447 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14448 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014449 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 +130014450
Tony Barbour1fa09702017-03-16 12:09:08 -060014451 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14453
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014454 char const *vsSource =
14455 "#version 450\n"
14456 "\n"
14457 "out block { layout(location=1) float x; } outs;\n"
14458 "out gl_PerVertex {\n"
14459 " vec4 gl_Position;\n"
14460 "};\n"
14461 "void main(){\n"
14462 " outs.x = 0;\n"
14463 " gl_Position = vec4(1);\n"
14464 "}\n";
14465 char const *fsSource =
14466 "#version 450\n"
14467 "\n"
14468 "in block { layout(location=0) float x; } ins;\n"
14469 "layout(location=0) out vec4 color;\n"
14470 "void main(){\n"
14471 " color = vec4(ins.x);\n"
14472 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014473
14474 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14475 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14476
14477 VkPipelineObj pipe(m_device);
14478 pipe.AddColorAttachment();
14479 pipe.AddShader(&vs);
14480 pipe.AddShader(&fs);
14481
14482 VkDescriptorSetObj descriptorSet(m_device);
14483 descriptorSet.AppendDummy();
14484 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14485
14486 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14487
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014488 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014489}
14490
14491TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014492 TEST_DESCRIPTION(
14493 "Test that an error is produced for component mismatches across the "
14494 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14495 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014496 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 +130014497
Tony Barbour1fa09702017-03-16 12:09:08 -060014498 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014499 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14500
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014501 char const *vsSource =
14502 "#version 450\n"
14503 "\n"
14504 "out block { layout(location=0, component=0) float x; } outs;\n"
14505 "out gl_PerVertex {\n"
14506 " vec4 gl_Position;\n"
14507 "};\n"
14508 "void main(){\n"
14509 " outs.x = 0;\n"
14510 " gl_Position = vec4(1);\n"
14511 "}\n";
14512 char const *fsSource =
14513 "#version 450\n"
14514 "\n"
14515 "in block { layout(location=0, component=1) float x; } ins;\n"
14516 "layout(location=0) out vec4 color;\n"
14517 "void main(){\n"
14518 " color = vec4(ins.x);\n"
14519 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014520
14521 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14522 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14523
14524 VkPipelineObj pipe(m_device);
14525 pipe.AddColorAttachment();
14526 pipe.AddShader(&vs);
14527 pipe.AddShader(&fs);
14528
14529 VkDescriptorSetObj descriptorSet(m_device);
14530 descriptorSet.AppendDummy();
14531 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14532
14533 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14534
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014535 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014536}
14537
Chris Forbes1f3b0152016-11-30 12:48:40 +130014538TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14539 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14540
Tony Barbour1fa09702017-03-16 12:09:08 -060014541 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014542 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14543
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014544 char const *vsSource =
14545 "#version 450\n"
14546 "layout(location=0) out mediump float x;\n"
14547 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14548 char const *fsSource =
14549 "#version 450\n"
14550 "layout(location=0) in highp float x;\n"
14551 "layout(location=0) out vec4 color;\n"
14552 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014553
14554 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14555 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14556
14557 VkPipelineObj pipe(m_device);
14558 pipe.AddColorAttachment();
14559 pipe.AddShader(&vs);
14560 pipe.AddShader(&fs);
14561
14562 VkDescriptorSetObj descriptorSet(m_device);
14563 descriptorSet.AppendDummy();
14564 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14565
14566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14567
14568 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14569
14570 m_errorMonitor->VerifyFound();
14571}
14572
Chris Forbes870a39e2016-11-30 12:55:56 +130014573TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14574 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14575
Tony Barbour1fa09702017-03-16 12:09:08 -060014576 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14578
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014579 char const *vsSource =
14580 "#version 450\n"
14581 "out block { layout(location=0) mediump float x; };\n"
14582 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14583 char const *fsSource =
14584 "#version 450\n"
14585 "in block { layout(location=0) highp float x; };\n"
14586 "layout(location=0) out vec4 color;\n"
14587 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014588
14589 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14590 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14591
14592 VkPipelineObj pipe(m_device);
14593 pipe.AddColorAttachment();
14594 pipe.AddShader(&vs);
14595 pipe.AddShader(&fs);
14596
14597 VkDescriptorSetObj descriptorSet(m_device);
14598 descriptorSet.AppendDummy();
14599 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14600
14601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14602
14603 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14604
14605 m_errorMonitor->VerifyFound();
14606}
14607
Karl Schultz6addd812016-02-02 17:17:23 -070014608TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014609 TEST_DESCRIPTION(
14610 "Test that a warning is produced for a vertex attribute which is "
14611 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014612 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014613
Tony Barbour1fa09702017-03-16 12:09:08 -060014614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014616
14617 VkVertexInputBindingDescription input_binding;
14618 memset(&input_binding, 0, sizeof(input_binding));
14619
14620 VkVertexInputAttributeDescription input_attrib;
14621 memset(&input_attrib, 0, sizeof(input_attrib));
14622 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14623
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014624 char const *vsSource =
14625 "#version 450\n"
14626 "\n"
14627 "out gl_PerVertex {\n"
14628 " vec4 gl_Position;\n"
14629 "};\n"
14630 "void main(){\n"
14631 " gl_Position = vec4(1);\n"
14632 "}\n";
14633 char const *fsSource =
14634 "#version 450\n"
14635 "\n"
14636 "layout(location=0) out vec4 color;\n"
14637 "void main(){\n"
14638 " color = vec4(1);\n"
14639 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014640
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014641 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14642 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014643
14644 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014645 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014646 pipe.AddShader(&vs);
14647 pipe.AddShader(&fs);
14648
14649 pipe.AddVertexInputBindings(&input_binding, 1);
14650 pipe.AddVertexInputAttribs(&input_attrib, 1);
14651
Chris Forbesde136e02015-05-25 11:13:28 +120014652 VkDescriptorSetObj descriptorSet(m_device);
14653 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014654 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014655
Tony Barbour5781e8f2015-08-04 16:23:11 -060014656 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014657
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014658 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014659}
14660
Karl Schultz6addd812016-02-02 17:17:23 -070014661TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014662 TEST_DESCRIPTION(
14663 "Test that a warning is produced for a location mismatch on "
14664 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014666
Tony Barbour1fa09702017-03-16 12:09:08 -060014667 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14669
14670 VkVertexInputBindingDescription input_binding;
14671 memset(&input_binding, 0, sizeof(input_binding));
14672
14673 VkVertexInputAttributeDescription input_attrib;
14674 memset(&input_attrib, 0, sizeof(input_attrib));
14675 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14676
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014677 char const *vsSource =
14678 "#version 450\n"
14679 "\n"
14680 "layout(location=1) in float x;\n"
14681 "out gl_PerVertex {\n"
14682 " vec4 gl_Position;\n"
14683 "};\n"
14684 "void main(){\n"
14685 " gl_Position = vec4(x);\n"
14686 "}\n";
14687 char const *fsSource =
14688 "#version 450\n"
14689 "\n"
14690 "layout(location=0) out vec4 color;\n"
14691 "void main(){\n"
14692 " color = vec4(1);\n"
14693 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014694
14695 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14696 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14697
14698 VkPipelineObj pipe(m_device);
14699 pipe.AddColorAttachment();
14700 pipe.AddShader(&vs);
14701 pipe.AddShader(&fs);
14702
14703 pipe.AddVertexInputBindings(&input_binding, 1);
14704 pipe.AddVertexInputAttribs(&input_attrib, 1);
14705
14706 VkDescriptorSetObj descriptorSet(m_device);
14707 descriptorSet.AppendDummy();
14708 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14709
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014710 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014711 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14712
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014713 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014714}
14715
Karl Schultz6addd812016-02-02 17:17:23 -070014716TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014717 TEST_DESCRIPTION(
14718 "Test that an error is produced for a vertex shader input which is not "
14719 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14721 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014722
Tony Barbour1fa09702017-03-16 12:09:08 -060014723 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014725
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014726 char const *vsSource =
14727 "#version 450\n"
14728 "\n"
14729 "layout(location=0) in vec4 x;\n" /* not provided */
14730 "out gl_PerVertex {\n"
14731 " vec4 gl_Position;\n"
14732 "};\n"
14733 "void main(){\n"
14734 " gl_Position = x;\n"
14735 "}\n";
14736 char const *fsSource =
14737 "#version 450\n"
14738 "\n"
14739 "layout(location=0) out vec4 color;\n"
14740 "void main(){\n"
14741 " color = vec4(1);\n"
14742 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014743
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014744 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14745 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014746
14747 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014748 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014749 pipe.AddShader(&vs);
14750 pipe.AddShader(&fs);
14751
Chris Forbes62e8e502015-05-25 11:13:29 +120014752 VkDescriptorSetObj descriptorSet(m_device);
14753 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014754 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014755
Tony Barbour5781e8f2015-08-04 16:23:11 -060014756 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014757
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014758 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014759}
14760
Karl Schultz6addd812016-02-02 17:17:23 -070014761TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014762 TEST_DESCRIPTION(
14763 "Test that an error is produced for a mismatch between the "
14764 "fundamental type (float/int/uint) of an attribute and the "
14765 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014766 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 -060014767
Tony Barbour1fa09702017-03-16 12:09:08 -060014768 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014769 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014770
14771 VkVertexInputBindingDescription input_binding;
14772 memset(&input_binding, 0, sizeof(input_binding));
14773
14774 VkVertexInputAttributeDescription input_attrib;
14775 memset(&input_attrib, 0, sizeof(input_attrib));
14776 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14777
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014778 char const *vsSource =
14779 "#version 450\n"
14780 "\n"
14781 "layout(location=0) in int x;\n" /* attrib provided float */
14782 "out gl_PerVertex {\n"
14783 " vec4 gl_Position;\n"
14784 "};\n"
14785 "void main(){\n"
14786 " gl_Position = vec4(x);\n"
14787 "}\n";
14788 char const *fsSource =
14789 "#version 450\n"
14790 "\n"
14791 "layout(location=0) out vec4 color;\n"
14792 "void main(){\n"
14793 " color = vec4(1);\n"
14794 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014795
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014796 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14797 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014798
14799 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014800 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014801 pipe.AddShader(&vs);
14802 pipe.AddShader(&fs);
14803
14804 pipe.AddVertexInputBindings(&input_binding, 1);
14805 pipe.AddVertexInputAttribs(&input_attrib, 1);
14806
Chris Forbesc97d98e2015-05-25 11:13:31 +120014807 VkDescriptorSetObj descriptorSet(m_device);
14808 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014809 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014810
Tony Barbour5781e8f2015-08-04 16:23:11 -060014811 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014812
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014813 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014814}
14815
Chris Forbesc68b43c2016-04-06 11:18:47 +120014816TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014817 TEST_DESCRIPTION(
14818 "Test that an error is produced for a pipeline containing multiple "
14819 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14821 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014822
Tony Barbour1fa09702017-03-16 12:09:08 -060014823 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14825
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014826 char const *vsSource =
14827 "#version 450\n"
14828 "\n"
14829 "out gl_PerVertex {\n"
14830 " vec4 gl_Position;\n"
14831 "};\n"
14832 "void main(){\n"
14833 " gl_Position = vec4(1);\n"
14834 "}\n";
14835 char const *fsSource =
14836 "#version 450\n"
14837 "\n"
14838 "layout(location=0) out vec4 color;\n"
14839 "void main(){\n"
14840 " color = vec4(1);\n"
14841 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014842
14843 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14844 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14845
14846 VkPipelineObj pipe(m_device);
14847 pipe.AddColorAttachment();
14848 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014849 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014850 pipe.AddShader(&fs);
14851
14852 VkDescriptorSetObj descriptorSet(m_device);
14853 descriptorSet.AppendDummy();
14854 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14855
14856 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14857
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014858 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014859}
14860
Chris Forbes82ff92a2016-09-09 10:50:24 +120014861TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014863
Tony Barbour1fa09702017-03-16 12:09:08 -060014864 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014865 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014867 char const *vsSource =
14868 "#version 450\n"
14869 "out gl_PerVertex {\n"
14870 " vec4 gl_Position;\n"
14871 "};\n"
14872 "void main(){\n"
14873 " gl_Position = vec4(0);\n"
14874 "}\n";
14875 char const *fsSource =
14876 "#version 450\n"
14877 "\n"
14878 "layout(location=0) out vec4 color;\n"
14879 "void main(){\n"
14880 " color = vec4(1);\n"
14881 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014882
14883 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14884 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14885
14886 VkPipelineObj pipe(m_device);
14887 pipe.AddColorAttachment();
14888 pipe.AddShader(&vs);
14889 pipe.AddShader(&fs);
14890
14891 VkDescriptorSetObj descriptorSet(m_device);
14892 descriptorSet.AppendDummy();
14893 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14894
14895 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14896
14897 m_errorMonitor->VerifyFound();
14898}
14899
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014900TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14902 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14903 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014904
Tony Barbour1fa09702017-03-16 12:09:08 -060014905 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014906 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14907
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014908 char const *vsSource =
14909 "#version 450\n"
14910 "void main(){ gl_Position = vec4(0); }\n";
14911 char const *fsSource =
14912 "#version 450\n"
14913 "\n"
14914 "layout(location=0) out vec4 color;\n"
14915 "void main(){\n"
14916 " color = vec4(1);\n"
14917 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014918
14919 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14920 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14921
14922 VkPipelineObj pipe(m_device);
14923 pipe.AddColorAttachment();
14924 pipe.AddShader(&vs);
14925 pipe.AddShader(&fs);
14926
14927 VkDescriptorSetObj descriptorSet(m_device);
14928 descriptorSet.AppendDummy();
14929 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14930
14931 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014932 {
14933 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14934 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14935 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014936 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014937 {
14938 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14939 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14940 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014941 },
14942 };
14943 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014944 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014945 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014946 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14947 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014948 VkRenderPass rp;
14949 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14950 ASSERT_VK_SUCCESS(err);
14951
14952 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14953
14954 m_errorMonitor->VerifyFound();
14955
14956 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14957}
14958
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014959TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014960 TEST_DESCRIPTION(
14961 "Test that an error is produced for a variable output from "
14962 "the TCS without the patch decoration, but consumed in the TES "
14963 "with the decoration.");
14964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14965 "is per-vertex in tessellation control shader stage "
14966 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014967
Tony Barbour1fa09702017-03-16 12:09:08 -060014968 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14970
Chris Forbesc1e852d2016-04-04 19:26:42 +120014971 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014972 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014973 return;
14974 }
14975
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014976 char const *vsSource =
14977 "#version 450\n"
14978 "void main(){}\n";
14979 char const *tcsSource =
14980 "#version 450\n"
14981 "layout(location=0) out int x[];\n"
14982 "layout(vertices=3) out;\n"
14983 "void main(){\n"
14984 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14985 " gl_TessLevelInner[0] = 1;\n"
14986 " x[gl_InvocationID] = gl_InvocationID;\n"
14987 "}\n";
14988 char const *tesSource =
14989 "#version 450\n"
14990 "layout(triangles, equal_spacing, cw) in;\n"
14991 "layout(location=0) patch in int x;\n"
14992 "out gl_PerVertex { vec4 gl_Position; };\n"
14993 "void main(){\n"
14994 " gl_Position.xyz = gl_TessCoord;\n"
14995 " gl_Position.w = x;\n"
14996 "}\n";
14997 char const *fsSource =
14998 "#version 450\n"
14999 "layout(location=0) out vec4 color;\n"
15000 "void main(){\n"
15001 " color = vec4(1);\n"
15002 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120015003
15004 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15005 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
15006 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
15007 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15008
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015009 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
15010 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015011
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015012 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120015013
15014 VkPipelineObj pipe(m_device);
15015 pipe.SetInputAssembly(&iasci);
15016 pipe.SetTessellation(&tsci);
15017 pipe.AddColorAttachment();
15018 pipe.AddShader(&vs);
15019 pipe.AddShader(&tcs);
15020 pipe.AddShader(&tes);
15021 pipe.AddShader(&fs);
15022
15023 VkDescriptorSetObj descriptorSet(m_device);
15024 descriptorSet.AppendDummy();
15025 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15026
15027 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15028
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015029 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015030}
15031
Karl Schultz6addd812016-02-02 17:17:23 -070015032TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015033 TEST_DESCRIPTION(
15034 "Test that an error is produced for a vertex attribute setup where multiple "
15035 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15037 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015038
Tony Barbour1fa09702017-03-16 12:09:08 -060015039 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015040 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015041
15042 /* Two binding descriptions for binding 0 */
15043 VkVertexInputBindingDescription input_bindings[2];
15044 memset(input_bindings, 0, sizeof(input_bindings));
15045
15046 VkVertexInputAttributeDescription input_attrib;
15047 memset(&input_attrib, 0, sizeof(input_attrib));
15048 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15049
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015050 char const *vsSource =
15051 "#version 450\n"
15052 "\n"
15053 "layout(location=0) in float x;\n" /* attrib provided float */
15054 "out gl_PerVertex {\n"
15055 " vec4 gl_Position;\n"
15056 "};\n"
15057 "void main(){\n"
15058 " gl_Position = vec4(x);\n"
15059 "}\n";
15060 char const *fsSource =
15061 "#version 450\n"
15062 "\n"
15063 "layout(location=0) out vec4 color;\n"
15064 "void main(){\n"
15065 " color = vec4(1);\n"
15066 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015067
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015068 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15069 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015070
15071 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015072 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015073 pipe.AddShader(&vs);
15074 pipe.AddShader(&fs);
15075
15076 pipe.AddVertexInputBindings(input_bindings, 2);
15077 pipe.AddVertexInputAttribs(&input_attrib, 1);
15078
Chris Forbes280ba2c2015-06-12 11:16:41 +120015079 VkDescriptorSetObj descriptorSet(m_device);
15080 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015081 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015082
Tony Barbour5781e8f2015-08-04 16:23:11 -060015083 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015084
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015085 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015086}
Chris Forbes8f68b562015-05-25 11:13:32 +120015087
Karl Schultz6addd812016-02-02 17:17:23 -070015088TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015089 TEST_DESCRIPTION(
15090 "Test that an error is produced for a fragment shader which does not "
15091 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015093
Tony Barbour1fa09702017-03-16 12:09:08 -060015094 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015095
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015096 char const *vsSource =
15097 "#version 450\n"
15098 "\n"
15099 "out gl_PerVertex {\n"
15100 " vec4 gl_Position;\n"
15101 "};\n"
15102 "void main(){\n"
15103 " gl_Position = vec4(1);\n"
15104 "}\n";
15105 char const *fsSource =
15106 "#version 450\n"
15107 "\n"
15108 "void main(){\n"
15109 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015110
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015111 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15112 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015113
15114 VkPipelineObj pipe(m_device);
15115 pipe.AddShader(&vs);
15116 pipe.AddShader(&fs);
15117
Chia-I Wu08accc62015-07-07 11:50:03 +080015118 /* set up CB 0, not written */
15119 pipe.AddColorAttachment();
15120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015121
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015122 VkDescriptorSetObj descriptorSet(m_device);
15123 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015124 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015125
Tony Barbour5781e8f2015-08-04 16:23:11 -060015126 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015127
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015128 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015129}
15130
Karl Schultz6addd812016-02-02 17:17:23 -070015131TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015132 TEST_DESCRIPTION(
15133 "Test that a warning is produced for a fragment shader which provides a spurious "
15134 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015136 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015137
Tony Barbour1fa09702017-03-16 12:09:08 -060015138 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015139
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015140 char const *vsSource =
15141 "#version 450\n"
15142 "\n"
15143 "out gl_PerVertex {\n"
15144 " vec4 gl_Position;\n"
15145 "};\n"
15146 "void main(){\n"
15147 " gl_Position = vec4(1);\n"
15148 "}\n";
15149 char const *fsSource =
15150 "#version 450\n"
15151 "\n"
15152 "layout(location=0) out vec4 x;\n"
15153 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15154 "void main(){\n"
15155 " x = vec4(1);\n"
15156 " y = vec4(1);\n"
15157 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015158
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015159 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15160 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015161
15162 VkPipelineObj pipe(m_device);
15163 pipe.AddShader(&vs);
15164 pipe.AddShader(&fs);
15165
Chia-I Wu08accc62015-07-07 11:50:03 +080015166 /* set up CB 0, not written */
15167 pipe.AddColorAttachment();
15168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015169 /* FS writes CB 1, but we don't configure it */
15170
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015171 VkDescriptorSetObj descriptorSet(m_device);
15172 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015173 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015174
Tony Barbour5781e8f2015-08-04 16:23:11 -060015175 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015176
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015177 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015178}
15179
Karl Schultz6addd812016-02-02 17:17:23 -070015180TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015181 TEST_DESCRIPTION(
15182 "Test that an error is produced for a mismatch between the fundamental "
15183 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015185
Tony Barbour1fa09702017-03-16 12:09:08 -060015186 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015187
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015188 char const *vsSource =
15189 "#version 450\n"
15190 "\n"
15191 "out gl_PerVertex {\n"
15192 " vec4 gl_Position;\n"
15193 "};\n"
15194 "void main(){\n"
15195 " gl_Position = vec4(1);\n"
15196 "}\n";
15197 char const *fsSource =
15198 "#version 450\n"
15199 "\n"
15200 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15201 "void main(){\n"
15202 " x = ivec4(1);\n"
15203 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015204
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015205 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15206 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015207
15208 VkPipelineObj pipe(m_device);
15209 pipe.AddShader(&vs);
15210 pipe.AddShader(&fs);
15211
Chia-I Wu08accc62015-07-07 11:50:03 +080015212 /* set up CB 0; type is UNORM by default */
15213 pipe.AddColorAttachment();
15214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015215
Chris Forbesa36d69e2015-05-25 11:13:44 +120015216 VkDescriptorSetObj descriptorSet(m_device);
15217 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015218 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015219
Tony Barbour5781e8f2015-08-04 16:23:11 -060015220 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015221
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015222 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015223}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015224
Karl Schultz6addd812016-02-02 17:17:23 -070015225TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015226 TEST_DESCRIPTION(
15227 "Test that an error is produced for a shader consuming a uniform "
15228 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015230
Tony Barbour1fa09702017-03-16 12:09:08 -060015231 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015232
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015233 char const *vsSource =
15234 "#version 450\n"
15235 "\n"
15236 "out gl_PerVertex {\n"
15237 " vec4 gl_Position;\n"
15238 "};\n"
15239 "void main(){\n"
15240 " gl_Position = vec4(1);\n"
15241 "}\n";
15242 char const *fsSource =
15243 "#version 450\n"
15244 "\n"
15245 "layout(location=0) out vec4 x;\n"
15246 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15247 "void main(){\n"
15248 " x = vec4(bar.y);\n"
15249 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015250
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015251 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15252 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015253
Chris Forbes556c76c2015-08-14 12:04:59 +120015254 VkPipelineObj pipe(m_device);
15255 pipe.AddShader(&vs);
15256 pipe.AddShader(&fs);
15257
15258 /* set up CB 0; type is UNORM by default */
15259 pipe.AddColorAttachment();
15260 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15261
15262 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015263 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015264
15265 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15266
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015267 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015268}
15269
Chris Forbes5c59e902016-02-26 16:56:09 +130015270TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015271 TEST_DESCRIPTION(
15272 "Test that an error is produced for a shader consuming push constants "
15273 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015275
Tony Barbour1fa09702017-03-16 12:09:08 -060015276 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015277
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015278 char const *vsSource =
15279 "#version 450\n"
15280 "\n"
15281 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15282 "out gl_PerVertex {\n"
15283 " vec4 gl_Position;\n"
15284 "};\n"
15285 "void main(){\n"
15286 " gl_Position = vec4(consts.x);\n"
15287 "}\n";
15288 char const *fsSource =
15289 "#version 450\n"
15290 "\n"
15291 "layout(location=0) out vec4 x;\n"
15292 "void main(){\n"
15293 " x = vec4(1);\n"
15294 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015295
15296 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15297 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15298
15299 VkPipelineObj pipe(m_device);
15300 pipe.AddShader(&vs);
15301 pipe.AddShader(&fs);
15302
15303 /* set up CB 0; type is UNORM by default */
15304 pipe.AddColorAttachment();
15305 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15306
15307 VkDescriptorSetObj descriptorSet(m_device);
15308 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15309
15310 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15311
15312 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015313 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015314}
15315
Chris Forbes3fb17902016-08-22 14:57:55 +120015316TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015317 TEST_DESCRIPTION(
15318 "Test that an error is produced for a shader consuming an input attachment "
15319 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15321 "consumes input attachment index 0 but not provided in subpass");
15322
Tony Barbour1fa09702017-03-16 12:09:08 -060015323 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015324
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015325 char const *vsSource =
15326 "#version 450\n"
15327 "\n"
15328 "out gl_PerVertex {\n"
15329 " vec4 gl_Position;\n"
15330 "};\n"
15331 "void main(){\n"
15332 " gl_Position = vec4(1);\n"
15333 "}\n";
15334 char const *fsSource =
15335 "#version 450\n"
15336 "\n"
15337 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15338 "layout(location=0) out vec4 color;\n"
15339 "void main() {\n"
15340 " color = subpassLoad(x);\n"
15341 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015342
15343 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15344 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15345
15346 VkPipelineObj pipe(m_device);
15347 pipe.AddShader(&vs);
15348 pipe.AddShader(&fs);
15349 pipe.AddColorAttachment();
15350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15351
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015352 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15353 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015354 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015355 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015356 ASSERT_VK_SUCCESS(err);
15357
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015358 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015359 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015360 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015361 ASSERT_VK_SUCCESS(err);
15362
15363 // error here.
15364 pipe.CreateVKPipeline(pl, renderPass());
15365
15366 m_errorMonitor->VerifyFound();
15367
15368 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15369 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15370}
15371
Chris Forbes5a9a0472016-08-22 16:02:09 +120015372TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015373 TEST_DESCRIPTION(
15374 "Test that an error is produced for a shader consuming an input attachment "
15375 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015376 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15377 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15378
Tony Barbour1fa09702017-03-16 12:09:08 -060015379 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015380
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015381 char const *vsSource =
15382 "#version 450\n"
15383 "\n"
15384 "out gl_PerVertex {\n"
15385 " vec4 gl_Position;\n"
15386 "};\n"
15387 "void main(){\n"
15388 " gl_Position = vec4(1);\n"
15389 "}\n";
15390 char const *fsSource =
15391 "#version 450\n"
15392 "\n"
15393 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15394 "layout(location=0) out vec4 color;\n"
15395 "void main() {\n"
15396 " color = subpassLoad(x);\n"
15397 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015398
15399 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15400 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15401
15402 VkPipelineObj pipe(m_device);
15403 pipe.AddShader(&vs);
15404 pipe.AddShader(&fs);
15405 pipe.AddColorAttachment();
15406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15407
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015408 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15409 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015410 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015411 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015412 ASSERT_VK_SUCCESS(err);
15413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015414 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015415 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015416 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015417 ASSERT_VK_SUCCESS(err);
15418
15419 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015420 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15421 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15422 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15423 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15424 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 +120015425 };
15426 VkAttachmentReference color = {
15427 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15428 };
15429 VkAttachmentReference input = {
15430 1, VK_IMAGE_LAYOUT_GENERAL,
15431 };
15432
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015433 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015434
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015435 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015436 VkRenderPass rp;
15437 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15438 ASSERT_VK_SUCCESS(err);
15439
15440 // error here.
15441 pipe.CreateVKPipeline(pl, rp);
15442
15443 m_errorMonitor->VerifyFound();
15444
15445 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15446 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15447 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15448}
15449
Chris Forbes541f7b02016-08-22 15:30:27 +120015450TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015451 TEST_DESCRIPTION(
15452 "Test that an error is produced for a shader consuming an input attachment "
15453 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015455 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015456
Tony Barbour1fa09702017-03-16 12:09:08 -060015457 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015458
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015459 char const *vsSource =
15460 "#version 450\n"
15461 "\n"
15462 "out gl_PerVertex {\n"
15463 " vec4 gl_Position;\n"
15464 "};\n"
15465 "void main(){\n"
15466 " gl_Position = vec4(1);\n"
15467 "}\n";
15468 char const *fsSource =
15469 "#version 450\n"
15470 "\n"
15471 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15472 "layout(location=0) out vec4 color;\n"
15473 "void main() {\n"
15474 " color = subpassLoad(xs[0]);\n"
15475 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015476
15477 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15478 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15479
15480 VkPipelineObj pipe(m_device);
15481 pipe.AddShader(&vs);
15482 pipe.AddShader(&fs);
15483 pipe.AddColorAttachment();
15484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15485
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015486 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15487 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015488 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015489 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015490 ASSERT_VK_SUCCESS(err);
15491
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015492 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015493 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015494 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015495 ASSERT_VK_SUCCESS(err);
15496
15497 // error here.
15498 pipe.CreateVKPipeline(pl, renderPass());
15499
15500 m_errorMonitor->VerifyFound();
15501
15502 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15503 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15504}
15505
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015506TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015507 TEST_DESCRIPTION(
15508 "Test that an error is produced for a compute pipeline consuming a "
15509 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015511
Tony Barbour1fa09702017-03-16 12:09:08 -060015512 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015513
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015514 char const *csSource =
15515 "#version 450\n"
15516 "\n"
15517 "layout(local_size_x=1) in;\n"
15518 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15519 "void main(){\n"
15520 " x = vec4(1);\n"
15521 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015522
15523 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15524
15525 VkDescriptorSetObj descriptorSet(m_device);
15526 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15527
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015528 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15529 nullptr,
15530 0,
15531 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15532 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15533 descriptorSet.GetPipelineLayout(),
15534 VK_NULL_HANDLE,
15535 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015536
15537 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015538 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015539
15540 m_errorMonitor->VerifyFound();
15541
15542 if (err == VK_SUCCESS) {
15543 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15544 }
15545}
15546
Chris Forbes22a9b092016-07-19 14:34:05 +120015547TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015548 TEST_DESCRIPTION(
15549 "Test that an error is produced for a pipeline consuming a "
15550 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15552 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015553
Tony Barbour1fa09702017-03-16 12:09:08 -060015554 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015555
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015556 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15557 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015558 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015559 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015560 ASSERT_VK_SUCCESS(err);
15561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015562 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015563 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015564 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015565 ASSERT_VK_SUCCESS(err);
15566
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015567 char const *csSource =
15568 "#version 450\n"
15569 "\n"
15570 "layout(local_size_x=1) in;\n"
15571 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15572 "void main() {\n"
15573 " x.x = 1.0f;\n"
15574 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015575 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15576
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015577 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15578 nullptr,
15579 0,
15580 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15581 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15582 pl,
15583 VK_NULL_HANDLE,
15584 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015585
15586 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015587 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015588
15589 m_errorMonitor->VerifyFound();
15590
15591 if (err == VK_SUCCESS) {
15592 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15593 }
15594
15595 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15596 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15597}
15598
Chris Forbes50020592016-07-27 13:52:41 +120015599TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015600 TEST_DESCRIPTION(
15601 "Test that an error is produced when an image view type "
15602 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015603
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015604 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 +120015605
Tony Barbour1fa09702017-03-16 12:09:08 -060015606 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15608
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015609 char const *vsSource =
15610 "#version 450\n"
15611 "\n"
15612 "out gl_PerVertex { vec4 gl_Position; };\n"
15613 "void main() { gl_Position = vec4(0); }\n";
15614 char const *fsSource =
15615 "#version 450\n"
15616 "\n"
15617 "layout(set=0, binding=0) uniform sampler3D s;\n"
15618 "layout(location=0) out vec4 color;\n"
15619 "void main() {\n"
15620 " color = texture(s, vec3(0));\n"
15621 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015622 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15623 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15624
15625 VkPipelineObj pipe(m_device);
15626 pipe.AddShader(&vs);
15627 pipe.AddShader(&fs);
15628 pipe.AddColorAttachment();
15629
15630 VkTextureObj texture(m_device, nullptr);
15631 VkSamplerObj sampler(m_device);
15632
15633 VkDescriptorSetObj descriptorSet(m_device);
15634 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15635 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15636
15637 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15638 ASSERT_VK_SUCCESS(err);
15639
Tony Barbour552f6c02016-12-21 14:34:07 -070015640 m_commandBuffer->BeginCommandBuffer();
15641 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015642
15643 m_commandBuffer->BindPipeline(pipe);
15644 m_commandBuffer->BindDescriptorSet(descriptorSet);
15645
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015646 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015647 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015648 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015649 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15650
15651 // error produced here.
15652 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15653
15654 m_errorMonitor->VerifyFound();
15655
Tony Barbour552f6c02016-12-21 14:34:07 -070015656 m_commandBuffer->EndRenderPass();
15657 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015658}
15659
Chris Forbes5533bfc2016-07-27 14:12:34 +120015660TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015661 TEST_DESCRIPTION(
15662 "Test that an error is produced when a multisampled images "
15663 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015664
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015666
Tony Barbour1fa09702017-03-16 12:09:08 -060015667 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15669
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015670 char const *vsSource =
15671 "#version 450\n"
15672 "\n"
15673 "out gl_PerVertex { vec4 gl_Position; };\n"
15674 "void main() { gl_Position = vec4(0); }\n";
15675 char const *fsSource =
15676 "#version 450\n"
15677 "\n"
15678 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15679 "layout(location=0) out vec4 color;\n"
15680 "void main() {\n"
15681 " color = texelFetch(s, ivec2(0), 0);\n"
15682 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015683 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15684 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15685
15686 VkPipelineObj pipe(m_device);
15687 pipe.AddShader(&vs);
15688 pipe.AddShader(&fs);
15689 pipe.AddColorAttachment();
15690
15691 VkTextureObj texture(m_device, nullptr);
15692 VkSamplerObj sampler(m_device);
15693
15694 VkDescriptorSetObj descriptorSet(m_device);
15695 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15696 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15697
15698 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15699 ASSERT_VK_SUCCESS(err);
15700
Tony Barbour552f6c02016-12-21 14:34:07 -070015701 m_commandBuffer->BeginCommandBuffer();
15702 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015703
15704 m_commandBuffer->BindPipeline(pipe);
15705 m_commandBuffer->BindDescriptorSet(descriptorSet);
15706
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015707 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015708 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015709 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015710 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15711
15712 // error produced here.
15713 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15714
15715 m_errorMonitor->VerifyFound();
15716
Tony Barbour552f6c02016-12-21 14:34:07 -070015717 m_commandBuffer->EndRenderPass();
15718 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015719}
15720
Mark Youngc48c4c12016-04-11 14:26:49 -060015721TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015722 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015723
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015724 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15725 {
15726 VkFormatProperties properties;
15727 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15728 if (properties.optimalTilingFeatures == 0) {
15729 printf(" Image format not supported; skipped.\n");
15730 return;
15731 }
15732 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015733
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015734 VkImageCreateInfo info = {};
15735 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15736 info.pNext = NULL;
15737 info.imageType = VK_IMAGE_TYPE_2D;
15738 info.format = format;
15739 info.extent.height = 32;
15740 info.extent.depth = 1;
15741 info.mipLevels = 1;
15742 info.arrayLayers = 1;
15743 info.samples = VK_SAMPLE_COUNT_1_BIT;
15744 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15745 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15746 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015747
15748 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015749 {
15750 VkImageFormatProperties properties;
15751 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15752 info.tiling, info.usage, info.flags, &properties);
15753 ASSERT_VK_SUCCESS(result);
15754 info.extent.width = properties.maxExtent.width + 1;
15755 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015756
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015757 VkImage image;
15758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15759 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015760 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015761}
15762
Mark Youngc48c4c12016-04-11 14:26:49 -060015763TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015764 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015765
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015766 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15767 {
15768 VkFormatProperties properties;
15769 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15770 if (properties.optimalTilingFeatures == 0) {
15771 printf(" Image format not supported; skipped.\n");
15772 return;
15773 }
15774 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015775
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015776 VkImageCreateInfo info = {};
15777 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15778 info.pNext = NULL;
15779 info.imageType = VK_IMAGE_TYPE_2D;
15780 info.format = format;
15781 info.extent.height = 32;
15782 info.extent.depth = 1;
15783 info.mipLevels = 1;
15784 info.arrayLayers = 1;
15785 info.samples = VK_SAMPLE_COUNT_1_BIT;
15786 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15787 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15788 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015789
15790 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015791 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015792
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015793 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015795 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15796 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015797 m_errorMonitor->VerifyFound();
15798}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015799
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015800TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015801 TEST_DESCRIPTION(
15802 "Create a render pass with an attachment description "
15803 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015804
Tony Barbour1fa09702017-03-16 12:09:08 -060015805 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015806 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15807
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015809
15810 VkAttachmentReference color_attach = {};
15811 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15812 color_attach.attachment = 0;
15813 VkSubpassDescription subpass = {};
15814 subpass.colorAttachmentCount = 1;
15815 subpass.pColorAttachments = &color_attach;
15816
15817 VkRenderPassCreateInfo rpci = {};
15818 rpci.subpassCount = 1;
15819 rpci.pSubpasses = &subpass;
15820 rpci.attachmentCount = 1;
15821 VkAttachmentDescription attach_desc = {};
15822 attach_desc.format = VK_FORMAT_UNDEFINED;
15823 rpci.pAttachments = &attach_desc;
15824 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15825 VkRenderPass rp;
15826 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15827
15828 m_errorMonitor->VerifyFound();
15829
15830 if (result == VK_SUCCESS) {
15831 vkDestroyRenderPass(m_device->device(), rp, NULL);
15832 }
15833}
15834
Karl Schultz6addd812016-02-02 17:17:23 -070015835TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015836 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015837
Mike Stroyana3082432015-09-25 13:39:21 -060015838 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015839 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15840 const int32_t tex_width = 32;
15841 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015842
15843 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015844 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15845 image_create_info.pNext = NULL;
15846 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15847 image_create_info.format = tex_format;
15848 image_create_info.extent.width = tex_width;
15849 image_create_info.extent.height = tex_height;
15850 image_create_info.extent.depth = 1;
15851 image_create_info.mipLevels = 1;
15852 image_create_info.arrayLayers = 1;
15853 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15854 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15855 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15856 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015857
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015858 VkImage image;
15859 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015860 ASSERT_VK_SUCCESS(err);
15861
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015862 VkMemoryRequirements requirements;
15863 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15864
15865 VkMemoryAllocateInfo alloc_info{};
15866 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15867 alloc_info.pNext = NULL;
15868 alloc_info.memoryTypeIndex = 0;
15869 alloc_info.allocationSize = requirements.size;
15870 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15871 ASSERT_TRUE(pass);
15872
15873 VkDeviceMemory memory;
15874 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15875 ASSERT_VK_SUCCESS(err);
15876
15877 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15878
Tobin Ehliscde08892015-09-22 10:11:37 -060015879 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015880 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015881 image_view_create_info.image = image;
15882 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15883 image_view_create_info.format = tex_format;
15884 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015885 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015886 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015887 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015888
15889 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015891 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015892 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015893
15894 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015895 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015896}
Mike Stroyana3082432015-09-25 13:39:21 -060015897
Mark Youngd339ba32016-05-30 13:28:35 -060015898TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15899 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015901 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015902
Tony Barbour1fa09702017-03-16 12:09:08 -060015903 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015904
15905 // Create an image and try to create a view with no memory backing the image
15906 VkImage image;
15907
15908 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15909 const int32_t tex_width = 32;
15910 const int32_t tex_height = 32;
15911
15912 VkImageCreateInfo image_create_info = {};
15913 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15914 image_create_info.pNext = NULL;
15915 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15916 image_create_info.format = tex_format;
15917 image_create_info.extent.width = tex_width;
15918 image_create_info.extent.height = tex_height;
15919 image_create_info.extent.depth = 1;
15920 image_create_info.mipLevels = 1;
15921 image_create_info.arrayLayers = 1;
15922 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15923 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15924 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15925 image_create_info.flags = 0;
15926
15927 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15928 ASSERT_VK_SUCCESS(err);
15929
15930 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015931 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015932 image_view_create_info.image = image;
15933 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15934 image_view_create_info.format = tex_format;
15935 image_view_create_info.subresourceRange.layerCount = 1;
15936 image_view_create_info.subresourceRange.baseMipLevel = 0;
15937 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015938 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015939
15940 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015941 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015942
15943 m_errorMonitor->VerifyFound();
15944 vkDestroyImage(m_device->device(), image, NULL);
15945 // If last error is success, it still created the view, so delete it.
15946 if (err == VK_SUCCESS) {
15947 vkDestroyImageView(m_device->device(), view, NULL);
15948 }
Mark Youngd339ba32016-05-30 13:28:35 -060015949}
15950
Karl Schultz6addd812016-02-02 17:17:23 -070015951TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015952 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015954
Tony Barbour1fa09702017-03-16 12:09:08 -060015955 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015956
Karl Schultz6addd812016-02-02 17:17:23 -070015957 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015958 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015959 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015960 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015961
15962 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015963 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015964 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015965 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15966 image_view_create_info.format = tex_format;
15967 image_view_create_info.subresourceRange.baseMipLevel = 0;
15968 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015969 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015970 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015971 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015972
15973 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015974 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015975
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015976 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015977}
15978
Mike Weiblena1e13f42017-02-09 21:25:59 -070015979TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15980 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15981
Tony Barbour1fa09702017-03-16 12:09:08 -060015982 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015983 VkSubresourceLayout subres_layout = {};
15984
15985 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15986 {
15987 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15988 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015989 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015990 ASSERT_TRUE(img.initialized());
15991
15992 VkImageSubresource subres = {};
15993 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15994 subres.mipLevel = 0;
15995 subres.arrayLayer = 0;
15996
15997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15998 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15999 m_errorMonitor->VerifyFound();
16000 }
16001
16002 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
16003 {
16004 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016005 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016006 ASSERT_TRUE(img.initialized());
16007
16008 VkImageSubresource subres = {};
16009 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
16010 subres.mipLevel = 0;
16011 subres.arrayLayer = 0;
16012
16013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
16014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
16015 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16016 m_errorMonitor->VerifyFound();
16017 }
16018
16019 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16020 {
16021 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016022 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016023 ASSERT_TRUE(img.initialized());
16024
16025 VkImageSubresource subres = {};
16026 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16027 subres.mipLevel = 1; // ERROR: triggers VU 00739
16028 subres.arrayLayer = 0;
16029
16030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16031 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16032 m_errorMonitor->VerifyFound();
16033 }
16034
16035 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16036 {
16037 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016038 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016039 ASSERT_TRUE(img.initialized());
16040
16041 VkImageSubresource subres = {};
16042 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16043 subres.mipLevel = 0;
16044 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16045
16046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16047 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16048 m_errorMonitor->VerifyFound();
16049 }
16050}
16051
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016052TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016053 VkResult err;
16054 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016055
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016056 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016057
Tony Barbour1fa09702017-03-16 12:09:08 -060016058 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016059
16060 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016061 VkImage srcImage;
16062 VkImage dstImage;
16063 VkDeviceMemory srcMem;
16064 VkDeviceMemory destMem;
16065 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016066
16067 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016068 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16069 image_create_info.pNext = NULL;
16070 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16071 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16072 image_create_info.extent.width = 32;
16073 image_create_info.extent.height = 32;
16074 image_create_info.extent.depth = 1;
16075 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016076 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016077 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16078 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16079 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16080 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016081
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016082 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016083 ASSERT_VK_SUCCESS(err);
16084
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016085 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016086 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016087 ASSERT_VK_SUCCESS(err);
16088
16089 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016090 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016091 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16092 memAlloc.pNext = NULL;
16093 memAlloc.allocationSize = 0;
16094 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016095
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016096 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016097 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016098 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016099 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016100 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016101 ASSERT_VK_SUCCESS(err);
16102
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016103 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016104 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016105 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016106 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016107 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016108 ASSERT_VK_SUCCESS(err);
16109
16110 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16111 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016112 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016113 ASSERT_VK_SUCCESS(err);
16114
Tony Barbour552f6c02016-12-21 14:34:07 -070016115 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016116 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016117 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016118 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016119 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016120 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016121 copyRegion.srcOffset.x = 0;
16122 copyRegion.srcOffset.y = 0;
16123 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016124 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016125 copyRegion.dstSubresource.mipLevel = 0;
16126 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016127 // Introduce failure by forcing the dst layerCount to differ from src
16128 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016129 copyRegion.dstOffset.x = 0;
16130 copyRegion.dstOffset.y = 0;
16131 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016132 copyRegion.extent.width = 1;
16133 copyRegion.extent.height = 1;
16134 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016135 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016136 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016137
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016138 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016139
Chia-I Wuf7458c52015-10-26 21:10:41 +080016140 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016141 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016142 vkFreeMemory(m_device->device(), srcMem, NULL);
16143 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016144}
16145
Tony Barbourd6673642016-05-05 14:46:39 -060016146TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016147 TEST_DESCRIPTION("Creating images with unsuported formats ");
16148
Tony Barbour1fa09702017-03-16 12:09:08 -060016149 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016150 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016151
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016152 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016153 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016154 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016155 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16156 image_create_info.format = VK_FORMAT_UNDEFINED;
16157 image_create_info.extent.width = 32;
16158 image_create_info.extent.height = 32;
16159 image_create_info.extent.depth = 1;
16160 image_create_info.mipLevels = 1;
16161 image_create_info.arrayLayers = 1;
16162 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16163 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16164 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016165
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16167 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016168
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016169 VkImage image;
16170 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016171 m_errorMonitor->VerifyFound();
16172
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016173 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016174 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016175 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16176 VkFormat format = static_cast<VkFormat>(f);
16177 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016178 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016179 unsupported = format;
16180 break;
16181 }
16182 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016183
Tony Barbourd6673642016-05-05 14:46:39 -060016184 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016185 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016187
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016188 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016189 m_errorMonitor->VerifyFound();
16190 }
16191}
16192
16193TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016194 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16195
Tony Barbour1fa09702017-03-16 12:09:08 -060016196 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016197 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016198 if (!depth_format) {
16199 return;
16200 }
Tony Barbourd6673642016-05-05 14:46:39 -060016201
16202 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016203 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 -060016204 VK_IMAGE_TILING_OPTIMAL, 0);
16205 ASSERT_TRUE(image.initialized());
16206
16207 VkImageView imgView;
16208 VkImageViewCreateInfo imgViewInfo = {};
16209 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16210 imgViewInfo.image = image.handle();
16211 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16212 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16213 imgViewInfo.subresourceRange.layerCount = 1;
16214 imgViewInfo.subresourceRange.baseMipLevel = 0;
16215 imgViewInfo.subresourceRange.levelCount = 1;
16216 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16217
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016218 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016219 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016221 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16222 m_errorMonitor->VerifyFound();
16223 imgViewInfo.subresourceRange.baseMipLevel = 0;
16224
Tony Barbourd6673642016-05-05 14:46:39 -060016225 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16226 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016228 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16229 m_errorMonitor->VerifyFound();
16230 imgViewInfo.subresourceRange.levelCount = 1;
16231
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016232 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16233 imgViewInfo.subresourceRange.levelCount = 2;
16234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16235 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16236 m_errorMonitor->VerifyFound();
16237 imgViewInfo.subresourceRange.levelCount = 1;
16238
16239 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16240 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16242 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16243 m_errorMonitor->VerifyFound();
16244 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16245
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016246 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16247 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016248 m_errorMonitor->SetDesiredFailureMsg(
16249 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16250 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016251 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16252 m_errorMonitor->VerifyFound();
16253 imgViewInfo.subresourceRange.layerCount = 1;
16254
Tony Barbourd6673642016-05-05 14:46:39 -060016255 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016256 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016257 m_errorMonitor->SetDesiredFailureMsg(
16258 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16259 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016260 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16261 m_errorMonitor->VerifyFound();
16262 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16263
Tony Barbourd6673642016-05-05 14:46:39 -060016264 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16265 // VIEW_CREATE_ERROR
16266 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016268 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16269 m_errorMonitor->VerifyFound();
16270 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16271
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016272 // TODO: Update framework to easily passing mutable flag into ImageObj init
16273 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016274 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16275 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16276 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016277 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16278 // VIEW_CREATE_ERROR
16279 VkImageCreateInfo mutImgInfo = image.create_info();
16280 VkImage mutImage;
16281 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016282 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016283 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16284 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016285 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016286 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016287
16288 VkMemoryRequirements requirements;
16289 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16290
16291 VkMemoryAllocateInfo alloc_info{};
16292 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16293 alloc_info.pNext = NULL;
16294 alloc_info.memoryTypeIndex = 0;
16295 alloc_info.allocationSize = requirements.size;
16296 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16297 ASSERT_TRUE(pass);
16298
16299 VkDeviceMemory memory;
16300 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16301 ASSERT_VK_SUCCESS(ret);
16302
16303 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16304 ASSERT_VK_SUCCESS(ret);
16305
Tony Barbourd6673642016-05-05 14:46:39 -060016306 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016308 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16309 m_errorMonitor->VerifyFound();
16310 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016311
16312 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016313 vkDestroyImage(m_device->handle(), mutImage, NULL);
16314}
16315
Dave Houlton75967fc2017-03-06 17:21:16 -070016316TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16317 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16318
Tony Barbour1fa09702017-03-16 12:09:08 -060016319 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016320
Jamie Madill35127872017-03-15 16:17:46 -040016321 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016322 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16323 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16324 if (device_features.textureCompressionBC) {
16325 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16326 } else if (device_features.textureCompressionETC2) {
16327 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16328 } else if (device_features.textureCompressionASTC_LDR) {
16329 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16330 } else {
16331 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16332 return;
16333 }
16334
16335 VkImageCreateInfo ci;
16336 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16337 ci.pNext = NULL;
16338 ci.flags = 0;
16339 ci.imageType = VK_IMAGE_TYPE_2D;
16340 ci.format = compressed_format;
16341 ci.extent = {32, 32, 1};
16342 ci.mipLevels = 6;
16343 ci.arrayLayers = 1;
16344 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16345 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16346 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16347 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16348 ci.queueFamilyIndexCount = 0;
16349 ci.pQueueFamilyIndices = NULL;
16350 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16351
16352 VkImageObj image(m_device);
16353 image.init(&ci);
16354 ASSERT_TRUE(image.initialized());
16355
16356 VkImageObj odd_image(m_device);
16357 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16358 odd_image.init(&ci);
16359 ASSERT_TRUE(odd_image.initialized());
16360
16361 // Allocate buffers
16362 VkMemoryPropertyFlags reqs = 0;
16363 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16364 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16365 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16366 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16367 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16368
16369 VkBufferImageCopy region = {};
16370 region.bufferRowLength = 0;
16371 region.bufferImageHeight = 0;
16372 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16373 region.imageSubresource.layerCount = 1;
16374 region.imageOffset = {0, 0, 0};
16375 region.bufferOffset = 0;
16376
16377 // start recording
16378 m_commandBuffer->BeginCommandBuffer();
16379
16380 // Mip level copies that work - 5 levels
16381 m_errorMonitor->ExpectSuccess();
16382
16383 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16384 region.imageExtent = {32, 32, 1};
16385 region.imageSubresource.mipLevel = 0;
16386 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16387 &region);
16388 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16389 &region);
16390
16391 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16392 region.imageExtent = {8, 8, 1};
16393 region.imageSubresource.mipLevel = 2;
16394 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16395 &region);
16396 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16397 &region);
16398
16399 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16400 region.imageExtent = {4, 4, 1};
16401 region.imageSubresource.mipLevel = 3;
16402 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16403 &region);
16404 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16405 &region);
16406
16407 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16408 region.imageExtent = {2, 2, 1};
16409 region.imageSubresource.mipLevel = 4;
16410 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16411 &region);
16412 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16413 &region);
16414
16415 region.imageExtent = {1, 1, 1};
16416 region.imageSubresource.mipLevel = 5;
16417 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16418 &region);
16419 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16420 &region);
16421 m_errorMonitor->VerifyNotFound();
16422
16423 // Buffer must accomodate a full compressed block, regardless of texel count
16424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16425 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16426 &region);
16427 m_errorMonitor->VerifyFound();
16428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16429 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16430 &region);
16431 m_errorMonitor->VerifyFound();
16432
16433 // Copy width < compressed block size, but not the full mip width
16434 region.imageExtent = {1, 2, 1};
16435 region.imageSubresource.mipLevel = 4;
16436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16437 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16438 &region);
16439 m_errorMonitor->VerifyFound();
16440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16441 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16442 &region);
16443 m_errorMonitor->VerifyFound();
16444
16445 // Copy height < compressed block size but not the full mip height
16446 region.imageExtent = {2, 1, 1};
16447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16448 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16449 &region);
16450 m_errorMonitor->VerifyFound();
16451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16452 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16453 &region);
16454 m_errorMonitor->VerifyFound();
16455
16456 // Offsets must be multiple of compressed block size
16457 region.imageOffset = {1, 1, 0};
16458 region.imageExtent = {1, 1, 1};
16459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16460 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16461 &region);
16462 m_errorMonitor->VerifyFound();
16463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16464 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16465 &region);
16466 m_errorMonitor->VerifyFound();
16467
16468 // Offset + extent width = mip width - should succeed
16469 region.imageOffset = {4, 4, 0};
16470 region.imageExtent = {3, 4, 1};
16471 region.imageSubresource.mipLevel = 2;
16472 m_errorMonitor->ExpectSuccess();
16473 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16474 &region);
16475 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16476 &region);
16477 m_errorMonitor->VerifyNotFound();
16478
16479 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16480 region.imageExtent = {4, 4, 1};
16481 m_errorMonitor->ExpectSuccess();
16482 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16483 &region);
16484 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16485 &region);
16486 m_errorMonitor->VerifyNotFound();
16487
16488 // Offset + extent width < mip width and not a multiple of block width - should fail
16489 region.imageExtent = {3, 3, 1};
16490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16491 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16492 &region);
16493 m_errorMonitor->VerifyFound();
16494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16495 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16496 &region);
16497 m_errorMonitor->VerifyFound();
16498}
16499
Dave Houlton59a20702017-02-02 17:26:23 -070016500TEST_F(VkLayerTest, ImageBufferCopyTests) {
16501 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16502
Tony Barbour1fa09702017-03-16 12:09:08 -060016503 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016504 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16505 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16506 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16507 return;
16508 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016509
16510 // Bail if any dimension of transfer granularity is 0.
16511 auto index = m_device->graphics_queue_node_index_;
16512 auto queue_family_properties = m_device->phy().queue_properties();
16513 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16514 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16515 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16516 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16517 return;
16518 }
16519
Dave Houlton59a20702017-02-02 17:26:23 -070016520 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16521 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16522 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016523 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16524 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16525 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16526 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16527
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016528 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016529 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16530 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016531 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016532 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16533 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016534 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 -070016535 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016536 ASSERT_TRUE(image_64k.initialized());
16537 ASSERT_TRUE(image_16k.initialized());
16538 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016539
Dave Houltonf3229d52017-02-21 15:59:08 -070016540 // Verify all needed Depth/Stencil formats are supported
16541 bool missing_ds_support = false;
16542 VkFormatProperties props = {0, 0, 0};
16543 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16544 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16545 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16546 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16547 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16548 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16549 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16550 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16551
16552 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016553 ds_image_4D_1S.Init(
16554 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016555 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16556 VK_IMAGE_TILING_OPTIMAL, 0);
16557 ASSERT_TRUE(ds_image_4D_1S.initialized());
16558
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016559 ds_image_3D_1S.Init(
16560 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016561 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16562 VK_IMAGE_TILING_OPTIMAL, 0);
16563 ASSERT_TRUE(ds_image_3D_1S.initialized());
16564
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016565 ds_image_2D.Init(
16566 256, 256, 1, VK_FORMAT_D16_UNORM,
16567 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16568 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016569 ASSERT_TRUE(ds_image_2D.initialized());
16570
Dave Houlton11dcd5e2017-04-25 16:00:10 -060016571 ds_image_1S.Init(
16572 256, 256, 1, VK_FORMAT_S8_UINT,
16573 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16574 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016575 ASSERT_TRUE(ds_image_1S.initialized());
16576 }
16577
16578 // Allocate buffers
16579 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016580 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016581 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16582 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16583 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16584 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016585
16586 VkBufferImageCopy region = {};
16587 region.bufferRowLength = 0;
16588 region.bufferImageHeight = 0;
16589 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16590 region.imageSubresource.layerCount = 1;
16591 region.imageOffset = {0, 0, 0};
16592 region.imageExtent = {64, 64, 1};
16593 region.bufferOffset = 0;
16594
16595 // attempt copies before putting command buffer in recording state
16596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16597 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16598 &region);
16599 m_errorMonitor->VerifyFound();
16600
16601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16602 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16603 &region);
16604 m_errorMonitor->VerifyFound();
16605
16606 // start recording
16607 m_commandBuffer->BeginCommandBuffer();
16608
16609 // successful copies
16610 m_errorMonitor->ExpectSuccess();
16611 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16612 &region);
16613 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16614 &region);
16615 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16616 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16617 &region);
16618 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16619 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16620 &region);
16621 region.imageOffset.x = 0;
16622 region.imageExtent.height = 64;
16623 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16624 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16625 &region);
16626 m_errorMonitor->VerifyNotFound();
16627
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016628 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016629 region.imageExtent = {65, 64, 1};
16630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16631 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16632 &region);
16633 m_errorMonitor->VerifyFound();
16634
16635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16636 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16637 &region);
16638 m_errorMonitor->VerifyFound();
16639
16640 // image/buffer too small (offset) on copy to image
16641 region.imageExtent = {64, 64, 1};
16642 region.imageOffset = {0, 4, 0};
16643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16644 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16645 &region);
16646 m_errorMonitor->VerifyFound();
16647
16648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16649 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16650 &region);
16651 m_errorMonitor->VerifyFound();
16652
16653 // image/buffer too small on copy to buffer
16654 region.imageExtent = {64, 64, 1};
16655 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016656 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16658 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16659 &region);
16660 m_errorMonitor->VerifyFound();
16661
16662 region.imageExtent = {64, 65, 1};
16663 region.bufferOffset = 0;
16664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16665 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16666 &region);
16667 m_errorMonitor->VerifyFound();
16668
16669 // buffer size ok but rowlength causes loose packing
16670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16671 region.imageExtent = {64, 64, 1};
16672 region.bufferRowLength = 68;
16673 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16674 &region);
16675 m_errorMonitor->VerifyFound();
16676
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016677 // An extent with zero area should produce a warning, but no error
16678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16679 region.imageExtent.width = 0;
16680 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16681 &region);
16682 m_errorMonitor->VerifyFound();
16683
Dave Houlton59a20702017-02-02 17:26:23 -070016684 // aspect bits
16685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16686 region.imageExtent = {64, 64, 1};
16687 region.bufferRowLength = 0;
16688 region.bufferImageHeight = 0;
16689 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16690 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16691 buffer_16k.handle(), 1, &region);
16692 m_errorMonitor->VerifyFound();
16693
16694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16695 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16696 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16697 &region);
16698 m_errorMonitor->VerifyFound();
16699
16700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16701 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16702 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16703 buffer_16k.handle(), 1, &region);
16704 m_errorMonitor->VerifyFound();
16705
Dave Houltonf3229d52017-02-21 15:59:08 -070016706 // Test Depth/Stencil copies
16707 if (missing_ds_support) {
16708 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16709 } else {
16710 VkBufferImageCopy ds_region = {};
16711 ds_region.bufferOffset = 0;
16712 ds_region.bufferRowLength = 0;
16713 ds_region.bufferImageHeight = 0;
16714 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16715 ds_region.imageSubresource.mipLevel = 0;
16716 ds_region.imageSubresource.baseArrayLayer = 0;
16717 ds_region.imageSubresource.layerCount = 1;
16718 ds_region.imageOffset = {0, 0, 0};
16719 ds_region.imageExtent = {256, 256, 1};
16720
16721 // Depth copies that should succeed
16722 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16723 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16724 buffer_256k.handle(), 1, &ds_region);
16725 m_errorMonitor->VerifyNotFound();
16726
16727 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16728 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16729 buffer_256k.handle(), 1, &ds_region);
16730 m_errorMonitor->VerifyNotFound();
16731
16732 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16733 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16734 buffer_128k.handle(), 1, &ds_region);
16735 m_errorMonitor->VerifyNotFound();
16736
16737 // Depth copies that should fail
16738 ds_region.bufferOffset = 4;
16739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16740 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16741 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16742 buffer_256k.handle(), 1, &ds_region);
16743 m_errorMonitor->VerifyFound();
16744
16745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16746 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16747 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16748 buffer_256k.handle(), 1, &ds_region);
16749 m_errorMonitor->VerifyFound();
16750
16751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16752 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16753 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16754 buffer_128k.handle(), 1, &ds_region);
16755 m_errorMonitor->VerifyFound();
16756
16757 // Stencil copies that should succeed
16758 ds_region.bufferOffset = 0;
16759 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16760 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16761 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16762 buffer_64k.handle(), 1, &ds_region);
16763 m_errorMonitor->VerifyNotFound();
16764
16765 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16766 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16767 buffer_64k.handle(), 1, &ds_region);
16768 m_errorMonitor->VerifyNotFound();
16769
16770 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16771 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16772 buffer_64k.handle(), 1, &ds_region);
16773 m_errorMonitor->VerifyNotFound();
16774
16775 // Stencil copies that should fail
16776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16777 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16778 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16779 buffer_16k.handle(), 1, &ds_region);
16780 m_errorMonitor->VerifyFound();
16781
16782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16783 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16784 ds_region.bufferRowLength = 260;
16785 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16786 buffer_64k.handle(), 1, &ds_region);
16787 m_errorMonitor->VerifyFound();
16788
16789 ds_region.bufferRowLength = 0;
16790 ds_region.bufferOffset = 4;
16791 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16792 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16793 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16794 buffer_64k.handle(), 1, &ds_region);
16795 m_errorMonitor->VerifyFound();
16796 }
16797
Dave Houlton584d51e2017-02-16 12:52:54 -070016798 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016799 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016800 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016801 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16802 device_features.textureCompressionASTC_LDR)) {
16803 printf(" No compressed formats supported - block compression tests skipped.\n");
16804 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016805 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16806 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016807 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016808 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16809 0);
16810 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 -070016811 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016812 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016813 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 -070016814 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016815 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 -070016816 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016817 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016818 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 -070016819 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016820 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 -070016821 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016822 }
16823 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016824
Dave Houlton584d51e2017-02-16 12:52:54 -070016825 // Just fits
16826 m_errorMonitor->ExpectSuccess();
16827 region.imageExtent = {128, 128, 1};
16828 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16829 buffer_16k.handle(), 1, &region);
16830 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016831
Dave Houlton584d51e2017-02-16 12:52:54 -070016832 // with offset, too big for buffer
16833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16834 region.bufferOffset = 16;
16835 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16836 buffer_16k.handle(), 1, &region);
16837 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016838 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016839
Dave Houlton67e9b532017-03-02 17:00:10 -070016840 // extents that are not a multiple of compressed block size
16841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16842 region.imageExtent.width = 66;
16843 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16844 buffer_16k.handle(), 1, &region);
16845 m_errorMonitor->VerifyFound();
16846 region.imageExtent.width = 128;
16847
16848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016849 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016850 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16851 buffer_16k.handle(), 1, &region);
16852 m_errorMonitor->VerifyFound();
16853 region.imageExtent.height = 128;
16854
16855 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16856
16857 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16858 m_errorMonitor->ExpectSuccess();
16859 region.imageExtent.width = 66;
16860 region.imageOffset.x = 64;
16861 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16862 buffer_16k.handle(), 1, &region);
16863 region.imageExtent.width = 16;
16864 region.imageOffset.x = 0;
16865 region.imageExtent.height = 2;
16866 region.imageOffset.y = 128;
16867 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016868 buffer_16k.handle(), 1, &region);
16869 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016870 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016871
Dave Houlton584d51e2017-02-16 12:52:54 -070016872 // buffer offset must be a multiple of texel block size (16)
16873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16875 region.imageExtent = {64, 64, 1};
16876 region.bufferOffset = 24;
16877 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16878 buffer_16k.handle(), 1, &region);
16879 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016880
Dave Houlton584d51e2017-02-16 12:52:54 -070016881 // rowlength not a multiple of block width (4)
16882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16883 region.bufferOffset = 0;
16884 region.bufferRowLength = 130;
16885 region.bufferImageHeight = 0;
16886 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16887 buffer_64k.handle(), 1, &region);
16888 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016889
Dave Houlton584d51e2017-02-16 12:52:54 -070016890 // imageheight not a multiple of block height (4)
16891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16892 region.bufferRowLength = 0;
16893 region.bufferImageHeight = 130;
16894 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16895 buffer_64k.handle(), 1, &region);
16896 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016897 }
Dave Houlton59a20702017-02-02 17:26:23 -070016898}
16899
Tony Barbourd6673642016-05-05 14:46:39 -060016900TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016901 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016902
Tony Barbour1fa09702017-03-16 12:09:08 -060016903 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016904
Rene Lindsay135204f2016-12-22 17:11:09 -070016905 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016906 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016907 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 -070016908 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016909 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016910 vk_testing::Buffer buffer;
16911 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016912 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016913 VkBufferImageCopy region = {};
16914 region.bufferRowLength = 128;
16915 region.bufferImageHeight = 128;
16916 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16917 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016918 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016919 region.imageExtent.height = 4;
16920 region.imageExtent.width = 4;
16921 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016922
16923 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016924 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 -070016925 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016926 ASSERT_TRUE(image2.initialized());
16927 vk_testing::Buffer buffer2;
16928 VkMemoryPropertyFlags reqs2 = 0;
16929 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16930 VkBufferImageCopy region2 = {};
16931 region2.bufferRowLength = 128;
16932 region2.bufferImageHeight = 128;
16933 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16934 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16935 region2.imageSubresource.layerCount = 1;
16936 region2.imageExtent.height = 4;
16937 region2.imageExtent.width = 4;
16938 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016939 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016940
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016941 // Image must have offset.z of 0 and extent.depth of 1
16942 // Introduce failure by setting imageExtent.depth to 0
16943 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016945 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016946 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016947 m_errorMonitor->VerifyFound();
16948
16949 region.imageExtent.depth = 1;
16950
16951 // Image must have offset.z of 0 and extent.depth of 1
16952 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016953 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016954 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016957 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016958 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016959 m_errorMonitor->VerifyFound();
16960
16961 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016962 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16963 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016964 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016966 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16967 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016968 m_errorMonitor->VerifyFound();
16969
16970 // BufferOffset must be a multiple of 4
16971 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016972 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016974 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16975 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016976 m_errorMonitor->VerifyFound();
16977
16978 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16979 region.bufferOffset = 0;
16980 region.imageExtent.height = 128;
16981 region.imageExtent.width = 128;
16982 // Introduce failure by setting bufferRowLength > 0 but less than width
16983 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016985 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16986 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016987 m_errorMonitor->VerifyFound();
16988
16989 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16990 region.bufferRowLength = 128;
16991 // Introduce failure by setting bufferRowHeight > 0 but less than height
16992 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016994 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16995 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016996 m_errorMonitor->VerifyFound();
16997
16998 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016999 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017000 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 -070017001 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017002 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017003 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 -070017004 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060017005 VkImageBlit blitRegion = {};
17006 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17007 blitRegion.srcSubresource.baseArrayLayer = 0;
17008 blitRegion.srcSubresource.layerCount = 1;
17009 blitRegion.srcSubresource.mipLevel = 0;
17010 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17011 blitRegion.dstSubresource.baseArrayLayer = 0;
17012 blitRegion.dstSubresource.layerCount = 1;
17013 blitRegion.dstSubresource.mipLevel = 0;
17014
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017015 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060017016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17017 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
17018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
17019 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017020 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
17021 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017022 m_errorMonitor->VerifyFound();
17023
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017025 VkImageMemoryBarrier img_barrier;
17026 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17027 img_barrier.pNext = NULL;
17028 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17029 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17030 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17031 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17032 img_barrier.image = image.handle();
17033 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17034 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17035 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17036 img_barrier.subresourceRange.baseArrayLayer = 0;
17037 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017038 img_barrier.subresourceRange.layerCount = 0;
17039 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017040 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17041 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017042 m_errorMonitor->VerifyFound();
17043 img_barrier.subresourceRange.layerCount = 1;
17044}
17045
17046TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017047 TEST_DESCRIPTION("Exceed the limits of image format ");
17048
Tony Barbour1fa09702017-03-16 12:09:08 -060017049 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017050
17051 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17052 {
17053 VkFormatProperties properties;
17054 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17055 if (properties.linearTilingFeatures == 0) {
17056 printf(" Image format not supported; skipped.\n");
17057 return;
17058 }
17059 }
17060
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017062 VkImageCreateInfo image_create_info = {};
17063 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17064 image_create_info.pNext = NULL;
17065 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017066 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017067 image_create_info.extent.width = 32;
17068 image_create_info.extent.height = 32;
17069 image_create_info.extent.depth = 1;
17070 image_create_info.mipLevels = 1;
17071 image_create_info.arrayLayers = 1;
17072 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17073 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17074 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17075 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17076 image_create_info.flags = 0;
17077
17078 VkImage nullImg;
17079 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017080 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17081 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017082 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017083 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17084 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17085 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017086 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017087
Tony Barbour0907e362017-03-09 15:05:30 -070017088 uint32_t maxDim =
17089 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17090 // If max mip levels exceeds image extents, skip the max mip levels test
17091 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17093 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17094 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17095 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17096 m_errorMonitor->VerifyFound();
17097 image_create_info.mipLevels = 1;
17098 }
Tony Barbourd6673642016-05-05 14:46:39 -060017099
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017101 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17102 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17103 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17104 m_errorMonitor->VerifyFound();
17105 image_create_info.arrayLayers = 1;
17106
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017108 int samples = imgFmtProps.sampleCounts >> 1;
17109 image_create_info.samples = (VkSampleCountFlagBits)samples;
17110 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17111 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17112 m_errorMonitor->VerifyFound();
17113 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17114
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17116 "pCreateInfo->initialLayout, must be "
17117 "VK_IMAGE_LAYOUT_UNDEFINED or "
17118 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017119 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17120 // Expect INVALID_LAYOUT
17121 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17122 m_errorMonitor->VerifyFound();
17123 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17124}
17125
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017126TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017127 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017129
Tony Barbour1fa09702017-03-16 12:09:08 -060017130 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017131
17132 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017133 src_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017134 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017135 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017136
Tony Barbour552f6c02016-12-21 14:34:07 -070017137 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017138 VkImageCopy copy_region;
17139 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17140 copy_region.srcSubresource.mipLevel = 0;
17141 copy_region.srcSubresource.baseArrayLayer = 0;
17142 copy_region.srcSubresource.layerCount = 0;
17143 copy_region.srcOffset.x = 0;
17144 copy_region.srcOffset.y = 0;
17145 copy_region.srcOffset.z = 0;
17146 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17147 copy_region.dstSubresource.mipLevel = 0;
17148 copy_region.dstSubresource.baseArrayLayer = 0;
17149 copy_region.dstSubresource.layerCount = 0;
17150 copy_region.dstOffset.x = 0;
17151 copy_region.dstOffset.y = 0;
17152 copy_region.dstOffset.z = 0;
17153 copy_region.extent.width = 64;
17154 copy_region.extent.height = 64;
17155 copy_region.extent.depth = 1;
17156 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17157 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017158 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017159
17160 m_errorMonitor->VerifyFound();
17161}
17162
17163TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017164 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017166
Tony Barbour1fa09702017-03-16 12:09:08 -060017167 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017168
17169 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017170 src_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017171 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017172 dst_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017173
Tony Barbour552f6c02016-12-21 14:34:07 -070017174 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017175 VkImageCopy copy_region;
17176 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17177 copy_region.srcSubresource.mipLevel = 0;
17178 copy_region.srcSubresource.baseArrayLayer = 0;
17179 copy_region.srcSubresource.layerCount = 0;
17180 copy_region.srcOffset.x = 0;
17181 copy_region.srcOffset.y = 0;
17182 copy_region.srcOffset.z = 0;
17183 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17184 copy_region.dstSubresource.mipLevel = 0;
17185 copy_region.dstSubresource.baseArrayLayer = 0;
17186 copy_region.dstSubresource.layerCount = 0;
17187 copy_region.dstOffset.x = 0;
17188 copy_region.dstOffset.y = 0;
17189 copy_region.dstOffset.z = 0;
17190 copy_region.extent.width = 64;
17191 copy_region.extent.height = 64;
17192 copy_region.extent.depth = 1;
17193 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17194 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017195 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017196
17197 m_errorMonitor->VerifyFound();
17198}
17199
Karl Schultz6addd812016-02-02 17:17:23 -070017200TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017201 VkResult err;
17202 bool pass;
17203
17204 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017206
Tony Barbour1fa09702017-03-16 12:09:08 -060017207 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017208
17209 // Create two images of different types and try to copy between them
17210 VkImage srcImage;
17211 VkImage dstImage;
17212 VkDeviceMemory srcMem;
17213 VkDeviceMemory destMem;
17214 VkMemoryRequirements memReqs;
17215
17216 VkImageCreateInfo image_create_info = {};
17217 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17218 image_create_info.pNext = NULL;
17219 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17220 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17221 image_create_info.extent.width = 32;
17222 image_create_info.extent.height = 32;
17223 image_create_info.extent.depth = 1;
17224 image_create_info.mipLevels = 1;
17225 image_create_info.arrayLayers = 1;
17226 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17227 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17228 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17229 image_create_info.flags = 0;
17230
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017231 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017232 ASSERT_VK_SUCCESS(err);
17233
17234 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17235 // Introduce failure by creating second image with a different-sized format.
17236 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017237 VkFormatProperties properties;
17238 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17239 if (properties.optimalTilingFeatures == 0) {
17240 printf(" Image format not supported; skipped.\n");
17241 return;
17242 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017243
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017244 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017245 ASSERT_VK_SUCCESS(err);
17246
17247 // Allocate memory
17248 VkMemoryAllocateInfo memAlloc = {};
17249 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17250 memAlloc.pNext = NULL;
17251 memAlloc.allocationSize = 0;
17252 memAlloc.memoryTypeIndex = 0;
17253
17254 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17255 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017256 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017257 ASSERT_TRUE(pass);
17258 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17259 ASSERT_VK_SUCCESS(err);
17260
17261 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17262 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017263 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017264 ASSERT_TRUE(pass);
17265 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17266 ASSERT_VK_SUCCESS(err);
17267
17268 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17269 ASSERT_VK_SUCCESS(err);
17270 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17271 ASSERT_VK_SUCCESS(err);
17272
Tony Barbour552f6c02016-12-21 14:34:07 -070017273 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017274 VkImageCopy copyRegion;
17275 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17276 copyRegion.srcSubresource.mipLevel = 0;
17277 copyRegion.srcSubresource.baseArrayLayer = 0;
17278 copyRegion.srcSubresource.layerCount = 0;
17279 copyRegion.srcOffset.x = 0;
17280 copyRegion.srcOffset.y = 0;
17281 copyRegion.srcOffset.z = 0;
17282 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17283 copyRegion.dstSubresource.mipLevel = 0;
17284 copyRegion.dstSubresource.baseArrayLayer = 0;
17285 copyRegion.dstSubresource.layerCount = 0;
17286 copyRegion.dstOffset.x = 0;
17287 copyRegion.dstOffset.y = 0;
17288 copyRegion.dstOffset.z = 0;
17289 copyRegion.extent.width = 1;
17290 copyRegion.extent.height = 1;
17291 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017292 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017293 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017294
17295 m_errorMonitor->VerifyFound();
17296
17297 vkDestroyImage(m_device->device(), srcImage, NULL);
17298 vkDestroyImage(m_device->device(), dstImage, NULL);
17299 vkFreeMemory(m_device->device(), srcMem, NULL);
17300 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017301}
17302
Karl Schultz6addd812016-02-02 17:17:23 -070017303TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17304 VkResult err;
17305 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017306
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017307 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17309 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017310
Tony Barbour1fa09702017-03-16 12:09:08 -060017311 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017312 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017313 if (!depth_format) {
17314 return;
17315 }
Mike Stroyana3082432015-09-25 13:39:21 -060017316
17317 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017318 VkImage srcImage;
17319 VkImage dstImage;
17320 VkDeviceMemory srcMem;
17321 VkDeviceMemory destMem;
17322 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017323
17324 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017325 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17326 image_create_info.pNext = NULL;
17327 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017328 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017329 image_create_info.extent.width = 32;
17330 image_create_info.extent.height = 32;
17331 image_create_info.extent.depth = 1;
17332 image_create_info.mipLevels = 1;
17333 image_create_info.arrayLayers = 1;
17334 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060017335 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070017336 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17337 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017338 VkFormatProperties properties;
17339 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17340 if (properties.optimalTilingFeatures == 0) {
17341 printf(" Image format not supported; skipped.\n");
17342 return;
17343 }
Mike Stroyana3082432015-09-25 13:39:21 -060017344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017345 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017346 ASSERT_VK_SUCCESS(err);
17347
Karl Schultzbdb75952016-04-19 11:36:49 -060017348 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17349
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017350 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017351 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017352 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017353 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017354
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017355 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017356 ASSERT_VK_SUCCESS(err);
17357
17358 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017359 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017360 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17361 memAlloc.pNext = NULL;
17362 memAlloc.allocationSize = 0;
17363 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017364
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017365 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017366 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017367 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017368 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017369 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017370 ASSERT_VK_SUCCESS(err);
17371
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017372 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017373 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017374 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017375 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017376 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017377 ASSERT_VK_SUCCESS(err);
17378
17379 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17380 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017381 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017382 ASSERT_VK_SUCCESS(err);
17383
Tony Barbour552f6c02016-12-21 14:34:07 -070017384 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017385 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017386 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017387 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017388 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017389 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017390 copyRegion.srcOffset.x = 0;
17391 copyRegion.srcOffset.y = 0;
17392 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017393 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017394 copyRegion.dstSubresource.mipLevel = 0;
17395 copyRegion.dstSubresource.baseArrayLayer = 0;
17396 copyRegion.dstSubresource.layerCount = 0;
17397 copyRegion.dstOffset.x = 0;
17398 copyRegion.dstOffset.y = 0;
17399 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017400 copyRegion.extent.width = 1;
17401 copyRegion.extent.height = 1;
17402 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017403 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017404 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017405
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017406 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017407
Chia-I Wuf7458c52015-10-26 21:10:41 +080017408 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017409 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017410 vkFreeMemory(m_device->device(), srcMem, NULL);
17411 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017412}
17413
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017414TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17415 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017416
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017417 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017418
17419 VkImageFormatProperties image_format_properties;
17420 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17421 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17422 &image_format_properties);
17423
17424 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17425 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17426 printf(" Image multi-sample support not found; skipped.\n");
17427 return;
17428 }
17429
17430 VkImageCreateInfo ci;
17431 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17432 ci.pNext = NULL;
17433 ci.flags = 0;
17434 ci.imageType = VK_IMAGE_TYPE_2D;
17435 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17436 ci.extent = {128, 128, 1};
17437 ci.mipLevels = 1;
17438 ci.arrayLayers = 1;
17439 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17440 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17441 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17442 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17443 ci.queueFamilyIndexCount = 0;
17444 ci.pQueueFamilyIndices = NULL;
17445 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17446
17447 VkImageObj image1(m_device);
17448 image1.init(&ci);
17449 ASSERT_TRUE(image1.initialized());
17450
17451 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17452 VkImageObj image2(m_device);
17453 image2.init(&ci);
17454 ASSERT_TRUE(image2.initialized());
17455
17456 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17457 VkImageObj image4(m_device);
17458 image4.init(&ci);
17459 ASSERT_TRUE(image4.initialized());
17460
17461 m_commandBuffer->BeginCommandBuffer();
17462
17463 VkImageCopy copyRegion;
17464 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17465 copyRegion.srcSubresource.mipLevel = 0;
17466 copyRegion.srcSubresource.baseArrayLayer = 0;
17467 copyRegion.srcSubresource.layerCount = 1;
17468 copyRegion.srcOffset = {0, 0, 0};
17469 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17470 copyRegion.dstSubresource.mipLevel = 0;
17471 copyRegion.dstSubresource.baseArrayLayer = 0;
17472 copyRegion.dstSubresource.layerCount = 1;
17473 copyRegion.dstOffset = {0, 0, 0};
17474 copyRegion.extent = {128, 128, 1};
17475
17476 // Copy a single sample image to/from a multi-sample image
17477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17478 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17479 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17480 m_errorMonitor->VerifyFound();
17481
17482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17483 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17484 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17485 m_errorMonitor->VerifyFound();
17486
17487 // Copy between multi-sample images with different sample counts
17488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17489 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17490 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17491 m_errorMonitor->VerifyFound();
17492
17493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17494 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17495 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17496 m_errorMonitor->VerifyFound();
17497
17498 m_commandBuffer->EndCommandBuffer();
17499}
17500
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017501TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17502 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017503 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017504 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017505 if (!ds_format) {
17506 return;
17507 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017508
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017509 VkFormatProperties properties;
17510 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
17511 if (properties.optimalTilingFeatures == 0) {
17512 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
17513 return;
17514 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017515 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017516 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 -060017517 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 -060017518 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017519 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17520 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017521 ASSERT_TRUE(color_image.initialized());
17522 ASSERT_TRUE(depth_image.initialized());
17523 ASSERT_TRUE(ds_image.initialized());
17524
17525 VkImageCopy copyRegion;
17526 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17527 copyRegion.srcSubresource.mipLevel = 0;
17528 copyRegion.srcSubresource.baseArrayLayer = 0;
17529 copyRegion.srcSubresource.layerCount = 1;
17530 copyRegion.srcOffset = {0, 0, 0};
17531 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17532 copyRegion.dstSubresource.mipLevel = 0;
17533 copyRegion.dstSubresource.baseArrayLayer = 0;
17534 copyRegion.dstSubresource.layerCount = 1;
17535 copyRegion.dstOffset = {64, 0, 0};
17536 copyRegion.extent = {64, 128, 1};
17537
17538 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17540 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17541 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17542 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017543 m_errorMonitor->VerifyFound();
17544
17545 m_commandBuffer->BeginCommandBuffer();
17546
17547 // Src and dest aspect masks don't match
17548 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017550 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17551 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017552 m_errorMonitor->VerifyFound();
17553 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17554
17555 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017556 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017557 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17559 // These aspect/format mismatches are redundant but unavoidable here
17560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017562 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17563 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017564 m_errorMonitor->VerifyFound();
17565 // Metadata aspect is illegal - VU 01222
17566 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17567 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17569 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017570 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17571 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017572 m_errorMonitor->VerifyFound();
17573
17574 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17575 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17576
17577 // Aspect mask doesn't match source image format - VU 01200
17578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17579 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17581 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17582 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17583 m_errorMonitor->VerifyFound();
17584
17585 // Aspect mask doesn't match dest image format - VU 01201
17586 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17587 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17589 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17591 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17592 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17593 m_errorMonitor->VerifyFound();
17594
17595 m_commandBuffer->EndCommandBuffer();
17596}
17597
Karl Schultz6addd812016-02-02 17:17:23 -070017598TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17599 VkResult err;
17600 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017601
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017602 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17603 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017604
Tony Barbour1fa09702017-03-16 12:09:08 -060017605 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017606
17607 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017608 VkImage srcImage;
17609 VkImage dstImage;
17610 VkDeviceMemory srcMem;
17611 VkDeviceMemory destMem;
17612 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017613
17614 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017615 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17616 image_create_info.pNext = NULL;
17617 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17618 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17619 image_create_info.extent.width = 32;
17620 image_create_info.extent.height = 1;
17621 image_create_info.extent.depth = 1;
17622 image_create_info.mipLevels = 1;
17623 image_create_info.arrayLayers = 1;
17624 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17625 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17626 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17627 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017628
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017629 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017630 ASSERT_VK_SUCCESS(err);
17631
Karl Schultz6addd812016-02-02 17:17:23 -070017632 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017633
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017634 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017635 ASSERT_VK_SUCCESS(err);
17636
17637 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017638 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017639 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17640 memAlloc.pNext = NULL;
17641 memAlloc.allocationSize = 0;
17642 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017643
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017644 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017645 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017646 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017647 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017648 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017649 ASSERT_VK_SUCCESS(err);
17650
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017651 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017652 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017653 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017654 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017655 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017656 ASSERT_VK_SUCCESS(err);
17657
17658 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17659 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017660 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017661 ASSERT_VK_SUCCESS(err);
17662
Tony Barbour552f6c02016-12-21 14:34:07 -070017663 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017664 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017665 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17666 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017667 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017668 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017669 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017670 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017671 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017672 resolveRegion.srcOffset.x = 0;
17673 resolveRegion.srcOffset.y = 0;
17674 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017675 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017676 resolveRegion.dstSubresource.mipLevel = 0;
17677 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017678 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017679 resolveRegion.dstOffset.x = 0;
17680 resolveRegion.dstOffset.y = 0;
17681 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017682 resolveRegion.extent.width = 1;
17683 resolveRegion.extent.height = 1;
17684 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017685 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017686 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017687
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017688 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017689
Chia-I Wuf7458c52015-10-26 21:10:41 +080017690 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017691 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017692 vkFreeMemory(m_device->device(), srcMem, NULL);
17693 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017694}
17695
Karl Schultz6addd812016-02-02 17:17:23 -070017696TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17697 VkResult err;
17698 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017699
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17701 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017702
Tony Barbour1fa09702017-03-16 12:09:08 -060017703 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017704
Chris Forbesa7530692016-05-08 12:35:39 +120017705 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017706 VkImage srcImage;
17707 VkImage dstImage;
17708 VkDeviceMemory srcMem;
17709 VkDeviceMemory destMem;
17710 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017711
17712 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017713 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17714 image_create_info.pNext = NULL;
17715 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17716 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17717 image_create_info.extent.width = 32;
17718 image_create_info.extent.height = 1;
17719 image_create_info.extent.depth = 1;
17720 image_create_info.mipLevels = 1;
17721 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017722 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017723 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17724 // Note: Some implementations expect color attachment usage for any
17725 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017726 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017727 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017728
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017729 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017730 ASSERT_VK_SUCCESS(err);
17731
Karl Schultz6addd812016-02-02 17:17:23 -070017732 // Note: Some implementations expect color attachment usage for any
17733 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017734 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017735
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017736 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017737 ASSERT_VK_SUCCESS(err);
17738
17739 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017740 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017741 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17742 memAlloc.pNext = NULL;
17743 memAlloc.allocationSize = 0;
17744 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017745
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017746 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017747 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017748 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017749 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017750 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017751 ASSERT_VK_SUCCESS(err);
17752
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017753 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017754 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017755 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017756 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017757 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017758 ASSERT_VK_SUCCESS(err);
17759
17760 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17761 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017762 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017763 ASSERT_VK_SUCCESS(err);
17764
Tony Barbour552f6c02016-12-21 14:34:07 -070017765 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017766 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017767 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17768 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017769 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017770 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017771 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017772 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017773 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017774 resolveRegion.srcOffset.x = 0;
17775 resolveRegion.srcOffset.y = 0;
17776 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017777 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017778 resolveRegion.dstSubresource.mipLevel = 0;
17779 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017780 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017781 resolveRegion.dstOffset.x = 0;
17782 resolveRegion.dstOffset.y = 0;
17783 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017784 resolveRegion.extent.width = 1;
17785 resolveRegion.extent.height = 1;
17786 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017787 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017788 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017789
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017790 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017791
Chia-I Wuf7458c52015-10-26 21:10:41 +080017792 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017793 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017794 vkFreeMemory(m_device->device(), srcMem, NULL);
17795 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017796}
17797
Karl Schultz6addd812016-02-02 17:17:23 -070017798TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17799 VkResult err;
17800 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017801
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017803 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017804
Tony Barbour1fa09702017-03-16 12:09:08 -060017805 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017806
17807 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017808 VkImage srcImage;
17809 VkImage dstImage;
17810 VkDeviceMemory srcMem;
17811 VkDeviceMemory destMem;
17812 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017813
17814 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017815 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17816 image_create_info.pNext = NULL;
17817 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17818 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17819 image_create_info.extent.width = 32;
17820 image_create_info.extent.height = 1;
17821 image_create_info.extent.depth = 1;
17822 image_create_info.mipLevels = 1;
17823 image_create_info.arrayLayers = 1;
17824 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17825 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17826 // Note: Some implementations expect color attachment usage for any
17827 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017828 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017829 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017830
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017831 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017832 ASSERT_VK_SUCCESS(err);
17833
Karl Schultz6addd812016-02-02 17:17:23 -070017834 // Set format to something other than source image
17835 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17836 // Note: Some implementations expect color attachment usage for any
17837 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017838 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017839 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017840
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017841 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017842 ASSERT_VK_SUCCESS(err);
17843
17844 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017845 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017846 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17847 memAlloc.pNext = NULL;
17848 memAlloc.allocationSize = 0;
17849 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017850
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017851 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017852 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017853 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017854 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017855 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017856 ASSERT_VK_SUCCESS(err);
17857
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017858 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017859 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017860 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017861 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017862 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017863 ASSERT_VK_SUCCESS(err);
17864
17865 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17866 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017867 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017868 ASSERT_VK_SUCCESS(err);
17869
Tony Barbour552f6c02016-12-21 14:34:07 -070017870 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017871 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017872 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17873 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017874 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017875 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017876 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017877 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017878 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017879 resolveRegion.srcOffset.x = 0;
17880 resolveRegion.srcOffset.y = 0;
17881 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017882 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017883 resolveRegion.dstSubresource.mipLevel = 0;
17884 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017885 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017886 resolveRegion.dstOffset.x = 0;
17887 resolveRegion.dstOffset.y = 0;
17888 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017889 resolveRegion.extent.width = 1;
17890 resolveRegion.extent.height = 1;
17891 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017892 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017893 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017894
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017895 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017896
Chia-I Wuf7458c52015-10-26 21:10:41 +080017897 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017898 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017899 vkFreeMemory(m_device->device(), srcMem, NULL);
17900 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017901}
17902
Karl Schultz6addd812016-02-02 17:17:23 -070017903TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17904 VkResult err;
17905 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017906
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017908 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017909
Tony Barbour1fa09702017-03-16 12:09:08 -060017910 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017911
17912 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017913 VkImage srcImage;
17914 VkImage dstImage;
17915 VkDeviceMemory srcMem;
17916 VkDeviceMemory destMem;
17917 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017918
17919 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017920 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17921 image_create_info.pNext = NULL;
17922 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17923 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17924 image_create_info.extent.width = 32;
17925 image_create_info.extent.height = 1;
17926 image_create_info.extent.depth = 1;
17927 image_create_info.mipLevels = 1;
17928 image_create_info.arrayLayers = 1;
17929 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17930 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17931 // Note: Some implementations expect color attachment usage for any
17932 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017933 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017934 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017935
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017936 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017937 ASSERT_VK_SUCCESS(err);
17938
Karl Schultz6addd812016-02-02 17:17:23 -070017939 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17940 // Note: Some implementations expect color attachment usage for any
17941 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017942 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017943 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017944
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017945 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017946 ASSERT_VK_SUCCESS(err);
17947
17948 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017949 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017950 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17951 memAlloc.pNext = NULL;
17952 memAlloc.allocationSize = 0;
17953 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017954
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017955 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017956 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017957 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017958 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017959 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017960 ASSERT_VK_SUCCESS(err);
17961
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017962 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017963 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017964 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017965 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017966 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017967 ASSERT_VK_SUCCESS(err);
17968
17969 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17970 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017971 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017972 ASSERT_VK_SUCCESS(err);
17973
Tony Barbour552f6c02016-12-21 14:34:07 -070017974 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017975 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017976 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17977 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017978 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017979 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017980 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017981 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017982 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017983 resolveRegion.srcOffset.x = 0;
17984 resolveRegion.srcOffset.y = 0;
17985 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017986 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017987 resolveRegion.dstSubresource.mipLevel = 0;
17988 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017989 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017990 resolveRegion.dstOffset.x = 0;
17991 resolveRegion.dstOffset.y = 0;
17992 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017993 resolveRegion.extent.width = 1;
17994 resolveRegion.extent.height = 1;
17995 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017996 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017997 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017998
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017999 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060018000
Chia-I Wuf7458c52015-10-26 21:10:41 +080018001 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018002 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018003 vkFreeMemory(m_device->device(), srcMem, NULL);
18004 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060018005}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018006
Karl Schultz6addd812016-02-02 17:17:23 -070018007TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018008 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070018009 // to using a DS format, then cause it to hit error due to COLOR_BIT not
18010 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018011 // The image format check comes 2nd in validation so we trigger it first,
18012 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070018013 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018014
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18016 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018017
Tony Barbour1fa09702017-03-16 12:09:08 -060018018 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018019 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018020 if (!depth_format) {
18021 return;
18022 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018023
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018024 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018025 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18026 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018027
18028 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018029 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18030 ds_pool_ci.pNext = NULL;
18031 ds_pool_ci.maxSets = 1;
18032 ds_pool_ci.poolSizeCount = 1;
18033 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018034
18035 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018036 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018037 ASSERT_VK_SUCCESS(err);
18038
18039 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018040 dsl_binding.binding = 0;
18041 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18042 dsl_binding.descriptorCount = 1;
18043 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18044 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018045
18046 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018047 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18048 ds_layout_ci.pNext = NULL;
18049 ds_layout_ci.bindingCount = 1;
18050 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018051 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018052 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018053 ASSERT_VK_SUCCESS(err);
18054
18055 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018056 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018057 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018058 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018059 alloc_info.descriptorPool = ds_pool;
18060 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018061 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018062 ASSERT_VK_SUCCESS(err);
18063
Karl Schultz6addd812016-02-02 17:17:23 -070018064 VkImage image_bad;
18065 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018066 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018067 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018068 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018069 const int32_t tex_width = 32;
18070 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018071
18072 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018073 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18074 image_create_info.pNext = NULL;
18075 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18076 image_create_info.format = tex_format_bad;
18077 image_create_info.extent.width = tex_width;
18078 image_create_info.extent.height = tex_height;
18079 image_create_info.extent.depth = 1;
18080 image_create_info.mipLevels = 1;
18081 image_create_info.arrayLayers = 1;
18082 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18083 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018084 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018085 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018086
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018087 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018088 ASSERT_VK_SUCCESS(err);
18089 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018090 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18091 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018092 ASSERT_VK_SUCCESS(err);
18093
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018094 // ---Bind image memory---
18095 VkMemoryRequirements img_mem_reqs;
18096 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18097 VkMemoryAllocateInfo image_alloc_info = {};
18098 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18099 image_alloc_info.pNext = NULL;
18100 image_alloc_info.memoryTypeIndex = 0;
18101 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018102 bool pass =
18103 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 -070018104 ASSERT_TRUE(pass);
18105 VkDeviceMemory mem;
18106 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18107 ASSERT_VK_SUCCESS(err);
18108 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18109 ASSERT_VK_SUCCESS(err);
18110 // -----------------------
18111
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018112 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018113 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018114 image_view_create_info.image = image_bad;
18115 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18116 image_view_create_info.format = tex_format_bad;
18117 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18118 image_view_create_info.subresourceRange.baseMipLevel = 0;
18119 image_view_create_info.subresourceRange.layerCount = 1;
18120 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018121 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018122
18123 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018124 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018125
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018126 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018127
Chia-I Wuf7458c52015-10-26 21:10:41 +080018128 vkDestroyImage(m_device->device(), image_bad, NULL);
18129 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018130 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18131 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018132
18133 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018134}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018135
18136TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018137 TEST_DESCRIPTION(
18138 "Call ClearColorImage w/ a depth|stencil image and "
18139 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018140
Tony Barbour1fa09702017-03-16 12:09:08 -060018141 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018142 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018143 if (!depth_format) {
18144 return;
18145 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18147
Tony Barbour552f6c02016-12-21 14:34:07 -070018148 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018149
18150 // Color image
18151 VkClearColorValue clear_color;
18152 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18153 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18154 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18155 const int32_t img_width = 32;
18156 const int32_t img_height = 32;
18157 VkImageCreateInfo image_create_info = {};
18158 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18159 image_create_info.pNext = NULL;
18160 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18161 image_create_info.format = color_format;
18162 image_create_info.extent.width = img_width;
18163 image_create_info.extent.height = img_height;
18164 image_create_info.extent.depth = 1;
18165 image_create_info.mipLevels = 1;
18166 image_create_info.arrayLayers = 1;
18167 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18168 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18169 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18170
18171 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018172 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018173
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018174 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018175
18176 // Depth/Stencil image
18177 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018178 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018179 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18180 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018181 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018182 ds_image_create_info.extent.width = 64;
18183 ds_image_create_info.extent.height = 64;
18184 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018185 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 -060018186
18187 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018188 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018189
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018190 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 -060018191
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018193
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018194 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018195 &color_range);
18196
18197 m_errorMonitor->VerifyFound();
18198
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18200 "vkCmdClearColorImage called with "
18201 "image created without "
18202 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018203
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018204 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018205 &color_range);
18206
18207 m_errorMonitor->VerifyFound();
18208
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018209 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18211 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018212
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018213 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18214 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018215
18216 m_errorMonitor->VerifyFound();
18217}
Tobin Ehliscde08892015-09-22 10:11:37 -060018218
Mike Schuchardt35fece12017-03-07 14:40:28 -070018219TEST_F(VkLayerTest, CommandQueueFlags) {
18220 TEST_DESCRIPTION(
18221 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18222 "graphics-only command");
18223
18224 ASSERT_NO_FATAL_FAILURE(Init());
18225
18226 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018227 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018228 printf(" Non-graphics queue family not found; skipped.\n");
18229 return;
18230 } else {
18231 // Create command pool on a non-graphics queue
18232 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18233
18234 // Setup command buffer on pool
18235 VkCommandBufferObj command_buffer(m_device, &command_pool);
18236 command_buffer.BeginCommandBuffer();
18237
18238 // Issue a graphics only command
18239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18240 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18241 command_buffer.SetViewport(0, 1, &viewport);
18242 m_errorMonitor->VerifyFound();
18243 }
18244}
18245
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018246// WSI Enabled Tests
18247//
Chris Forbes09368e42016-10-13 11:59:22 +130018248#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018249TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18250
18251#if defined(VK_USE_PLATFORM_XCB_KHR)
18252 VkSurfaceKHR surface = VK_NULL_HANDLE;
18253
18254 VkResult err;
18255 bool pass;
18256 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18257 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18258 // uint32_t swapchain_image_count = 0;
18259 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18260 // uint32_t image_index = 0;
18261 // VkPresentInfoKHR present_info = {};
18262
Tony Barbour1fa09702017-03-16 12:09:08 -060018263 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018264
18265 // Use the create function from one of the VK_KHR_*_surface extension in
18266 // order to create a surface, testing all known errors in the process,
18267 // before successfully creating a surface:
18268 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18270 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18271 pass = (err != VK_SUCCESS);
18272 ASSERT_TRUE(pass);
18273 m_errorMonitor->VerifyFound();
18274
18275 // Next, try to create a surface with the wrong
18276 // VkXcbSurfaceCreateInfoKHR::sType:
18277 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18278 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18280 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18281 pass = (err != VK_SUCCESS);
18282 ASSERT_TRUE(pass);
18283 m_errorMonitor->VerifyFound();
18284
18285 // Create a native window, and then correctly create a surface:
18286 xcb_connection_t *connection;
18287 xcb_screen_t *screen;
18288 xcb_window_t xcb_window;
18289 xcb_intern_atom_reply_t *atom_wm_delete_window;
18290
18291 const xcb_setup_t *setup;
18292 xcb_screen_iterator_t iter;
18293 int scr;
18294 uint32_t value_mask, value_list[32];
18295 int width = 1;
18296 int height = 1;
18297
18298 connection = xcb_connect(NULL, &scr);
18299 ASSERT_TRUE(connection != NULL);
18300 setup = xcb_get_setup(connection);
18301 iter = xcb_setup_roots_iterator(setup);
18302 while (scr-- > 0)
18303 xcb_screen_next(&iter);
18304 screen = iter.data;
18305
18306 xcb_window = xcb_generate_id(connection);
18307
18308 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18309 value_list[0] = screen->black_pixel;
18310 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18311
18312 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18313 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18314
18315 /* Magic code that will send notification when window is destroyed */
18316 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18317 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18318
18319 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18320 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18321 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18322 free(reply);
18323
18324 xcb_map_window(connection, xcb_window);
18325
18326 // Force the x/y coordinates to 100,100 results are identical in consecutive
18327 // runs
18328 const uint32_t coords[] = { 100, 100 };
18329 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18330
18331 // Finally, try to correctly create a surface:
18332 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18333 xcb_create_info.pNext = NULL;
18334 xcb_create_info.flags = 0;
18335 xcb_create_info.connection = connection;
18336 xcb_create_info.window = xcb_window;
18337 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18338 pass = (err == VK_SUCCESS);
18339 ASSERT_TRUE(pass);
18340
18341 // Check if surface supports presentation:
18342
18343 // 1st, do so without having queried the queue families:
18344 VkBool32 supported = false;
18345 // TODO: Get the following error to come out:
18346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18347 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18348 "function");
18349 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18350 pass = (err != VK_SUCCESS);
18351 // ASSERT_TRUE(pass);
18352 // m_errorMonitor->VerifyFound();
18353
18354 // Next, query a queue family index that's too large:
18355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18356 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18357 pass = (err != VK_SUCCESS);
18358 ASSERT_TRUE(pass);
18359 m_errorMonitor->VerifyFound();
18360
18361 // Finally, do so correctly:
18362 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18363 // SUPPORTED
18364 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18365 pass = (err == VK_SUCCESS);
18366 ASSERT_TRUE(pass);
18367
18368 // Before proceeding, try to create a swapchain without having called
18369 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18370 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18371 swapchain_create_info.pNext = NULL;
18372 swapchain_create_info.flags = 0;
18373 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18374 swapchain_create_info.surface = surface;
18375 swapchain_create_info.imageArrayLayers = 1;
18376 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18377 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18379 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18380 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18381 pass = (err != VK_SUCCESS);
18382 ASSERT_TRUE(pass);
18383 m_errorMonitor->VerifyFound();
18384
18385 // Get the surface capabilities:
18386 VkSurfaceCapabilitiesKHR surface_capabilities;
18387
18388 // Do so correctly (only error logged by this entrypoint is if the
18389 // extension isn't enabled):
18390 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18391 pass = (err == VK_SUCCESS);
18392 ASSERT_TRUE(pass);
18393
18394 // Get the surface formats:
18395 uint32_t surface_format_count;
18396
18397 // First, try without a pointer to surface_format_count:
18398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18399 "specified as NULL");
18400 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18401 pass = (err == VK_SUCCESS);
18402 ASSERT_TRUE(pass);
18403 m_errorMonitor->VerifyFound();
18404
18405 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18406 // correctly done a 1st try (to get the count):
18407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18408 surface_format_count = 0;
18409 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18410 pass = (err == VK_SUCCESS);
18411 ASSERT_TRUE(pass);
18412 m_errorMonitor->VerifyFound();
18413
18414 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18415 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18416 pass = (err == VK_SUCCESS);
18417 ASSERT_TRUE(pass);
18418
18419 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18420 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18421
18422 // Next, do a 2nd try with surface_format_count being set too high:
18423 surface_format_count += 5;
18424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18425 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18426 pass = (err == VK_SUCCESS);
18427 ASSERT_TRUE(pass);
18428 m_errorMonitor->VerifyFound();
18429
18430 // Finally, do a correct 1st and 2nd try:
18431 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18432 pass = (err == VK_SUCCESS);
18433 ASSERT_TRUE(pass);
18434 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18435 pass = (err == VK_SUCCESS);
18436 ASSERT_TRUE(pass);
18437
18438 // Get the surface present modes:
18439 uint32_t surface_present_mode_count;
18440
18441 // First, try without a pointer to surface_format_count:
18442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18443 "specified as NULL");
18444
18445 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18446 pass = (err == VK_SUCCESS);
18447 ASSERT_TRUE(pass);
18448 m_errorMonitor->VerifyFound();
18449
18450 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18451 // correctly done a 1st try (to get the count):
18452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18453 surface_present_mode_count = 0;
18454 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18455 (VkPresentModeKHR *)&surface_present_mode_count);
18456 pass = (err == VK_SUCCESS);
18457 ASSERT_TRUE(pass);
18458 m_errorMonitor->VerifyFound();
18459
18460 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18461 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18462 pass = (err == VK_SUCCESS);
18463 ASSERT_TRUE(pass);
18464
18465 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18466 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18467
18468 // Next, do a 2nd try with surface_format_count being set too high:
18469 surface_present_mode_count += 5;
18470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18471 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18472 pass = (err == VK_SUCCESS);
18473 ASSERT_TRUE(pass);
18474 m_errorMonitor->VerifyFound();
18475
18476 // Finally, do a correct 1st and 2nd try:
18477 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18478 pass = (err == VK_SUCCESS);
18479 ASSERT_TRUE(pass);
18480 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18481 pass = (err == VK_SUCCESS);
18482 ASSERT_TRUE(pass);
18483
18484 // Create a swapchain:
18485
18486 // First, try without a pointer to swapchain_create_info:
18487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18488 "specified as NULL");
18489
18490 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18491 pass = (err != VK_SUCCESS);
18492 ASSERT_TRUE(pass);
18493 m_errorMonitor->VerifyFound();
18494
18495 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18496 // sType:
18497 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18499
18500 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18501 pass = (err != VK_SUCCESS);
18502 ASSERT_TRUE(pass);
18503 m_errorMonitor->VerifyFound();
18504
18505 // Next, call with a NULL swapchain pointer:
18506 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18507 swapchain_create_info.pNext = NULL;
18508 swapchain_create_info.flags = 0;
18509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18510 "specified as NULL");
18511
18512 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18513 pass = (err != VK_SUCCESS);
18514 ASSERT_TRUE(pass);
18515 m_errorMonitor->VerifyFound();
18516
18517 // TODO: Enhance swapchain layer so that
18518 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18519
18520 // Next, call with a queue family index that's too large:
18521 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18522 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18523 swapchain_create_info.queueFamilyIndexCount = 2;
18524 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18526 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18527 pass = (err != VK_SUCCESS);
18528 ASSERT_TRUE(pass);
18529 m_errorMonitor->VerifyFound();
18530
18531 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18532 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18533 swapchain_create_info.queueFamilyIndexCount = 1;
18534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18535 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18536 "pCreateInfo->pQueueFamilyIndices).");
18537 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18538 pass = (err != VK_SUCCESS);
18539 ASSERT_TRUE(pass);
18540 m_errorMonitor->VerifyFound();
18541
18542 // Next, call with an invalid imageSharingMode:
18543 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18544 swapchain_create_info.queueFamilyIndexCount = 1;
18545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18546 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18547 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18548 pass = (err != VK_SUCCESS);
18549 ASSERT_TRUE(pass);
18550 m_errorMonitor->VerifyFound();
18551 // Fix for the future:
18552 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18553 // SUPPORTED
18554 swapchain_create_info.queueFamilyIndexCount = 0;
18555 queueFamilyIndex[0] = 0;
18556 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18557
18558 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18559 // Get the images from a swapchain:
18560 // Acquire an image from a swapchain:
18561 // Present an image to a swapchain:
18562 // Destroy the swapchain:
18563
18564 // TODOs:
18565 //
18566 // - Try destroying the device without first destroying the swapchain
18567 //
18568 // - Try destroying the device without first destroying the surface
18569 //
18570 // - Try destroying the surface without first destroying the swapchain
18571
18572 // Destroy the surface:
18573 vkDestroySurfaceKHR(instance(), surface, NULL);
18574
18575 // Tear down the window:
18576 xcb_destroy_window(connection, xcb_window);
18577 xcb_disconnect(connection);
18578
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018579#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018580 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018581#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018582}
Chris Forbes09368e42016-10-13 11:59:22 +130018583#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018584
18585//
18586// POSITIVE VALIDATION TESTS
18587//
18588// These tests do not expect to encounter ANY validation errors pass only if this is true
18589
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018590TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18591 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018592 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18594
18595 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18596 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018597 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018598 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18599 command_buffer_allocate_info.commandBufferCount = 1;
18600
18601 VkCommandBuffer secondary_command_buffer;
18602 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18603 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18604 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18605 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18606 command_buffer_inheritance_info.renderPass = m_renderPass;
18607 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18608
18609 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18610 command_buffer_begin_info.flags =
18611 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18612 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18613
18614 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18615 VkClearAttachment color_attachment;
18616 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18617 color_attachment.clearValue.color.float32[0] = 0;
18618 color_attachment.clearValue.color.float32[1] = 0;
18619 color_attachment.clearValue.color.float32[2] = 0;
18620 color_attachment.clearValue.color.float32[3] = 0;
18621 color_attachment.colorAttachment = 0;
18622 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18623 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18624}
18625
Tobin Ehlise0006882016-11-03 10:14:28 -060018626TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018627 TEST_DESCRIPTION(
18628 "Perform an image layout transition in a secondary command buffer followed "
18629 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018630 VkResult err;
18631 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018632 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018633 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018634 if (!depth_format) {
18635 return;
18636 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18638 // Allocate a secondary and primary cmd buffer
18639 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18640 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018641 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018642 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18643 command_buffer_allocate_info.commandBufferCount = 1;
18644
18645 VkCommandBuffer secondary_command_buffer;
18646 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18647 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18648 VkCommandBuffer primary_command_buffer;
18649 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18650 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18651 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18652 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18653 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18654 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18655 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18656
18657 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18658 ASSERT_VK_SUCCESS(err);
18659 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018660 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 -060018661 ASSERT_TRUE(image.initialized());
18662 VkImageMemoryBarrier img_barrier = {};
18663 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18664 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18665 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18666 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18667 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18668 img_barrier.image = image.handle();
18669 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18670 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18671 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18672 img_barrier.subresourceRange.baseArrayLayer = 0;
18673 img_barrier.subresourceRange.baseMipLevel = 0;
18674 img_barrier.subresourceRange.layerCount = 1;
18675 img_barrier.subresourceRange.levelCount = 1;
18676 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18677 0, nullptr, 1, &img_barrier);
18678 err = vkEndCommandBuffer(secondary_command_buffer);
18679 ASSERT_VK_SUCCESS(err);
18680
18681 // Now update primary cmd buffer to execute secondary and transitions image
18682 command_buffer_begin_info.pInheritanceInfo = nullptr;
18683 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18684 ASSERT_VK_SUCCESS(err);
18685 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18686 VkImageMemoryBarrier img_barrier2 = {};
18687 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18688 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18689 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18690 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18691 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18692 img_barrier2.image = image.handle();
18693 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18694 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18695 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18696 img_barrier2.subresourceRange.baseArrayLayer = 0;
18697 img_barrier2.subresourceRange.baseMipLevel = 0;
18698 img_barrier2.subresourceRange.layerCount = 1;
18699 img_barrier2.subresourceRange.levelCount = 1;
18700 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18701 nullptr, 1, &img_barrier2);
18702 err = vkEndCommandBuffer(primary_command_buffer);
18703 ASSERT_VK_SUCCESS(err);
18704 VkSubmitInfo submit_info = {};
18705 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18706 submit_info.commandBufferCount = 1;
18707 submit_info.pCommandBuffers = &primary_command_buffer;
18708 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18709 ASSERT_VK_SUCCESS(err);
18710 m_errorMonitor->VerifyNotFound();
18711 err = vkDeviceWaitIdle(m_device->device());
18712 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018713 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18714 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018715}
18716
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018717// This is a positive test. No failures are expected.
18718TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018719 TEST_DESCRIPTION(
18720 "Ensure that the vkUpdateDescriptorSets validation code "
18721 "is ignoring VkWriteDescriptorSet members that are not "
18722 "related to the descriptor type specified by "
18723 "VkWriteDescriptorSet::descriptorType. Correct "
18724 "validation behavior will result in the test running to "
18725 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018726
18727 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18728
Tony Barbour1fa09702017-03-16 12:09:08 -060018729 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018730
18731 // Image Case
18732 {
18733 m_errorMonitor->ExpectSuccess();
18734
18735 VkImage image;
18736 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18737 const int32_t tex_width = 32;
18738 const int32_t tex_height = 32;
18739 VkImageCreateInfo image_create_info = {};
18740 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18741 image_create_info.pNext = NULL;
18742 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18743 image_create_info.format = tex_format;
18744 image_create_info.extent.width = tex_width;
18745 image_create_info.extent.height = tex_height;
18746 image_create_info.extent.depth = 1;
18747 image_create_info.mipLevels = 1;
18748 image_create_info.arrayLayers = 1;
18749 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18750 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18751 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18752 image_create_info.flags = 0;
18753 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18754 ASSERT_VK_SUCCESS(err);
18755
18756 VkMemoryRequirements memory_reqs;
18757 VkDeviceMemory image_memory;
18758 bool pass;
18759 VkMemoryAllocateInfo memory_info = {};
18760 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18761 memory_info.pNext = NULL;
18762 memory_info.allocationSize = 0;
18763 memory_info.memoryTypeIndex = 0;
18764 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18765 memory_info.allocationSize = memory_reqs.size;
18766 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18767 ASSERT_TRUE(pass);
18768 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18769 ASSERT_VK_SUCCESS(err);
18770 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18771 ASSERT_VK_SUCCESS(err);
18772
18773 VkImageViewCreateInfo image_view_create_info = {};
18774 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18775 image_view_create_info.image = image;
18776 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18777 image_view_create_info.format = tex_format;
18778 image_view_create_info.subresourceRange.layerCount = 1;
18779 image_view_create_info.subresourceRange.baseMipLevel = 0;
18780 image_view_create_info.subresourceRange.levelCount = 1;
18781 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18782
18783 VkImageView view;
18784 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18785 ASSERT_VK_SUCCESS(err);
18786
18787 VkDescriptorPoolSize ds_type_count = {};
18788 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18789 ds_type_count.descriptorCount = 1;
18790
18791 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18792 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18793 ds_pool_ci.pNext = NULL;
18794 ds_pool_ci.maxSets = 1;
18795 ds_pool_ci.poolSizeCount = 1;
18796 ds_pool_ci.pPoolSizes = &ds_type_count;
18797
18798 VkDescriptorPool ds_pool;
18799 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18800 ASSERT_VK_SUCCESS(err);
18801
18802 VkDescriptorSetLayoutBinding dsl_binding = {};
18803 dsl_binding.binding = 0;
18804 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18805 dsl_binding.descriptorCount = 1;
18806 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18807 dsl_binding.pImmutableSamplers = NULL;
18808
18809 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18810 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18811 ds_layout_ci.pNext = NULL;
18812 ds_layout_ci.bindingCount = 1;
18813 ds_layout_ci.pBindings = &dsl_binding;
18814 VkDescriptorSetLayout ds_layout;
18815 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18816 ASSERT_VK_SUCCESS(err);
18817
18818 VkDescriptorSet descriptor_set;
18819 VkDescriptorSetAllocateInfo alloc_info = {};
18820 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18821 alloc_info.descriptorSetCount = 1;
18822 alloc_info.descriptorPool = ds_pool;
18823 alloc_info.pSetLayouts = &ds_layout;
18824 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18825 ASSERT_VK_SUCCESS(err);
18826
18827 VkDescriptorImageInfo image_info = {};
18828 image_info.imageView = view;
18829 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18830
18831 VkWriteDescriptorSet descriptor_write;
18832 memset(&descriptor_write, 0, sizeof(descriptor_write));
18833 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18834 descriptor_write.dstSet = descriptor_set;
18835 descriptor_write.dstBinding = 0;
18836 descriptor_write.descriptorCount = 1;
18837 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18838 descriptor_write.pImageInfo = &image_info;
18839
18840 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18841 // be
18842 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18843 // This will most likely produce a crash if the parameter_validation
18844 // layer
18845 // does not correctly ignore pBufferInfo.
18846 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18847 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18848
18849 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18850
18851 m_errorMonitor->VerifyNotFound();
18852
18853 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18854 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18855 vkDestroyImageView(m_device->device(), view, NULL);
18856 vkDestroyImage(m_device->device(), image, NULL);
18857 vkFreeMemory(m_device->device(), image_memory, NULL);
18858 }
18859
18860 // Buffer Case
18861 {
18862 m_errorMonitor->ExpectSuccess();
18863
18864 VkBuffer buffer;
18865 uint32_t queue_family_index = 0;
18866 VkBufferCreateInfo buffer_create_info = {};
18867 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18868 buffer_create_info.size = 1024;
18869 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18870 buffer_create_info.queueFamilyIndexCount = 1;
18871 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18872
18873 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18874 ASSERT_VK_SUCCESS(err);
18875
18876 VkMemoryRequirements memory_reqs;
18877 VkDeviceMemory buffer_memory;
18878 bool pass;
18879 VkMemoryAllocateInfo memory_info = {};
18880 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18881 memory_info.pNext = NULL;
18882 memory_info.allocationSize = 0;
18883 memory_info.memoryTypeIndex = 0;
18884
18885 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18886 memory_info.allocationSize = memory_reqs.size;
18887 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18888 ASSERT_TRUE(pass);
18889
18890 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18891 ASSERT_VK_SUCCESS(err);
18892 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18893 ASSERT_VK_SUCCESS(err);
18894
18895 VkDescriptorPoolSize ds_type_count = {};
18896 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18897 ds_type_count.descriptorCount = 1;
18898
18899 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18900 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18901 ds_pool_ci.pNext = NULL;
18902 ds_pool_ci.maxSets = 1;
18903 ds_pool_ci.poolSizeCount = 1;
18904 ds_pool_ci.pPoolSizes = &ds_type_count;
18905
18906 VkDescriptorPool ds_pool;
18907 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18908 ASSERT_VK_SUCCESS(err);
18909
18910 VkDescriptorSetLayoutBinding dsl_binding = {};
18911 dsl_binding.binding = 0;
18912 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18913 dsl_binding.descriptorCount = 1;
18914 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18915 dsl_binding.pImmutableSamplers = NULL;
18916
18917 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18918 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18919 ds_layout_ci.pNext = NULL;
18920 ds_layout_ci.bindingCount = 1;
18921 ds_layout_ci.pBindings = &dsl_binding;
18922 VkDescriptorSetLayout ds_layout;
18923 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18924 ASSERT_VK_SUCCESS(err);
18925
18926 VkDescriptorSet descriptor_set;
18927 VkDescriptorSetAllocateInfo alloc_info = {};
18928 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18929 alloc_info.descriptorSetCount = 1;
18930 alloc_info.descriptorPool = ds_pool;
18931 alloc_info.pSetLayouts = &ds_layout;
18932 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18933 ASSERT_VK_SUCCESS(err);
18934
18935 VkDescriptorBufferInfo buffer_info = {};
18936 buffer_info.buffer = buffer;
18937 buffer_info.offset = 0;
18938 buffer_info.range = 1024;
18939
18940 VkWriteDescriptorSet descriptor_write;
18941 memset(&descriptor_write, 0, sizeof(descriptor_write));
18942 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18943 descriptor_write.dstSet = descriptor_set;
18944 descriptor_write.dstBinding = 0;
18945 descriptor_write.descriptorCount = 1;
18946 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18947 descriptor_write.pBufferInfo = &buffer_info;
18948
18949 // Set pImageInfo and pTexelBufferView to invalid values, which should
18950 // be
18951 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18952 // This will most likely produce a crash if the parameter_validation
18953 // layer
18954 // does not correctly ignore pImageInfo.
18955 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18956 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18957
18958 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18959
18960 m_errorMonitor->VerifyNotFound();
18961
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018962 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18963 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18964 vkDestroyBuffer(m_device->device(), buffer, NULL);
18965 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18966 }
18967
18968 // Texel Buffer Case
18969 {
18970 m_errorMonitor->ExpectSuccess();
18971
18972 VkBuffer buffer;
18973 uint32_t queue_family_index = 0;
18974 VkBufferCreateInfo buffer_create_info = {};
18975 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18976 buffer_create_info.size = 1024;
18977 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18978 buffer_create_info.queueFamilyIndexCount = 1;
18979 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18980
18981 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18982 ASSERT_VK_SUCCESS(err);
18983
18984 VkMemoryRequirements memory_reqs;
18985 VkDeviceMemory buffer_memory;
18986 bool pass;
18987 VkMemoryAllocateInfo memory_info = {};
18988 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18989 memory_info.pNext = NULL;
18990 memory_info.allocationSize = 0;
18991 memory_info.memoryTypeIndex = 0;
18992
18993 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18994 memory_info.allocationSize = memory_reqs.size;
18995 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18996 ASSERT_TRUE(pass);
18997
18998 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18999 ASSERT_VK_SUCCESS(err);
19000 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
19001 ASSERT_VK_SUCCESS(err);
19002
19003 VkBufferViewCreateInfo buff_view_ci = {};
19004 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
19005 buff_view_ci.buffer = buffer;
19006 buff_view_ci.format = VK_FORMAT_R8_UNORM;
19007 buff_view_ci.range = VK_WHOLE_SIZE;
19008 VkBufferView buffer_view;
19009 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
19010
19011 VkDescriptorPoolSize ds_type_count = {};
19012 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19013 ds_type_count.descriptorCount = 1;
19014
19015 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19016 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19017 ds_pool_ci.pNext = NULL;
19018 ds_pool_ci.maxSets = 1;
19019 ds_pool_ci.poolSizeCount = 1;
19020 ds_pool_ci.pPoolSizes = &ds_type_count;
19021
19022 VkDescriptorPool ds_pool;
19023 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19024 ASSERT_VK_SUCCESS(err);
19025
19026 VkDescriptorSetLayoutBinding dsl_binding = {};
19027 dsl_binding.binding = 0;
19028 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19029 dsl_binding.descriptorCount = 1;
19030 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19031 dsl_binding.pImmutableSamplers = NULL;
19032
19033 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19034 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19035 ds_layout_ci.pNext = NULL;
19036 ds_layout_ci.bindingCount = 1;
19037 ds_layout_ci.pBindings = &dsl_binding;
19038 VkDescriptorSetLayout ds_layout;
19039 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19040 ASSERT_VK_SUCCESS(err);
19041
19042 VkDescriptorSet descriptor_set;
19043 VkDescriptorSetAllocateInfo alloc_info = {};
19044 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19045 alloc_info.descriptorSetCount = 1;
19046 alloc_info.descriptorPool = ds_pool;
19047 alloc_info.pSetLayouts = &ds_layout;
19048 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19049 ASSERT_VK_SUCCESS(err);
19050
19051 VkWriteDescriptorSet descriptor_write;
19052 memset(&descriptor_write, 0, sizeof(descriptor_write));
19053 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19054 descriptor_write.dstSet = descriptor_set;
19055 descriptor_write.dstBinding = 0;
19056 descriptor_write.descriptorCount = 1;
19057 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19058 descriptor_write.pTexelBufferView = &buffer_view;
19059
19060 // Set pImageInfo and pBufferInfo to invalid values, which should be
19061 // ignored for descriptorType ==
19062 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19063 // This will most likely produce a crash if the parameter_validation
19064 // layer
19065 // does not correctly ignore pImageInfo and pBufferInfo.
19066 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19067 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19068
19069 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19070
19071 m_errorMonitor->VerifyNotFound();
19072
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019073 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19074 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19075 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19076 vkDestroyBuffer(m_device->device(), buffer, NULL);
19077 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19078 }
19079}
19080
Tobin Ehlisf7428442016-10-25 07:58:24 -060019081TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19082 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19083
Tony Barbour1fa09702017-03-16 12:09:08 -060019084 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019085 // Create layout where two binding #s are "1"
19086 static const uint32_t NUM_BINDINGS = 3;
19087 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19088 dsl_binding[0].binding = 1;
19089 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19090 dsl_binding[0].descriptorCount = 1;
19091 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19092 dsl_binding[0].pImmutableSamplers = NULL;
19093 dsl_binding[1].binding = 0;
19094 dsl_binding[1].descriptorCount = 1;
19095 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19096 dsl_binding[1].descriptorCount = 1;
19097 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19098 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019099 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019100 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19101 dsl_binding[2].descriptorCount = 1;
19102 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19103 dsl_binding[2].pImmutableSamplers = NULL;
19104
19105 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19106 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19107 ds_layout_ci.pNext = NULL;
19108 ds_layout_ci.bindingCount = NUM_BINDINGS;
19109 ds_layout_ci.pBindings = dsl_binding;
19110 VkDescriptorSetLayout ds_layout;
19111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19112 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19113 m_errorMonitor->VerifyFound();
19114}
19115
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019116TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019117 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19118
Tony Barbour1fa09702017-03-16 12:09:08 -060019119 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019120
Tony Barbour552f6c02016-12-21 14:34:07 -070019121 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019122
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019123 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19124
19125 {
19126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19127 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19128 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19129 m_errorMonitor->VerifyFound();
19130 }
19131
19132 {
19133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19134 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19135 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19136 m_errorMonitor->VerifyFound();
19137 }
19138
19139 {
19140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19141 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
19142 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19143 m_errorMonitor->VerifyFound();
19144 }
19145
19146 {
19147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19148 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
19149 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19150 m_errorMonitor->VerifyFound();
19151 }
19152
19153 {
19154 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
19155 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
19156 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19157 m_errorMonitor->VerifyFound();
19158 }
19159
19160 {
19161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
19162 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19163 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19164 m_errorMonitor->VerifyFound();
19165 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019166
19167 {
19168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19169 VkRect2D scissor = {{-1, 0}, {16, 16}};
19170 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19171 m_errorMonitor->VerifyFound();
19172 }
19173
19174 {
19175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19176 VkRect2D scissor = {{0, -2}, {16, 16}};
19177 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19178 m_errorMonitor->VerifyFound();
19179 }
19180
19181 {
19182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19183 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
19184 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19185 m_errorMonitor->VerifyFound();
19186 }
19187
19188 {
19189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
19190 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19191 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19192 m_errorMonitor->VerifyFound();
19193 }
19194
Tony Barbour552f6c02016-12-21 14:34:07 -070019195 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019196}
19197
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019198// This is a positive test. No failures are expected.
19199TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19200 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19201 VkResult err;
19202
Tony Barbour1fa09702017-03-16 12:09:08 -060019203 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019204 m_errorMonitor->ExpectSuccess();
19205 VkDescriptorPoolSize ds_type_count = {};
19206 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19207 ds_type_count.descriptorCount = 2;
19208
19209 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19210 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19211 ds_pool_ci.pNext = NULL;
19212 ds_pool_ci.maxSets = 1;
19213 ds_pool_ci.poolSizeCount = 1;
19214 ds_pool_ci.pPoolSizes = &ds_type_count;
19215
19216 VkDescriptorPool ds_pool;
19217 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19218 ASSERT_VK_SUCCESS(err);
19219
19220 // Create layout with two uniform buffer descriptors w/ empty binding between them
19221 static const uint32_t NUM_BINDINGS = 3;
19222 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19223 dsl_binding[0].binding = 0;
19224 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19225 dsl_binding[0].descriptorCount = 1;
19226 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19227 dsl_binding[0].pImmutableSamplers = NULL;
19228 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019229 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019230 dsl_binding[2].binding = 2;
19231 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19232 dsl_binding[2].descriptorCount = 1;
19233 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19234 dsl_binding[2].pImmutableSamplers = NULL;
19235
19236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19238 ds_layout_ci.pNext = NULL;
19239 ds_layout_ci.bindingCount = NUM_BINDINGS;
19240 ds_layout_ci.pBindings = dsl_binding;
19241 VkDescriptorSetLayout ds_layout;
19242 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19243 ASSERT_VK_SUCCESS(err);
19244
19245 VkDescriptorSet descriptor_set = {};
19246 VkDescriptorSetAllocateInfo alloc_info = {};
19247 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19248 alloc_info.descriptorSetCount = 1;
19249 alloc_info.descriptorPool = ds_pool;
19250 alloc_info.pSetLayouts = &ds_layout;
19251 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19252 ASSERT_VK_SUCCESS(err);
19253
19254 // Create a buffer to be used for update
19255 VkBufferCreateInfo buff_ci = {};
19256 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19257 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19258 buff_ci.size = 256;
19259 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19260 VkBuffer buffer;
19261 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19262 ASSERT_VK_SUCCESS(err);
19263 // Have to bind memory to buffer before descriptor update
19264 VkMemoryAllocateInfo mem_alloc = {};
19265 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19266 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019267 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019268 mem_alloc.memoryTypeIndex = 0;
19269
19270 VkMemoryRequirements mem_reqs;
19271 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19272 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19273 if (!pass) {
19274 vkDestroyBuffer(m_device->device(), buffer, NULL);
19275 return;
19276 }
19277
19278 VkDeviceMemory mem;
19279 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19280 ASSERT_VK_SUCCESS(err);
19281 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19282 ASSERT_VK_SUCCESS(err);
19283
19284 // Only update the descriptor at binding 2
19285 VkDescriptorBufferInfo buff_info = {};
19286 buff_info.buffer = buffer;
19287 buff_info.offset = 0;
19288 buff_info.range = VK_WHOLE_SIZE;
19289 VkWriteDescriptorSet descriptor_write = {};
19290 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19291 descriptor_write.dstBinding = 2;
19292 descriptor_write.descriptorCount = 1;
19293 descriptor_write.pTexelBufferView = nullptr;
19294 descriptor_write.pBufferInfo = &buff_info;
19295 descriptor_write.pImageInfo = nullptr;
19296 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19297 descriptor_write.dstSet = descriptor_set;
19298
19299 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19300
19301 m_errorMonitor->VerifyNotFound();
19302 // Cleanup
19303 vkFreeMemory(m_device->device(), mem, NULL);
19304 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19305 vkDestroyBuffer(m_device->device(), buffer, NULL);
19306 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19307}
19308
19309// This is a positive test. No failures are expected.
19310TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19311 VkResult err;
19312 bool pass;
19313
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019314 TEST_DESCRIPTION(
19315 "Create a buffer, allocate memory, bind memory, destroy "
19316 "the buffer, create an image, and bind the same memory to "
19317 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019318
19319 m_errorMonitor->ExpectSuccess();
19320
Tony Barbour1fa09702017-03-16 12:09:08 -060019321 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019322
19323 VkBuffer buffer;
19324 VkImage image;
19325 VkDeviceMemory mem;
19326 VkMemoryRequirements mem_reqs;
19327
19328 VkBufferCreateInfo buf_info = {};
19329 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19330 buf_info.pNext = NULL;
19331 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19332 buf_info.size = 256;
19333 buf_info.queueFamilyIndexCount = 0;
19334 buf_info.pQueueFamilyIndices = NULL;
19335 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19336 buf_info.flags = 0;
19337 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19338 ASSERT_VK_SUCCESS(err);
19339
19340 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19341
19342 VkMemoryAllocateInfo alloc_info = {};
19343 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19344 alloc_info.pNext = NULL;
19345 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019346
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019347 // Ensure memory is big enough for both bindings
19348 alloc_info.allocationSize = 0x10000;
19349
19350 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19351 if (!pass) {
19352 vkDestroyBuffer(m_device->device(), buffer, NULL);
19353 return;
19354 }
19355
19356 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19357 ASSERT_VK_SUCCESS(err);
19358
19359 uint8_t *pData;
19360 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19361 ASSERT_VK_SUCCESS(err);
19362
19363 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19364
19365 vkUnmapMemory(m_device->device(), mem);
19366
19367 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19368 ASSERT_VK_SUCCESS(err);
19369
19370 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19371 // memory. In fact, it was never used by the GPU.
19372 // Just be be sure, wait for idle.
19373 vkDestroyBuffer(m_device->device(), buffer, NULL);
19374 vkDeviceWaitIdle(m_device->device());
19375
Tobin Ehlis6a005702016-12-28 15:25:56 -070019376 // Use optimal as some platforms report linear support but then fail image creation
19377 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19378 VkImageFormatProperties image_format_properties;
19379 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19380 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19381 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019382 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019383 vkFreeMemory(m_device->device(), mem, NULL);
19384 return;
19385 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019386 VkImageCreateInfo image_create_info = {};
19387 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19388 image_create_info.pNext = NULL;
19389 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19390 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19391 image_create_info.extent.width = 64;
19392 image_create_info.extent.height = 64;
19393 image_create_info.extent.depth = 1;
19394 image_create_info.mipLevels = 1;
19395 image_create_info.arrayLayers = 1;
19396 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019397 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019398 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19399 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19400 image_create_info.queueFamilyIndexCount = 0;
19401 image_create_info.pQueueFamilyIndices = NULL;
19402 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19403 image_create_info.flags = 0;
19404
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019405 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019406 * to be textures or it will be the staging image if they are not.
19407 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019408 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19409 ASSERT_VK_SUCCESS(err);
19410
19411 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19412
Tobin Ehlis6a005702016-12-28 15:25:56 -070019413 VkMemoryAllocateInfo mem_alloc = {};
19414 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19415 mem_alloc.pNext = NULL;
19416 mem_alloc.allocationSize = 0;
19417 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019418 mem_alloc.allocationSize = mem_reqs.size;
19419
19420 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19421 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019422 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019423 vkDestroyImage(m_device->device(), image, NULL);
19424 return;
19425 }
19426
19427 // VALIDATION FAILURE:
19428 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19429 ASSERT_VK_SUCCESS(err);
19430
19431 m_errorMonitor->VerifyNotFound();
19432
19433 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019434 vkDestroyImage(m_device->device(), image, NULL);
19435}
19436
Tony Barbourab713912017-02-02 14:17:35 -070019437// This is a positive test. No failures are expected.
19438TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19439 VkResult err;
19440
19441 TEST_DESCRIPTION(
19442 "Call all applicable destroy and free routines with NULL"
19443 "handles, expecting no validation errors");
19444
19445 m_errorMonitor->ExpectSuccess();
19446
Tony Barbour1fa09702017-03-16 12:09:08 -060019447 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019448 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19449 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19450 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19451 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19452 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19453 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19454 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19455 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19456 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19457 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19458 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19459 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19460 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19461 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19462 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19463 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19464 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19465 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19466 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19467 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19468
19469 VkCommandPool command_pool;
19470 VkCommandPoolCreateInfo pool_create_info{};
19471 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19472 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19473 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19474 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19475 VkCommandBuffer command_buffers[3] = {};
19476 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19477 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19478 command_buffer_allocate_info.commandPool = command_pool;
19479 command_buffer_allocate_info.commandBufferCount = 1;
19480 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19481 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19482 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19483 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19484
19485 VkDescriptorPoolSize ds_type_count = {};
19486 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19487 ds_type_count.descriptorCount = 1;
19488
19489 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19490 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19491 ds_pool_ci.pNext = NULL;
19492 ds_pool_ci.maxSets = 1;
19493 ds_pool_ci.poolSizeCount = 1;
19494 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19495 ds_pool_ci.pPoolSizes = &ds_type_count;
19496
19497 VkDescriptorPool ds_pool;
19498 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19499 ASSERT_VK_SUCCESS(err);
19500
19501 VkDescriptorSetLayoutBinding dsl_binding = {};
19502 dsl_binding.binding = 2;
19503 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19504 dsl_binding.descriptorCount = 1;
19505 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19506 dsl_binding.pImmutableSamplers = NULL;
19507 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19508 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19509 ds_layout_ci.pNext = NULL;
19510 ds_layout_ci.bindingCount = 1;
19511 ds_layout_ci.pBindings = &dsl_binding;
19512 VkDescriptorSetLayout ds_layout;
19513 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19514 ASSERT_VK_SUCCESS(err);
19515
19516 VkDescriptorSet descriptor_sets[3] = {};
19517 VkDescriptorSetAllocateInfo alloc_info = {};
19518 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19519 alloc_info.descriptorSetCount = 1;
19520 alloc_info.descriptorPool = ds_pool;
19521 alloc_info.pSetLayouts = &ds_layout;
19522 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19523 ASSERT_VK_SUCCESS(err);
19524 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19525 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19526 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19527
19528 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19529
19530 m_errorMonitor->VerifyNotFound();
19531}
19532
Tony Barbour626994c2017-02-08 15:29:37 -070019533TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019534 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019535
19536 m_errorMonitor->ExpectSuccess();
19537
Tony Barbour1fa09702017-03-16 12:09:08 -060019538 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019539 VkCommandBuffer cmd_bufs[4];
19540 VkCommandBufferAllocateInfo alloc_info;
19541 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19542 alloc_info.pNext = NULL;
19543 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019544 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019545 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19546 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19547 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019548 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019549 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19550 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019551 ASSERT_TRUE(image.initialized());
19552 VkCommandBufferBeginInfo cb_binfo;
19553 cb_binfo.pNext = NULL;
19554 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19555 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19556 cb_binfo.flags = 0;
19557 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19558 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19559 VkImageMemoryBarrier img_barrier = {};
19560 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19561 img_barrier.pNext = NULL;
19562 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19563 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19564 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19565 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19566 img_barrier.image = image.handle();
19567 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19568 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19569 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19570 img_barrier.subresourceRange.baseArrayLayer = 0;
19571 img_barrier.subresourceRange.baseMipLevel = 0;
19572 img_barrier.subresourceRange.layerCount = 1;
19573 img_barrier.subresourceRange.levelCount = 1;
19574 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19575 &img_barrier);
19576 vkEndCommandBuffer(cmd_bufs[0]);
19577 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19578 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19579 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19580 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19581 &img_barrier);
19582 vkEndCommandBuffer(cmd_bufs[1]);
19583 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19584 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19585 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19586 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19587 &img_barrier);
19588 vkEndCommandBuffer(cmd_bufs[2]);
19589 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19590 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19591 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19592 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19593 &img_barrier);
19594 vkEndCommandBuffer(cmd_bufs[3]);
19595
19596 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19597 VkSemaphore semaphore1, semaphore2;
19598 VkSemaphoreCreateInfo semaphore_create_info{};
19599 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19600 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19601 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19602 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19603 VkSubmitInfo submit_info[3];
19604 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19605 submit_info[0].pNext = nullptr;
19606 submit_info[0].commandBufferCount = 1;
19607 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19608 submit_info[0].signalSemaphoreCount = 1;
19609 submit_info[0].pSignalSemaphores = &semaphore1;
19610 submit_info[0].waitSemaphoreCount = 0;
19611 submit_info[0].pWaitDstStageMask = nullptr;
19612 submit_info[0].pWaitDstStageMask = flags;
19613 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19614 submit_info[1].pNext = nullptr;
19615 submit_info[1].commandBufferCount = 1;
19616 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19617 submit_info[1].waitSemaphoreCount = 1;
19618 submit_info[1].pWaitSemaphores = &semaphore1;
19619 submit_info[1].signalSemaphoreCount = 1;
19620 submit_info[1].pSignalSemaphores = &semaphore2;
19621 submit_info[1].pWaitDstStageMask = flags;
19622 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19623 submit_info[2].pNext = nullptr;
19624 submit_info[2].commandBufferCount = 2;
19625 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19626 submit_info[2].waitSemaphoreCount = 1;
19627 submit_info[2].pWaitSemaphores = &semaphore2;
19628 submit_info[2].signalSemaphoreCount = 0;
19629 submit_info[2].pSignalSemaphores = nullptr;
19630 submit_info[2].pWaitDstStageMask = flags;
19631 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19632 vkQueueWaitIdle(m_device->m_queue);
19633
19634 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19635 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19636 m_errorMonitor->VerifyNotFound();
19637}
19638
Tobin Ehlis953e8392016-11-17 10:54:13 -070019639TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19640 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19641 // We previously had a bug where dynamic offset of inactive bindings was still being used
19642 VkResult err;
19643 m_errorMonitor->ExpectSuccess();
19644
Tony Barbour1fa09702017-03-16 12:09:08 -060019645 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019646 ASSERT_NO_FATAL_FAILURE(InitViewport());
19647 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19648
19649 VkDescriptorPoolSize ds_type_count = {};
19650 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19651 ds_type_count.descriptorCount = 3;
19652
19653 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19654 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19655 ds_pool_ci.pNext = NULL;
19656 ds_pool_ci.maxSets = 1;
19657 ds_pool_ci.poolSizeCount = 1;
19658 ds_pool_ci.pPoolSizes = &ds_type_count;
19659
19660 VkDescriptorPool ds_pool;
19661 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19662 ASSERT_VK_SUCCESS(err);
19663
19664 const uint32_t BINDING_COUNT = 3;
19665 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019666 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019667 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19668 dsl_binding[0].descriptorCount = 1;
19669 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19670 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019671 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019672 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19673 dsl_binding[1].descriptorCount = 1;
19674 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19675 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019676 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019677 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19678 dsl_binding[2].descriptorCount = 1;
19679 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19680 dsl_binding[2].pImmutableSamplers = NULL;
19681
19682 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19683 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19684 ds_layout_ci.pNext = NULL;
19685 ds_layout_ci.bindingCount = BINDING_COUNT;
19686 ds_layout_ci.pBindings = dsl_binding;
19687 VkDescriptorSetLayout ds_layout;
19688 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19689 ASSERT_VK_SUCCESS(err);
19690
19691 VkDescriptorSet descriptor_set;
19692 VkDescriptorSetAllocateInfo alloc_info = {};
19693 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19694 alloc_info.descriptorSetCount = 1;
19695 alloc_info.descriptorPool = ds_pool;
19696 alloc_info.pSetLayouts = &ds_layout;
19697 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19698 ASSERT_VK_SUCCESS(err);
19699
19700 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19701 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19702 pipeline_layout_ci.pNext = NULL;
19703 pipeline_layout_ci.setLayoutCount = 1;
19704 pipeline_layout_ci.pSetLayouts = &ds_layout;
19705
19706 VkPipelineLayout pipeline_layout;
19707 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19708 ASSERT_VK_SUCCESS(err);
19709
19710 // Create two buffers to update the descriptors with
19711 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19712 uint32_t qfi = 0;
19713 VkBufferCreateInfo buffCI = {};
19714 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19715 buffCI.size = 2048;
19716 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19717 buffCI.queueFamilyIndexCount = 1;
19718 buffCI.pQueueFamilyIndices = &qfi;
19719
19720 VkBuffer dyub1;
19721 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19722 ASSERT_VK_SUCCESS(err);
19723 // buffer2
19724 buffCI.size = 1024;
19725 VkBuffer dyub2;
19726 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19727 ASSERT_VK_SUCCESS(err);
19728 // Allocate memory and bind to buffers
19729 VkMemoryAllocateInfo mem_alloc[2] = {};
19730 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19731 mem_alloc[0].pNext = NULL;
19732 mem_alloc[0].memoryTypeIndex = 0;
19733 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19734 mem_alloc[1].pNext = NULL;
19735 mem_alloc[1].memoryTypeIndex = 0;
19736
19737 VkMemoryRequirements mem_reqs1;
19738 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19739 VkMemoryRequirements mem_reqs2;
19740 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19741 mem_alloc[0].allocationSize = mem_reqs1.size;
19742 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19743 mem_alloc[1].allocationSize = mem_reqs2.size;
19744 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19745 if (!pass) {
19746 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19747 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19748 return;
19749 }
19750
19751 VkDeviceMemory mem1;
19752 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19753 ASSERT_VK_SUCCESS(err);
19754 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19755 ASSERT_VK_SUCCESS(err);
19756 VkDeviceMemory mem2;
19757 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19758 ASSERT_VK_SUCCESS(err);
19759 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19760 ASSERT_VK_SUCCESS(err);
19761 // Update descriptors
19762 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19763 buff_info[0].buffer = dyub1;
19764 buff_info[0].offset = 0;
19765 buff_info[0].range = 256;
19766 buff_info[1].buffer = dyub1;
19767 buff_info[1].offset = 256;
19768 buff_info[1].range = 512;
19769 buff_info[2].buffer = dyub2;
19770 buff_info[2].offset = 0;
19771 buff_info[2].range = 512;
19772
19773 VkWriteDescriptorSet descriptor_write;
19774 memset(&descriptor_write, 0, sizeof(descriptor_write));
19775 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19776 descriptor_write.dstSet = descriptor_set;
19777 descriptor_write.dstBinding = 0;
19778 descriptor_write.descriptorCount = BINDING_COUNT;
19779 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19780 descriptor_write.pBufferInfo = buff_info;
19781
19782 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19783
Tony Barbour552f6c02016-12-21 14:34:07 -070019784 m_commandBuffer->BeginCommandBuffer();
19785 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019786
19787 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019788 char const *vsSource =
19789 "#version 450\n"
19790 "\n"
19791 "out gl_PerVertex { \n"
19792 " vec4 gl_Position;\n"
19793 "};\n"
19794 "void main(){\n"
19795 " gl_Position = vec4(1);\n"
19796 "}\n";
19797 char const *fsSource =
19798 "#version 450\n"
19799 "\n"
19800 "layout(location=0) out vec4 x;\n"
19801 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19802 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19803 "void main(){\n"
19804 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19805 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019806 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19807 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19808 VkPipelineObj pipe(m_device);
19809 pipe.SetViewport(m_viewports);
19810 pipe.SetScissor(m_scissors);
19811 pipe.AddShader(&vs);
19812 pipe.AddShader(&fs);
19813 pipe.AddColorAttachment();
19814 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19815
19816 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19817 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19818 // we used to have a bug in this case.
19819 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19820 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19821 &descriptor_set, BINDING_COUNT, dyn_off);
19822 Draw(1, 0, 0, 0);
19823 m_errorMonitor->VerifyNotFound();
19824
19825 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19826 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19827 vkFreeMemory(m_device->device(), mem1, NULL);
19828 vkFreeMemory(m_device->device(), mem2, NULL);
19829
19830 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19831 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19832 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19833}
19834
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019835TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019836 TEST_DESCRIPTION(
19837 "Ensure that validations handling of non-coherent memory "
19838 "mapping while using VK_WHOLE_SIZE does not cause access "
19839 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019840 VkResult err;
19841 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019842 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019843
19844 VkDeviceMemory mem;
19845 VkMemoryRequirements mem_reqs;
19846 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019847 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019848 VkMemoryAllocateInfo alloc_info = {};
19849 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19850 alloc_info.pNext = NULL;
19851 alloc_info.memoryTypeIndex = 0;
19852
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019853 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019854 alloc_info.allocationSize = allocation_size;
19855
19856 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19857 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 -070019858 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019859 if (!pass) {
19860 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019861 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19862 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019863 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019864 pass = m_device->phy().set_memory_type(
19865 mem_reqs.memoryTypeBits, &alloc_info,
19866 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19867 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019868 if (!pass) {
19869 return;
19870 }
19871 }
19872 }
19873
19874 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19875 ASSERT_VK_SUCCESS(err);
19876
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019877 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019878 m_errorMonitor->ExpectSuccess();
19879 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19880 ASSERT_VK_SUCCESS(err);
19881 VkMappedMemoryRange mmr = {};
19882 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19883 mmr.memory = mem;
19884 mmr.offset = 0;
19885 mmr.size = VK_WHOLE_SIZE;
19886 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19887 ASSERT_VK_SUCCESS(err);
19888 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19889 ASSERT_VK_SUCCESS(err);
19890 m_errorMonitor->VerifyNotFound();
19891 vkUnmapMemory(m_device->device(), mem);
19892
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019893 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019894 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019895 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019896 ASSERT_VK_SUCCESS(err);
19897 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19898 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019899 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019900 mmr.size = VK_WHOLE_SIZE;
19901 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19902 ASSERT_VK_SUCCESS(err);
19903 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19904 ASSERT_VK_SUCCESS(err);
19905 m_errorMonitor->VerifyNotFound();
19906 vkUnmapMemory(m_device->device(), mem);
19907
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019908 // Map with offset and size
19909 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019910 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019911 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019912 ASSERT_VK_SUCCESS(err);
19913 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19914 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019915 mmr.offset = 4 * atom_size;
19916 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019917 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19918 ASSERT_VK_SUCCESS(err);
19919 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19920 ASSERT_VK_SUCCESS(err);
19921 m_errorMonitor->VerifyNotFound();
19922 vkUnmapMemory(m_device->device(), mem);
19923
19924 // Map without offset and flush WHOLE_SIZE with two separate offsets
19925 m_errorMonitor->ExpectSuccess();
19926 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19927 ASSERT_VK_SUCCESS(err);
19928 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19929 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019930 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019931 mmr.size = VK_WHOLE_SIZE;
19932 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19933 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019934 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019935 mmr.size = VK_WHOLE_SIZE;
19936 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19937 ASSERT_VK_SUCCESS(err);
19938 m_errorMonitor->VerifyNotFound();
19939 vkUnmapMemory(m_device->device(), mem);
19940
19941 vkFreeMemory(m_device->device(), mem, NULL);
19942}
19943
19944// This is a positive test. We used to expect error in this case but spec now allows it
19945TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19946 m_errorMonitor->ExpectSuccess();
19947 vk_testing::Fence testFence;
19948 VkFenceCreateInfo fenceInfo = {};
19949 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19950 fenceInfo.pNext = NULL;
19951
Tony Barbour1fa09702017-03-16 12:09:08 -060019952 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019953 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019954 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019955 VkResult result = vkResetFences(m_device->device(), 1, fences);
19956 ASSERT_VK_SUCCESS(result);
19957
19958 m_errorMonitor->VerifyNotFound();
19959}
19960
19961TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19962 m_errorMonitor->ExpectSuccess();
19963
Tony Barbour1fa09702017-03-16 12:09:08 -060019964 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019965 VkResult err;
19966
19967 // Record (empty!) command buffer that can be submitted multiple times
19968 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019969 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19970 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019971 m_commandBuffer->BeginCommandBuffer(&cbbi);
19972 m_commandBuffer->EndCommandBuffer();
19973
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019974 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019975 VkFence fence;
19976 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19977 ASSERT_VK_SUCCESS(err);
19978
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019979 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019980 VkSemaphore s1, s2;
19981 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19982 ASSERT_VK_SUCCESS(err);
19983 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19984 ASSERT_VK_SUCCESS(err);
19985
19986 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019987 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019988 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19989 ASSERT_VK_SUCCESS(err);
19990
19991 // Submit CB again, signaling s2.
19992 si.pSignalSemaphores = &s2;
19993 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19994 ASSERT_VK_SUCCESS(err);
19995
19996 // Wait for fence.
19997 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19998 ASSERT_VK_SUCCESS(err);
19999
20000 // CB is still in flight from second submission, but semaphore s1 is no
20001 // longer in flight. delete it.
20002 vkDestroySemaphore(m_device->device(), s1, nullptr);
20003
20004 m_errorMonitor->VerifyNotFound();
20005
20006 // Force device idle and clean up remaining objects
20007 vkDeviceWaitIdle(m_device->device());
20008 vkDestroySemaphore(m_device->device(), s2, nullptr);
20009 vkDestroyFence(m_device->device(), fence, nullptr);
20010}
20011
20012TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
20013 m_errorMonitor->ExpectSuccess();
20014
Tony Barbour1fa09702017-03-16 12:09:08 -060020015 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020016 VkResult err;
20017
20018 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020019 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020020 VkFence f1;
20021 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20022 ASSERT_VK_SUCCESS(err);
20023
20024 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020025 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020026 VkFence f2;
20027 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20028 ASSERT_VK_SUCCESS(err);
20029
20030 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020031 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020032 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20033
20034 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020035 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020036 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20037
20038 // Should have both retired!
20039 vkDestroyFence(m_device->device(), f1, nullptr);
20040 vkDestroyFence(m_device->device(), f2, nullptr);
20041
20042 m_errorMonitor->VerifyNotFound();
20043}
20044
20045TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020046 TEST_DESCRIPTION(
20047 "Verify that creating an image view from an image with valid usage "
20048 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020049
Tony Barbour1fa09702017-03-16 12:09:08 -060020050 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020051
20052 m_errorMonitor->ExpectSuccess();
20053 // Verify that we can create a view with usage INPUT_ATTACHMENT
20054 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020055 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 -060020056 ASSERT_TRUE(image.initialized());
20057 VkImageView imageView;
20058 VkImageViewCreateInfo ivci = {};
20059 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20060 ivci.image = image.handle();
20061 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20062 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20063 ivci.subresourceRange.layerCount = 1;
20064 ivci.subresourceRange.baseMipLevel = 0;
20065 ivci.subresourceRange.levelCount = 1;
20066 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20067
20068 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20069 m_errorMonitor->VerifyNotFound();
20070 vkDestroyImageView(m_device->device(), imageView, NULL);
20071}
20072
20073// This is a positive test. No failures are expected.
20074TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020075 TEST_DESCRIPTION(
20076 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20077 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020078
Tony Barbour1fa09702017-03-16 12:09:08 -060020079 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020080
20081 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020082 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020083 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020084
20085 m_errorMonitor->ExpectSuccess();
20086
20087 VkImage image;
20088 VkImageCreateInfo image_create_info = {};
20089 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20090 image_create_info.pNext = NULL;
20091 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20092 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20093 image_create_info.extent.width = 64;
20094 image_create_info.extent.height = 64;
20095 image_create_info.extent.depth = 1;
20096 image_create_info.mipLevels = 1;
20097 image_create_info.arrayLayers = 1;
20098 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20099 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20100 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20101 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20102 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20103 ASSERT_VK_SUCCESS(err);
20104
20105 VkMemoryRequirements memory_reqs;
20106 VkDeviceMemory memory_one, memory_two;
20107 bool pass;
20108 VkMemoryAllocateInfo memory_info = {};
20109 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20110 memory_info.pNext = NULL;
20111 memory_info.allocationSize = 0;
20112 memory_info.memoryTypeIndex = 0;
20113 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20114 // Find an image big enough to allow sparse mapping of 2 memory regions
20115 // Increase the image size until it is at least twice the
20116 // size of the required alignment, to ensure we can bind both
20117 // allocated memory blocks to the image on aligned offsets.
20118 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20119 vkDestroyImage(m_device->device(), image, nullptr);
20120 image_create_info.extent.width *= 2;
20121 image_create_info.extent.height *= 2;
20122 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20123 ASSERT_VK_SUCCESS(err);
20124 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20125 }
20126 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20127 // at the end of the first
20128 memory_info.allocationSize = memory_reqs.alignment;
20129 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20130 ASSERT_TRUE(pass);
20131 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20132 ASSERT_VK_SUCCESS(err);
20133 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20134 ASSERT_VK_SUCCESS(err);
20135 VkSparseMemoryBind binds[2];
20136 binds[0].flags = 0;
20137 binds[0].memory = memory_one;
20138 binds[0].memoryOffset = 0;
20139 binds[0].resourceOffset = 0;
20140 binds[0].size = memory_info.allocationSize;
20141 binds[1].flags = 0;
20142 binds[1].memory = memory_two;
20143 binds[1].memoryOffset = 0;
20144 binds[1].resourceOffset = memory_info.allocationSize;
20145 binds[1].size = memory_info.allocationSize;
20146
20147 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20148 opaqueBindInfo.image = image;
20149 opaqueBindInfo.bindCount = 2;
20150 opaqueBindInfo.pBinds = binds;
20151
20152 VkFence fence = VK_NULL_HANDLE;
20153 VkBindSparseInfo bindSparseInfo = {};
20154 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20155 bindSparseInfo.imageOpaqueBindCount = 1;
20156 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20157
20158 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20159 vkQueueWaitIdle(m_device->m_queue);
20160 vkDestroyImage(m_device->device(), image, NULL);
20161 vkFreeMemory(m_device->device(), memory_one, NULL);
20162 vkFreeMemory(m_device->device(), memory_two, NULL);
20163 m_errorMonitor->VerifyNotFound();
20164}
20165
20166TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020167 TEST_DESCRIPTION(
20168 "Ensure that CmdBeginRenderPass with an attachment's "
20169 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20170 "the command buffer has prior knowledge of that "
20171 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020172
20173 m_errorMonitor->ExpectSuccess();
20174
Tony Barbour1fa09702017-03-16 12:09:08 -060020175 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020176
20177 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020178 VkAttachmentDescription attachment = {0,
20179 VK_FORMAT_R8G8B8A8_UNORM,
20180 VK_SAMPLE_COUNT_1_BIT,
20181 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20182 VK_ATTACHMENT_STORE_OP_STORE,
20183 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20184 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20185 VK_IMAGE_LAYOUT_UNDEFINED,
20186 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020187
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020188 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020189
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020190 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020191
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020192 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020193
20194 VkRenderPass rp;
20195 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20196 ASSERT_VK_SUCCESS(err);
20197
20198 // A compatible framebuffer.
20199 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020200 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 -060020201 ASSERT_TRUE(image.initialized());
20202
20203 VkImageViewCreateInfo ivci = {
20204 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20205 nullptr,
20206 0,
20207 image.handle(),
20208 VK_IMAGE_VIEW_TYPE_2D,
20209 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020210 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20211 VK_COMPONENT_SWIZZLE_IDENTITY},
20212 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020213 };
20214 VkImageView view;
20215 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20216 ASSERT_VK_SUCCESS(err);
20217
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020218 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020219 VkFramebuffer fb;
20220 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20221 ASSERT_VK_SUCCESS(err);
20222
20223 // Record a single command buffer which uses this renderpass twice. The
20224 // bug is triggered at the beginning of the second renderpass, when the
20225 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020226 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 -070020227 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020228 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20229 vkCmdEndRenderPass(m_commandBuffer->handle());
20230 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20231
20232 m_errorMonitor->VerifyNotFound();
20233
20234 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020235 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020236
20237 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20238 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20239 vkDestroyImageView(m_device->device(), view, nullptr);
20240}
20241
20242TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020243 TEST_DESCRIPTION(
20244 "This test should pass. Create a Framebuffer and "
20245 "command buffer, bind them together, then destroy "
20246 "command pool and framebuffer and verify there are no "
20247 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020248
20249 m_errorMonitor->ExpectSuccess();
20250
Tony Barbour1fa09702017-03-16 12:09:08 -060020251 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020252
20253 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020254 VkAttachmentDescription attachment = {0,
20255 VK_FORMAT_R8G8B8A8_UNORM,
20256 VK_SAMPLE_COUNT_1_BIT,
20257 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20258 VK_ATTACHMENT_STORE_OP_STORE,
20259 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20260 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20261 VK_IMAGE_LAYOUT_UNDEFINED,
20262 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020263
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020264 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020265
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020266 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020267
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020268 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020269
20270 VkRenderPass rp;
20271 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20272 ASSERT_VK_SUCCESS(err);
20273
20274 // A compatible framebuffer.
20275 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020276 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 -060020277 ASSERT_TRUE(image.initialized());
20278
20279 VkImageViewCreateInfo ivci = {
20280 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20281 nullptr,
20282 0,
20283 image.handle(),
20284 VK_IMAGE_VIEW_TYPE_2D,
20285 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020286 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20287 VK_COMPONENT_SWIZZLE_IDENTITY},
20288 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020289 };
20290 VkImageView view;
20291 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20292 ASSERT_VK_SUCCESS(err);
20293
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020294 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020295 VkFramebuffer fb;
20296 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20297 ASSERT_VK_SUCCESS(err);
20298
20299 // Explicitly create a command buffer to bind the FB to so that we can then
20300 // destroy the command pool in order to implicitly free command buffer
20301 VkCommandPool command_pool;
20302 VkCommandPoolCreateInfo pool_create_info{};
20303 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20304 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20305 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20306 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20307
20308 VkCommandBuffer command_buffer;
20309 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20310 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20311 command_buffer_allocate_info.commandPool = command_pool;
20312 command_buffer_allocate_info.commandBufferCount = 1;
20313 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20314 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20315
20316 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020317 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 -060020318 VkCommandBufferBeginInfo begin_info{};
20319 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20320 vkBeginCommandBuffer(command_buffer, &begin_info);
20321
20322 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20323 vkCmdEndRenderPass(command_buffer);
20324 vkEndCommandBuffer(command_buffer);
20325 vkDestroyImageView(m_device->device(), view, nullptr);
20326 // Destroy command pool to implicitly free command buffer
20327 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20328 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20329 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20330 m_errorMonitor->VerifyNotFound();
20331}
20332
20333TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020334 TEST_DESCRIPTION(
20335 "Ensure that CmdBeginRenderPass applies the layout "
20336 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020337
20338 m_errorMonitor->ExpectSuccess();
20339
Tony Barbour1fa09702017-03-16 12:09:08 -060020340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020341
20342 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020343 VkAttachmentDescription attachment = {0,
20344 VK_FORMAT_R8G8B8A8_UNORM,
20345 VK_SAMPLE_COUNT_1_BIT,
20346 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20347 VK_ATTACHMENT_STORE_OP_STORE,
20348 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20349 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20350 VK_IMAGE_LAYOUT_UNDEFINED,
20351 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020352
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020353 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020354
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020355 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020356
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020357 VkSubpassDependency dep = {0,
20358 0,
20359 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20360 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20361 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20362 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20363 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020364
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020365 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020366
20367 VkResult err;
20368 VkRenderPass rp;
20369 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20370 ASSERT_VK_SUCCESS(err);
20371
20372 // A compatible framebuffer.
20373 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020374 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 -060020375 ASSERT_TRUE(image.initialized());
20376
20377 VkImageViewCreateInfo ivci = {
20378 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20379 nullptr,
20380 0,
20381 image.handle(),
20382 VK_IMAGE_VIEW_TYPE_2D,
20383 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020384 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20385 VK_COMPONENT_SWIZZLE_IDENTITY},
20386 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020387 };
20388 VkImageView view;
20389 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20390 ASSERT_VK_SUCCESS(err);
20391
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020392 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020393 VkFramebuffer fb;
20394 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20395 ASSERT_VK_SUCCESS(err);
20396
20397 // Record a single command buffer which issues a pipeline barrier w/
20398 // image memory barrier for the attachment. This detects the previously
20399 // missing tracking of the subpass layout by throwing a validation error
20400 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020401 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 -070020402 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020403 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20404
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020405 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20406 nullptr,
20407 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20408 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20409 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20410 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20411 VK_QUEUE_FAMILY_IGNORED,
20412 VK_QUEUE_FAMILY_IGNORED,
20413 image.handle(),
20414 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020415 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020416 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20417 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020418
20419 vkCmdEndRenderPass(m_commandBuffer->handle());
20420 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020421 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020422
20423 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20424 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20425 vkDestroyImageView(m_device->device(), view, nullptr);
20426}
20427
20428TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020429 TEST_DESCRIPTION(
20430 "Validate that when an imageView of a depth/stencil image "
20431 "is used as a depth/stencil framebuffer attachment, the "
20432 "aspectMask is ignored and both depth and stencil image "
20433 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020434
Tony Barbour1fa09702017-03-16 12:09:08 -060020435 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020436 VkFormatProperties format_properties;
20437 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20438 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20439 return;
20440 }
20441
20442 m_errorMonitor->ExpectSuccess();
20443
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020444 VkAttachmentDescription attachment = {0,
20445 VK_FORMAT_D32_SFLOAT_S8_UINT,
20446 VK_SAMPLE_COUNT_1_BIT,
20447 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20448 VK_ATTACHMENT_STORE_OP_STORE,
20449 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20450 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20451 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20452 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020453
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020454 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020455
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020456 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020457
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020458 VkSubpassDependency dep = {0,
20459 0,
20460 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20461 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20462 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20463 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20464 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020465
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020466 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020467
20468 VkResult err;
20469 VkRenderPass rp;
20470 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20471 ASSERT_VK_SUCCESS(err);
20472
20473 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020474 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20475 0x26, // usage
20476 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020477 ASSERT_TRUE(image.initialized());
20478 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20479
20480 VkImageViewCreateInfo ivci = {
20481 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20482 nullptr,
20483 0,
20484 image.handle(),
20485 VK_IMAGE_VIEW_TYPE_2D,
20486 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020487 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20488 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020489 };
20490 VkImageView view;
20491 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20492 ASSERT_VK_SUCCESS(err);
20493
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020494 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020495 VkFramebuffer fb;
20496 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20497 ASSERT_VK_SUCCESS(err);
20498
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020499 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 -070020500 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020501 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20502
20503 VkImageMemoryBarrier imb = {};
20504 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20505 imb.pNext = nullptr;
20506 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20507 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20508 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20509 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20510 imb.srcQueueFamilyIndex = 0;
20511 imb.dstQueueFamilyIndex = 0;
20512 imb.image = image.handle();
20513 imb.subresourceRange.aspectMask = 0x6;
20514 imb.subresourceRange.baseMipLevel = 0;
20515 imb.subresourceRange.levelCount = 0x1;
20516 imb.subresourceRange.baseArrayLayer = 0;
20517 imb.subresourceRange.layerCount = 0x1;
20518
20519 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020520 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20521 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020522
20523 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020524 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020525 QueueCommandBuffer(false);
20526 m_errorMonitor->VerifyNotFound();
20527
20528 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20529 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20530 vkDestroyImageView(m_device->device(), view, nullptr);
20531}
20532
20533TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020534 TEST_DESCRIPTION(
20535 "Ensure that layout transitions work correctly without "
20536 "errors, when an attachment reference is "
20537 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020538
20539 m_errorMonitor->ExpectSuccess();
20540
Tony Barbour1fa09702017-03-16 12:09:08 -060020541 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020542
20543 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020544 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020545
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020546 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020547
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020548 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020549
20550 VkRenderPass rp;
20551 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20552 ASSERT_VK_SUCCESS(err);
20553
20554 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020555 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020556 VkFramebuffer fb;
20557 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20558 ASSERT_VK_SUCCESS(err);
20559
20560 // Record a command buffer which just begins and ends the renderpass. The
20561 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020562 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 -070020563 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020564 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20565 vkCmdEndRenderPass(m_commandBuffer->handle());
20566 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020567 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020568
20569 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20570 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20571}
20572
20573// This is a positive test. No errors are expected.
20574TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020575 TEST_DESCRIPTION(
20576 "Create a stencil-only attachment with a LOAD_OP set to "
20577 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020578 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020579 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020580 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020581 if (!depth_format) {
20582 printf(" No Depth + Stencil format found. Skipped.\n");
20583 return;
20584 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020585 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020586 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020587 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20588 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020589 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20590 return;
20591 }
20592
Tony Barbourf887b162017-03-09 10:06:46 -070020593 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020594 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020595 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020596 VkAttachmentDescription att = {};
20597 VkAttachmentReference ref = {};
20598 att.format = depth_stencil_fmt;
20599 att.samples = VK_SAMPLE_COUNT_1_BIT;
20600 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20601 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20602 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20603 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20604 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20605 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20606
20607 VkClearValue clear;
20608 clear.depthStencil.depth = 1.0;
20609 clear.depthStencil.stencil = 0;
20610 ref.attachment = 0;
20611 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20612
20613 VkSubpassDescription subpass = {};
20614 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20615 subpass.flags = 0;
20616 subpass.inputAttachmentCount = 0;
20617 subpass.pInputAttachments = NULL;
20618 subpass.colorAttachmentCount = 0;
20619 subpass.pColorAttachments = NULL;
20620 subpass.pResolveAttachments = NULL;
20621 subpass.pDepthStencilAttachment = &ref;
20622 subpass.preserveAttachmentCount = 0;
20623 subpass.pPreserveAttachments = NULL;
20624
20625 VkRenderPass rp;
20626 VkRenderPassCreateInfo rp_info = {};
20627 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20628 rp_info.attachmentCount = 1;
20629 rp_info.pAttachments = &att;
20630 rp_info.subpassCount = 1;
20631 rp_info.pSubpasses = &subpass;
20632 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20633 ASSERT_VK_SUCCESS(result);
20634
20635 VkImageView *depthView = m_depthStencil->BindInfo();
20636 VkFramebufferCreateInfo fb_info = {};
20637 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20638 fb_info.pNext = NULL;
20639 fb_info.renderPass = rp;
20640 fb_info.attachmentCount = 1;
20641 fb_info.pAttachments = depthView;
20642 fb_info.width = 100;
20643 fb_info.height = 100;
20644 fb_info.layers = 1;
20645 VkFramebuffer fb;
20646 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20647 ASSERT_VK_SUCCESS(result);
20648
20649 VkRenderPassBeginInfo rpbinfo = {};
20650 rpbinfo.clearValueCount = 1;
20651 rpbinfo.pClearValues = &clear;
20652 rpbinfo.pNext = NULL;
20653 rpbinfo.renderPass = rp;
20654 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20655 rpbinfo.renderArea.extent.width = 100;
20656 rpbinfo.renderArea.extent.height = 100;
20657 rpbinfo.renderArea.offset.x = 0;
20658 rpbinfo.renderArea.offset.y = 0;
20659 rpbinfo.framebuffer = fb;
20660
20661 VkFence fence = {};
20662 VkFenceCreateInfo fence_ci = {};
20663 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20664 fence_ci.pNext = nullptr;
20665 fence_ci.flags = 0;
20666 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20667 ASSERT_VK_SUCCESS(result);
20668
20669 m_commandBuffer->BeginCommandBuffer();
20670 m_commandBuffer->BeginRenderPass(rpbinfo);
20671 m_commandBuffer->EndRenderPass();
20672 m_commandBuffer->EndCommandBuffer();
20673 m_commandBuffer->QueueCommandBuffer(fence);
20674
20675 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020676 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 -070020677 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020678 VkImageMemoryBarrier barrier = {};
20679 VkImageSubresourceRange range;
20680 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20681 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20682 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20683 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20684 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20685 barrier.image = m_depthStencil->handle();
20686 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20687 range.baseMipLevel = 0;
20688 range.levelCount = 1;
20689 range.baseArrayLayer = 0;
20690 range.layerCount = 1;
20691 barrier.subresourceRange = range;
20692 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20693 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20694 cmdbuf.BeginCommandBuffer();
20695 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 -070020696 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020697 barrier.srcAccessMask = 0;
20698 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20699 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20700 barrier.image = destImage.handle();
20701 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20702 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 -070020703 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020704 VkImageCopy cregion;
20705 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20706 cregion.srcSubresource.mipLevel = 0;
20707 cregion.srcSubresource.baseArrayLayer = 0;
20708 cregion.srcSubresource.layerCount = 1;
20709 cregion.srcOffset.x = 0;
20710 cregion.srcOffset.y = 0;
20711 cregion.srcOffset.z = 0;
20712 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20713 cregion.dstSubresource.mipLevel = 0;
20714 cregion.dstSubresource.baseArrayLayer = 0;
20715 cregion.dstSubresource.layerCount = 1;
20716 cregion.dstOffset.x = 0;
20717 cregion.dstOffset.y = 0;
20718 cregion.dstOffset.z = 0;
20719 cregion.extent.width = 100;
20720 cregion.extent.height = 100;
20721 cregion.extent.depth = 1;
20722 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020723 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020724 cmdbuf.EndCommandBuffer();
20725
20726 VkSubmitInfo submit_info;
20727 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20728 submit_info.pNext = NULL;
20729 submit_info.waitSemaphoreCount = 0;
20730 submit_info.pWaitSemaphores = NULL;
20731 submit_info.pWaitDstStageMask = NULL;
20732 submit_info.commandBufferCount = 1;
20733 submit_info.pCommandBuffers = &cmdbuf.handle();
20734 submit_info.signalSemaphoreCount = 0;
20735 submit_info.pSignalSemaphores = NULL;
20736
20737 m_errorMonitor->ExpectSuccess();
20738 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20739 m_errorMonitor->VerifyNotFound();
20740
20741 vkQueueWaitIdle(m_device->m_queue);
20742 vkDestroyFence(m_device->device(), fence, nullptr);
20743 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20744 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20745}
20746
20747// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020748TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20749 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20750
20751 m_errorMonitor->ExpectSuccess();
20752
Tony Barbour1fa09702017-03-16 12:09:08 -060020753 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020754 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020755 if (!depth_format) {
20756 printf(" No Depth + Stencil format found. Skipped.\n");
20757 return;
20758 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20760
20761 VkImageMemoryBarrier img_barrier = {};
20762 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20763 img_barrier.pNext = NULL;
20764 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20765 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20766 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20767 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20768 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20769 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20770 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20771 img_barrier.subresourceRange.baseArrayLayer = 0;
20772 img_barrier.subresourceRange.baseMipLevel = 0;
20773 img_barrier.subresourceRange.layerCount = 1;
20774 img_barrier.subresourceRange.levelCount = 1;
20775
20776 {
20777 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020778 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 -070020779 ASSERT_TRUE(img_color.initialized());
20780
20781 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020782 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 -070020783 ASSERT_TRUE(img_ds1.initialized());
20784
20785 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020786 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 -070020787 ASSERT_TRUE(img_ds2.initialized());
20788
20789 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020790 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 -070020791 ASSERT_TRUE(img_xfer_src.initialized());
20792
20793 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020794 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 -070020795 ASSERT_TRUE(img_xfer_dst.initialized());
20796
20797 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020798 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 -070020799 ASSERT_TRUE(img_sampled.initialized());
20800
20801 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020802 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 -070020803 ASSERT_TRUE(img_input.initialized());
20804
20805 const struct {
20806 VkImageObj &image_obj;
20807 VkImageLayout old_layout;
20808 VkImageLayout new_layout;
20809 } buffer_layouts[] = {
20810 // clang-format off
20811 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20812 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20813 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20814 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20815 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20816 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20817 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20818 // clang-format on
20819 };
20820 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20821
20822 m_commandBuffer->BeginCommandBuffer();
20823 for (uint32_t i = 0; i < layout_count; ++i) {
20824 img_barrier.image = buffer_layouts[i].image_obj.handle();
20825 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20826 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20827 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20828 : VK_IMAGE_ASPECT_COLOR_BIT;
20829
20830 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20831 img_barrier.newLayout = buffer_layouts[i].new_layout;
20832 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20833 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20834
20835 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20836 img_barrier.newLayout = buffer_layouts[i].old_layout;
20837 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20838 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20839 }
20840 m_commandBuffer->EndCommandBuffer();
20841
20842 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20843 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20844 }
20845 m_errorMonitor->VerifyNotFound();
20846}
20847
20848// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020849TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20850 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20851
20852 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020853 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020854
20855 VkEvent event;
20856 VkEventCreateInfo event_create_info{};
20857 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20858 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20859
20860 VkCommandPool command_pool;
20861 VkCommandPoolCreateInfo pool_create_info{};
20862 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20863 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20864 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20865 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20866
20867 VkCommandBuffer command_buffer;
20868 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20869 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20870 command_buffer_allocate_info.commandPool = command_pool;
20871 command_buffer_allocate_info.commandBufferCount = 1;
20872 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20873 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20874
20875 VkQueue queue = VK_NULL_HANDLE;
20876 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20877
20878 {
20879 VkCommandBufferBeginInfo begin_info{};
20880 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20881 vkBeginCommandBuffer(command_buffer, &begin_info);
20882
20883 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 -070020884 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020885 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20886 vkEndCommandBuffer(command_buffer);
20887 }
20888 {
20889 VkSubmitInfo submit_info{};
20890 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20891 submit_info.commandBufferCount = 1;
20892 submit_info.pCommandBuffers = &command_buffer;
20893 submit_info.signalSemaphoreCount = 0;
20894 submit_info.pSignalSemaphores = nullptr;
20895 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20896 }
20897 { vkSetEvent(m_device->device(), event); }
20898
20899 vkQueueWaitIdle(queue);
20900
20901 vkDestroyEvent(m_device->device(), event, nullptr);
20902 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20903 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20904
20905 m_errorMonitor->VerifyNotFound();
20906}
20907// This is a positive test. No errors should be generated.
20908TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20909 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20910
Tony Barbour1fa09702017-03-16 12:09:08 -060020911 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020912 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020913
20914 m_errorMonitor->ExpectSuccess();
20915
20916 VkQueryPool query_pool;
20917 VkQueryPoolCreateInfo query_pool_create_info{};
20918 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20919 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20920 query_pool_create_info.queryCount = 1;
20921 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20922
20923 VkCommandPool command_pool;
20924 VkCommandPoolCreateInfo pool_create_info{};
20925 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20926 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20927 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20928 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20929
20930 VkCommandBuffer command_buffer;
20931 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20932 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20933 command_buffer_allocate_info.commandPool = command_pool;
20934 command_buffer_allocate_info.commandBufferCount = 1;
20935 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20936 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20937
20938 VkCommandBuffer secondary_command_buffer;
20939 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20940 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20941
20942 VkQueue queue = VK_NULL_HANDLE;
20943 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20944
20945 uint32_t qfi = 0;
20946 VkBufferCreateInfo buff_create_info = {};
20947 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20948 buff_create_info.size = 1024;
20949 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20950 buff_create_info.queueFamilyIndexCount = 1;
20951 buff_create_info.pQueueFamilyIndices = &qfi;
20952
20953 VkResult err;
20954 VkBuffer buffer;
20955 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20956 ASSERT_VK_SUCCESS(err);
20957 VkMemoryAllocateInfo mem_alloc = {};
20958 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20959 mem_alloc.pNext = NULL;
20960 mem_alloc.allocationSize = 1024;
20961 mem_alloc.memoryTypeIndex = 0;
20962
20963 VkMemoryRequirements memReqs;
20964 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20965 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20966 if (!pass) {
20967 vkDestroyBuffer(m_device->device(), buffer, NULL);
20968 return;
20969 }
20970
20971 VkDeviceMemory mem;
20972 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20973 ASSERT_VK_SUCCESS(err);
20974 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20975 ASSERT_VK_SUCCESS(err);
20976
20977 VkCommandBufferInheritanceInfo hinfo = {};
20978 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20979 hinfo.renderPass = VK_NULL_HANDLE;
20980 hinfo.subpass = 0;
20981 hinfo.framebuffer = VK_NULL_HANDLE;
20982 hinfo.occlusionQueryEnable = VK_FALSE;
20983 hinfo.queryFlags = 0;
20984 hinfo.pipelineStatistics = 0;
20985
20986 {
20987 VkCommandBufferBeginInfo begin_info{};
20988 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20989 begin_info.pInheritanceInfo = &hinfo;
20990 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20991
20992 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20993 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20994
20995 vkEndCommandBuffer(secondary_command_buffer);
20996
20997 begin_info.pInheritanceInfo = nullptr;
20998 vkBeginCommandBuffer(command_buffer, &begin_info);
20999
21000 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
21001 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
21002
21003 vkEndCommandBuffer(command_buffer);
21004 }
21005 {
21006 VkSubmitInfo submit_info{};
21007 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21008 submit_info.commandBufferCount = 1;
21009 submit_info.pCommandBuffers = &command_buffer;
21010 submit_info.signalSemaphoreCount = 0;
21011 submit_info.pSignalSemaphores = nullptr;
21012 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21013 }
21014
21015 vkQueueWaitIdle(queue);
21016
21017 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21018 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21019 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
21020 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21021 vkDestroyBuffer(m_device->device(), buffer, NULL);
21022 vkFreeMemory(m_device->device(), mem, NULL);
21023
21024 m_errorMonitor->VerifyNotFound();
21025}
21026
21027// This is a positive test. No errors should be generated.
21028TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21029 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21030
Tony Barbour1fa09702017-03-16 12:09:08 -060021031 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021032 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021033
21034 m_errorMonitor->ExpectSuccess();
21035
21036 VkQueryPool query_pool;
21037 VkQueryPoolCreateInfo query_pool_create_info{};
21038 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21039 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21040 query_pool_create_info.queryCount = 1;
21041 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21042
21043 VkCommandPool command_pool;
21044 VkCommandPoolCreateInfo pool_create_info{};
21045 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21046 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21047 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21048 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21049
21050 VkCommandBuffer command_buffer[2];
21051 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21052 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21053 command_buffer_allocate_info.commandPool = command_pool;
21054 command_buffer_allocate_info.commandBufferCount = 2;
21055 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21056 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21057
21058 VkQueue queue = VK_NULL_HANDLE;
21059 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21060
21061 uint32_t qfi = 0;
21062 VkBufferCreateInfo buff_create_info = {};
21063 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21064 buff_create_info.size = 1024;
21065 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21066 buff_create_info.queueFamilyIndexCount = 1;
21067 buff_create_info.pQueueFamilyIndices = &qfi;
21068
21069 VkResult err;
21070 VkBuffer buffer;
21071 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21072 ASSERT_VK_SUCCESS(err);
21073 VkMemoryAllocateInfo mem_alloc = {};
21074 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21075 mem_alloc.pNext = NULL;
21076 mem_alloc.allocationSize = 1024;
21077 mem_alloc.memoryTypeIndex = 0;
21078
21079 VkMemoryRequirements memReqs;
21080 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21081 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21082 if (!pass) {
21083 vkDestroyBuffer(m_device->device(), buffer, NULL);
21084 return;
21085 }
21086
21087 VkDeviceMemory mem;
21088 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21089 ASSERT_VK_SUCCESS(err);
21090 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21091 ASSERT_VK_SUCCESS(err);
21092
21093 {
21094 VkCommandBufferBeginInfo begin_info{};
21095 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21096 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21097
21098 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21099 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21100
21101 vkEndCommandBuffer(command_buffer[0]);
21102
21103 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21104
21105 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21106
21107 vkEndCommandBuffer(command_buffer[1]);
21108 }
21109 {
21110 VkSubmitInfo submit_info{};
21111 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21112 submit_info.commandBufferCount = 2;
21113 submit_info.pCommandBuffers = command_buffer;
21114 submit_info.signalSemaphoreCount = 0;
21115 submit_info.pSignalSemaphores = nullptr;
21116 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21117 }
21118
21119 vkQueueWaitIdle(queue);
21120
21121 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21122 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21123 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21124 vkDestroyBuffer(m_device->device(), buffer, NULL);
21125 vkFreeMemory(m_device->device(), mem, NULL);
21126
21127 m_errorMonitor->VerifyNotFound();
21128}
21129
Tony Barbourc46924f2016-11-04 11:49:52 -060021130TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021131 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21132
Tony Barbour1fa09702017-03-16 12:09:08 -060021133 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021134 VkEvent event;
21135 VkEventCreateInfo event_create_info{};
21136 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21137 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21138
21139 VkCommandPool command_pool;
21140 VkCommandPoolCreateInfo pool_create_info{};
21141 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21142 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21143 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21144 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21145
21146 VkCommandBuffer command_buffer;
21147 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21148 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21149 command_buffer_allocate_info.commandPool = command_pool;
21150 command_buffer_allocate_info.commandBufferCount = 1;
21151 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21152 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21153
21154 VkQueue queue = VK_NULL_HANDLE;
21155 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21156
21157 {
21158 VkCommandBufferBeginInfo begin_info{};
21159 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21160 vkBeginCommandBuffer(command_buffer, &begin_info);
21161
21162 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021163 vkEndCommandBuffer(command_buffer);
21164 }
21165 {
21166 VkSubmitInfo submit_info{};
21167 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21168 submit_info.commandBufferCount = 1;
21169 submit_info.pCommandBuffers = &command_buffer;
21170 submit_info.signalSemaphoreCount = 0;
21171 submit_info.pSignalSemaphores = nullptr;
21172 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21173 }
21174 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21176 "that is already in use by a "
21177 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021178 vkSetEvent(m_device->device(), event);
21179 m_errorMonitor->VerifyFound();
21180 }
21181
21182 vkQueueWaitIdle(queue);
21183
21184 vkDestroyEvent(m_device->device(), event, nullptr);
21185 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21186 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21187}
21188
21189// This is a positive test. No errors should be generated.
21190TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021191 TEST_DESCRIPTION(
21192 "Two command buffers with two separate fences are each "
21193 "run through a Submit & WaitForFences cycle 3 times. This "
21194 "previously revealed a bug so running this positive test "
21195 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021196 m_errorMonitor->ExpectSuccess();
21197
Tony Barbour1fa09702017-03-16 12:09:08 -060021198 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021199 VkQueue queue = VK_NULL_HANDLE;
21200 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21201
21202 static const uint32_t NUM_OBJECTS = 2;
21203 static const uint32_t NUM_FRAMES = 3;
21204 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21205 VkFence fences[NUM_OBJECTS] = {};
21206
21207 VkCommandPool cmd_pool;
21208 VkCommandPoolCreateInfo cmd_pool_ci = {};
21209 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21210 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
21211 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21212 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
21213 ASSERT_VK_SUCCESS(err);
21214
21215 VkCommandBufferAllocateInfo cmd_buf_info = {};
21216 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21217 cmd_buf_info.commandPool = cmd_pool;
21218 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21219 cmd_buf_info.commandBufferCount = 1;
21220
21221 VkFenceCreateInfo fence_ci = {};
21222 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21223 fence_ci.pNext = nullptr;
21224 fence_ci.flags = 0;
21225
21226 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21227 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21228 ASSERT_VK_SUCCESS(err);
21229 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21230 ASSERT_VK_SUCCESS(err);
21231 }
21232
21233 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21234 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21235 // Create empty cmd buffer
21236 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21237 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21238
21239 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21240 ASSERT_VK_SUCCESS(err);
21241 err = vkEndCommandBuffer(cmd_buffers[obj]);
21242 ASSERT_VK_SUCCESS(err);
21243
21244 VkSubmitInfo submit_info = {};
21245 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21246 submit_info.commandBufferCount = 1;
21247 submit_info.pCommandBuffers = &cmd_buffers[obj];
21248 // Submit cmd buffer and wait for fence
21249 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21250 ASSERT_VK_SUCCESS(err);
21251 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21252 ASSERT_VK_SUCCESS(err);
21253 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21254 ASSERT_VK_SUCCESS(err);
21255 }
21256 }
21257 m_errorMonitor->VerifyNotFound();
21258 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21259 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21260 vkDestroyFence(m_device->device(), fences[i], nullptr);
21261 }
21262}
21263// This is a positive test. No errors should be generated.
21264TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021265 TEST_DESCRIPTION(
21266 "Two command buffers, each in a separate QueueSubmit call "
21267 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021268
Tony Barbour1fa09702017-03-16 12:09:08 -060021269 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021270 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021271
21272 m_errorMonitor->ExpectSuccess();
21273
21274 VkSemaphore semaphore;
21275 VkSemaphoreCreateInfo semaphore_create_info{};
21276 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21277 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21278
21279 VkCommandPool command_pool;
21280 VkCommandPoolCreateInfo pool_create_info{};
21281 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21282 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21283 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21284 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21285
21286 VkCommandBuffer command_buffer[2];
21287 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21288 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21289 command_buffer_allocate_info.commandPool = command_pool;
21290 command_buffer_allocate_info.commandBufferCount = 2;
21291 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21292 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21293
21294 VkQueue queue = VK_NULL_HANDLE;
21295 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21296
21297 {
21298 VkCommandBufferBeginInfo begin_info{};
21299 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21300 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21301
21302 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 -070021303 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021304
21305 VkViewport viewport{};
21306 viewport.maxDepth = 1.0f;
21307 viewport.minDepth = 0.0f;
21308 viewport.width = 512;
21309 viewport.height = 512;
21310 viewport.x = 0;
21311 viewport.y = 0;
21312 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21313 vkEndCommandBuffer(command_buffer[0]);
21314 }
21315 {
21316 VkCommandBufferBeginInfo begin_info{};
21317 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21318 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21319
21320 VkViewport viewport{};
21321 viewport.maxDepth = 1.0f;
21322 viewport.minDepth = 0.0f;
21323 viewport.width = 512;
21324 viewport.height = 512;
21325 viewport.x = 0;
21326 viewport.y = 0;
21327 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21328 vkEndCommandBuffer(command_buffer[1]);
21329 }
21330 {
21331 VkSubmitInfo submit_info{};
21332 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21333 submit_info.commandBufferCount = 1;
21334 submit_info.pCommandBuffers = &command_buffer[0];
21335 submit_info.signalSemaphoreCount = 1;
21336 submit_info.pSignalSemaphores = &semaphore;
21337 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21338 }
21339 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021340 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021341 VkSubmitInfo submit_info{};
21342 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21343 submit_info.commandBufferCount = 1;
21344 submit_info.pCommandBuffers = &command_buffer[1];
21345 submit_info.waitSemaphoreCount = 1;
21346 submit_info.pWaitSemaphores = &semaphore;
21347 submit_info.pWaitDstStageMask = flags;
21348 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21349 }
21350
21351 vkQueueWaitIdle(m_device->m_queue);
21352
21353 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21354 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21355 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21356
21357 m_errorMonitor->VerifyNotFound();
21358}
21359
21360// This is a positive test. No errors should be generated.
21361TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021362 TEST_DESCRIPTION(
21363 "Two command buffers, each in a separate QueueSubmit call "
21364 "submitted on separate queues, the second having a fence"
21365 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021366
Tony Barbour1fa09702017-03-16 12:09:08 -060021367 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021368 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021369
21370 m_errorMonitor->ExpectSuccess();
21371
21372 VkFence fence;
21373 VkFenceCreateInfo fence_create_info{};
21374 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21375 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21376
21377 VkSemaphore semaphore;
21378 VkSemaphoreCreateInfo semaphore_create_info{};
21379 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21380 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21381
21382 VkCommandPool command_pool;
21383 VkCommandPoolCreateInfo pool_create_info{};
21384 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21385 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21386 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21387 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21388
21389 VkCommandBuffer command_buffer[2];
21390 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21391 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21392 command_buffer_allocate_info.commandPool = command_pool;
21393 command_buffer_allocate_info.commandBufferCount = 2;
21394 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21395 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21396
21397 VkQueue queue = VK_NULL_HANDLE;
21398 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21399
21400 {
21401 VkCommandBufferBeginInfo begin_info{};
21402 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21403 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21404
21405 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 -070021406 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021407
21408 VkViewport viewport{};
21409 viewport.maxDepth = 1.0f;
21410 viewport.minDepth = 0.0f;
21411 viewport.width = 512;
21412 viewport.height = 512;
21413 viewport.x = 0;
21414 viewport.y = 0;
21415 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21416 vkEndCommandBuffer(command_buffer[0]);
21417 }
21418 {
21419 VkCommandBufferBeginInfo begin_info{};
21420 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21421 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21422
21423 VkViewport viewport{};
21424 viewport.maxDepth = 1.0f;
21425 viewport.minDepth = 0.0f;
21426 viewport.width = 512;
21427 viewport.height = 512;
21428 viewport.x = 0;
21429 viewport.y = 0;
21430 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21431 vkEndCommandBuffer(command_buffer[1]);
21432 }
21433 {
21434 VkSubmitInfo submit_info{};
21435 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21436 submit_info.commandBufferCount = 1;
21437 submit_info.pCommandBuffers = &command_buffer[0];
21438 submit_info.signalSemaphoreCount = 1;
21439 submit_info.pSignalSemaphores = &semaphore;
21440 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21441 }
21442 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021443 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021444 VkSubmitInfo submit_info{};
21445 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21446 submit_info.commandBufferCount = 1;
21447 submit_info.pCommandBuffers = &command_buffer[1];
21448 submit_info.waitSemaphoreCount = 1;
21449 submit_info.pWaitSemaphores = &semaphore;
21450 submit_info.pWaitDstStageMask = flags;
21451 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21452 }
21453
21454 vkQueueWaitIdle(m_device->m_queue);
21455
21456 vkDestroyFence(m_device->device(), fence, nullptr);
21457 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21458 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21459 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21460
21461 m_errorMonitor->VerifyNotFound();
21462}
21463
21464// This is a positive test. No errors should be generated.
21465TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021466 TEST_DESCRIPTION(
21467 "Two command buffers, each in a separate QueueSubmit call "
21468 "submitted on separate queues, the second having a fence"
21469 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021470
Tony Barbour1fa09702017-03-16 12:09:08 -060021471 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021472 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021473
21474 m_errorMonitor->ExpectSuccess();
21475
21476 VkFence fence;
21477 VkFenceCreateInfo fence_create_info{};
21478 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21479 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21480
21481 VkSemaphore semaphore;
21482 VkSemaphoreCreateInfo semaphore_create_info{};
21483 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21484 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21485
21486 VkCommandPool command_pool;
21487 VkCommandPoolCreateInfo pool_create_info{};
21488 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21489 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21490 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21491 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21492
21493 VkCommandBuffer command_buffer[2];
21494 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21495 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21496 command_buffer_allocate_info.commandPool = command_pool;
21497 command_buffer_allocate_info.commandBufferCount = 2;
21498 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21499 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21500
21501 VkQueue queue = VK_NULL_HANDLE;
21502 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21503
21504 {
21505 VkCommandBufferBeginInfo begin_info{};
21506 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21507 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21508
21509 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 -070021510 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021511
21512 VkViewport viewport{};
21513 viewport.maxDepth = 1.0f;
21514 viewport.minDepth = 0.0f;
21515 viewport.width = 512;
21516 viewport.height = 512;
21517 viewport.x = 0;
21518 viewport.y = 0;
21519 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21520 vkEndCommandBuffer(command_buffer[0]);
21521 }
21522 {
21523 VkCommandBufferBeginInfo begin_info{};
21524 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21525 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21526
21527 VkViewport viewport{};
21528 viewport.maxDepth = 1.0f;
21529 viewport.minDepth = 0.0f;
21530 viewport.width = 512;
21531 viewport.height = 512;
21532 viewport.x = 0;
21533 viewport.y = 0;
21534 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21535 vkEndCommandBuffer(command_buffer[1]);
21536 }
21537 {
21538 VkSubmitInfo submit_info{};
21539 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21540 submit_info.commandBufferCount = 1;
21541 submit_info.pCommandBuffers = &command_buffer[0];
21542 submit_info.signalSemaphoreCount = 1;
21543 submit_info.pSignalSemaphores = &semaphore;
21544 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21545 }
21546 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021547 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021548 VkSubmitInfo submit_info{};
21549 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21550 submit_info.commandBufferCount = 1;
21551 submit_info.pCommandBuffers = &command_buffer[1];
21552 submit_info.waitSemaphoreCount = 1;
21553 submit_info.pWaitSemaphores = &semaphore;
21554 submit_info.pWaitDstStageMask = flags;
21555 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21556 }
21557
21558 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21559 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21560
21561 vkDestroyFence(m_device->device(), fence, nullptr);
21562 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21563 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21564 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21565
21566 m_errorMonitor->VerifyNotFound();
21567}
21568
21569TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021570 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021571 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021572 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021573 return;
21574 }
21575
21576 VkResult err;
21577
21578 m_errorMonitor->ExpectSuccess();
21579
21580 VkQueue q0 = m_device->m_queue;
21581 VkQueue q1 = nullptr;
21582 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21583 ASSERT_NE(q1, nullptr);
21584
21585 // An (empty) command buffer. We must have work in the first submission --
21586 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021587 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021588 VkCommandPool pool;
21589 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21590 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021591 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21592 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021593 VkCommandBuffer cb;
21594 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21595 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021596 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021597 err = vkBeginCommandBuffer(cb, &cbbi);
21598 ASSERT_VK_SUCCESS(err);
21599 err = vkEndCommandBuffer(cb);
21600 ASSERT_VK_SUCCESS(err);
21601
21602 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021603 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021604 VkSemaphore s;
21605 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21606 ASSERT_VK_SUCCESS(err);
21607
21608 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021609 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021610
21611 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21612 ASSERT_VK_SUCCESS(err);
21613
21614 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021615 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021616 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021617
21618 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21619 ASSERT_VK_SUCCESS(err);
21620
21621 // Wait for q0 idle
21622 err = vkQueueWaitIdle(q0);
21623 ASSERT_VK_SUCCESS(err);
21624
21625 // Command buffer should have been completed (it was on q0); reset the pool.
21626 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21627
21628 m_errorMonitor->VerifyNotFound();
21629
21630 // Force device completely idle and clean up resources
21631 vkDeviceWaitIdle(m_device->device());
21632 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21633 vkDestroySemaphore(m_device->device(), s, nullptr);
21634}
21635
21636// This is a positive test. No errors should be generated.
21637TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021638 TEST_DESCRIPTION(
21639 "Two command buffers, each in a separate QueueSubmit call "
21640 "submitted on separate queues, the second having a fence, "
21641 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021642
Tony Barbour1fa09702017-03-16 12:09:08 -060021643 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021644 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021645
21646 m_errorMonitor->ExpectSuccess();
21647
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021648 VkFence fence;
21649 VkFenceCreateInfo fence_create_info{};
21650 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21651 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21652
21653 VkSemaphore semaphore;
21654 VkSemaphoreCreateInfo semaphore_create_info{};
21655 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21656 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21657
21658 VkCommandPool command_pool;
21659 VkCommandPoolCreateInfo pool_create_info{};
21660 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21661 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21662 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21663 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21664
21665 VkCommandBuffer command_buffer[2];
21666 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21667 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21668 command_buffer_allocate_info.commandPool = command_pool;
21669 command_buffer_allocate_info.commandBufferCount = 2;
21670 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21671 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21672
21673 VkQueue queue = VK_NULL_HANDLE;
21674 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21675
21676 {
21677 VkCommandBufferBeginInfo begin_info{};
21678 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21679 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21680
21681 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 -070021682 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021683
21684 VkViewport viewport{};
21685 viewport.maxDepth = 1.0f;
21686 viewport.minDepth = 0.0f;
21687 viewport.width = 512;
21688 viewport.height = 512;
21689 viewport.x = 0;
21690 viewport.y = 0;
21691 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21692 vkEndCommandBuffer(command_buffer[0]);
21693 }
21694 {
21695 VkCommandBufferBeginInfo begin_info{};
21696 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21697 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21698
21699 VkViewport viewport{};
21700 viewport.maxDepth = 1.0f;
21701 viewport.minDepth = 0.0f;
21702 viewport.width = 512;
21703 viewport.height = 512;
21704 viewport.x = 0;
21705 viewport.y = 0;
21706 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21707 vkEndCommandBuffer(command_buffer[1]);
21708 }
21709 {
21710 VkSubmitInfo submit_info{};
21711 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21712 submit_info.commandBufferCount = 1;
21713 submit_info.pCommandBuffers = &command_buffer[0];
21714 submit_info.signalSemaphoreCount = 1;
21715 submit_info.pSignalSemaphores = &semaphore;
21716 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21717 }
21718 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021719 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021720 VkSubmitInfo submit_info{};
21721 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21722 submit_info.commandBufferCount = 1;
21723 submit_info.pCommandBuffers = &command_buffer[1];
21724 submit_info.waitSemaphoreCount = 1;
21725 submit_info.pWaitSemaphores = &semaphore;
21726 submit_info.pWaitDstStageMask = flags;
21727 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21728 }
21729
21730 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21731
21732 vkDestroyFence(m_device->device(), fence, nullptr);
21733 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21734 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21735 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21736
21737 m_errorMonitor->VerifyNotFound();
21738}
21739
21740// This is a positive test. No errors should be generated.
21741TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021742 TEST_DESCRIPTION(
21743 "Two command buffers, each in a separate QueueSubmit call "
21744 "on the same queue, sharing a signal/wait semaphore, the "
21745 "second having a fence, "
21746 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021747
21748 m_errorMonitor->ExpectSuccess();
21749
Tony Barbour1fa09702017-03-16 12:09:08 -060021750 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021751 VkFence fence;
21752 VkFenceCreateInfo fence_create_info{};
21753 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21754 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21755
21756 VkSemaphore semaphore;
21757 VkSemaphoreCreateInfo semaphore_create_info{};
21758 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21759 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21760
21761 VkCommandPool command_pool;
21762 VkCommandPoolCreateInfo pool_create_info{};
21763 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21764 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21765 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21766 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21767
21768 VkCommandBuffer command_buffer[2];
21769 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21770 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21771 command_buffer_allocate_info.commandPool = command_pool;
21772 command_buffer_allocate_info.commandBufferCount = 2;
21773 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21774 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21775
21776 {
21777 VkCommandBufferBeginInfo begin_info{};
21778 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21779 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21780
21781 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 -070021782 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021783
21784 VkViewport viewport{};
21785 viewport.maxDepth = 1.0f;
21786 viewport.minDepth = 0.0f;
21787 viewport.width = 512;
21788 viewport.height = 512;
21789 viewport.x = 0;
21790 viewport.y = 0;
21791 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21792 vkEndCommandBuffer(command_buffer[0]);
21793 }
21794 {
21795 VkCommandBufferBeginInfo begin_info{};
21796 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21797 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21798
21799 VkViewport viewport{};
21800 viewport.maxDepth = 1.0f;
21801 viewport.minDepth = 0.0f;
21802 viewport.width = 512;
21803 viewport.height = 512;
21804 viewport.x = 0;
21805 viewport.y = 0;
21806 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21807 vkEndCommandBuffer(command_buffer[1]);
21808 }
21809 {
21810 VkSubmitInfo submit_info{};
21811 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21812 submit_info.commandBufferCount = 1;
21813 submit_info.pCommandBuffers = &command_buffer[0];
21814 submit_info.signalSemaphoreCount = 1;
21815 submit_info.pSignalSemaphores = &semaphore;
21816 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21817 }
21818 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021819 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021820 VkSubmitInfo submit_info{};
21821 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21822 submit_info.commandBufferCount = 1;
21823 submit_info.pCommandBuffers = &command_buffer[1];
21824 submit_info.waitSemaphoreCount = 1;
21825 submit_info.pWaitSemaphores = &semaphore;
21826 submit_info.pWaitDstStageMask = flags;
21827 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21828 }
21829
21830 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21831
21832 vkDestroyFence(m_device->device(), fence, nullptr);
21833 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21834 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21835 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21836
21837 m_errorMonitor->VerifyNotFound();
21838}
21839
21840// This is a positive test. No errors should be generated.
21841TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021842 TEST_DESCRIPTION(
21843 "Two command buffers, each in a separate QueueSubmit call "
21844 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21845 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021846
21847 m_errorMonitor->ExpectSuccess();
21848
Tony Barbour1fa09702017-03-16 12:09:08 -060021849 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021850 VkFence fence;
21851 VkFenceCreateInfo fence_create_info{};
21852 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21853 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21854
21855 VkCommandPool command_pool;
21856 VkCommandPoolCreateInfo pool_create_info{};
21857 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21858 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21859 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21860 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21861
21862 VkCommandBuffer command_buffer[2];
21863 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21864 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21865 command_buffer_allocate_info.commandPool = command_pool;
21866 command_buffer_allocate_info.commandBufferCount = 2;
21867 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21868 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21869
21870 {
21871 VkCommandBufferBeginInfo begin_info{};
21872 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21873 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21874
21875 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 -070021876 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021877
21878 VkViewport viewport{};
21879 viewport.maxDepth = 1.0f;
21880 viewport.minDepth = 0.0f;
21881 viewport.width = 512;
21882 viewport.height = 512;
21883 viewport.x = 0;
21884 viewport.y = 0;
21885 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21886 vkEndCommandBuffer(command_buffer[0]);
21887 }
21888 {
21889 VkCommandBufferBeginInfo begin_info{};
21890 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21891 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21892
21893 VkViewport viewport{};
21894 viewport.maxDepth = 1.0f;
21895 viewport.minDepth = 0.0f;
21896 viewport.width = 512;
21897 viewport.height = 512;
21898 viewport.x = 0;
21899 viewport.y = 0;
21900 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21901 vkEndCommandBuffer(command_buffer[1]);
21902 }
21903 {
21904 VkSubmitInfo submit_info{};
21905 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21906 submit_info.commandBufferCount = 1;
21907 submit_info.pCommandBuffers = &command_buffer[0];
21908 submit_info.signalSemaphoreCount = 0;
21909 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21910 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21911 }
21912 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021913 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021914 VkSubmitInfo submit_info{};
21915 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21916 submit_info.commandBufferCount = 1;
21917 submit_info.pCommandBuffers = &command_buffer[1];
21918 submit_info.waitSemaphoreCount = 0;
21919 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21920 submit_info.pWaitDstStageMask = flags;
21921 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21922 }
21923
21924 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21925
21926 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21927 ASSERT_VK_SUCCESS(err);
21928
21929 vkDestroyFence(m_device->device(), fence, nullptr);
21930 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21931 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21932
21933 m_errorMonitor->VerifyNotFound();
21934}
21935
21936// This is a positive test. No errors should be generated.
21937TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021938 TEST_DESCRIPTION(
21939 "Two command buffers, each in a separate QueueSubmit call "
21940 "on the same queue, the second having a fence, followed "
21941 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021942
21943 m_errorMonitor->ExpectSuccess();
21944
Tony Barbour1fa09702017-03-16 12:09:08 -060021945 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021946 VkFence fence;
21947 VkFenceCreateInfo fence_create_info{};
21948 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21949 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21950
21951 VkCommandPool command_pool;
21952 VkCommandPoolCreateInfo pool_create_info{};
21953 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21954 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21955 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21956 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21957
21958 VkCommandBuffer command_buffer[2];
21959 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21960 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21961 command_buffer_allocate_info.commandPool = command_pool;
21962 command_buffer_allocate_info.commandBufferCount = 2;
21963 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21964 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21965
21966 {
21967 VkCommandBufferBeginInfo begin_info{};
21968 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21969 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21970
21971 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 -070021972 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021973
21974 VkViewport viewport{};
21975 viewport.maxDepth = 1.0f;
21976 viewport.minDepth = 0.0f;
21977 viewport.width = 512;
21978 viewport.height = 512;
21979 viewport.x = 0;
21980 viewport.y = 0;
21981 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21982 vkEndCommandBuffer(command_buffer[0]);
21983 }
21984 {
21985 VkCommandBufferBeginInfo begin_info{};
21986 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21987 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21988
21989 VkViewport viewport{};
21990 viewport.maxDepth = 1.0f;
21991 viewport.minDepth = 0.0f;
21992 viewport.width = 512;
21993 viewport.height = 512;
21994 viewport.x = 0;
21995 viewport.y = 0;
21996 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21997 vkEndCommandBuffer(command_buffer[1]);
21998 }
21999 {
22000 VkSubmitInfo submit_info{};
22001 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22002 submit_info.commandBufferCount = 1;
22003 submit_info.pCommandBuffers = &command_buffer[0];
22004 submit_info.signalSemaphoreCount = 0;
22005 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
22006 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
22007 }
22008 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022009 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022010 VkSubmitInfo submit_info{};
22011 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22012 submit_info.commandBufferCount = 1;
22013 submit_info.pCommandBuffers = &command_buffer[1];
22014 submit_info.waitSemaphoreCount = 0;
22015 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
22016 submit_info.pWaitDstStageMask = flags;
22017 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
22018 }
22019
22020 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
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, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022031 TEST_DESCRIPTION(
22032 "Two command buffers each in a separate SubmitInfo sent in a single "
22033 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022034 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022035
22036 m_errorMonitor->ExpectSuccess();
22037
22038 VkFence fence;
22039 VkFenceCreateInfo fence_create_info{};
22040 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22041 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22042
22043 VkSemaphore semaphore;
22044 VkSemaphoreCreateInfo semaphore_create_info{};
22045 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22046 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22047
22048 VkCommandPool command_pool;
22049 VkCommandPoolCreateInfo pool_create_info{};
22050 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22051 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22052 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22053 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22054
22055 VkCommandBuffer command_buffer[2];
22056 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22057 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22058 command_buffer_allocate_info.commandPool = command_pool;
22059 command_buffer_allocate_info.commandBufferCount = 2;
22060 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22061 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22062
22063 {
22064 VkCommandBufferBeginInfo begin_info{};
22065 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22066 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22067
22068 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 -070022069 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022070
22071 VkViewport viewport{};
22072 viewport.maxDepth = 1.0f;
22073 viewport.minDepth = 0.0f;
22074 viewport.width = 512;
22075 viewport.height = 512;
22076 viewport.x = 0;
22077 viewport.y = 0;
22078 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22079 vkEndCommandBuffer(command_buffer[0]);
22080 }
22081 {
22082 VkCommandBufferBeginInfo begin_info{};
22083 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22084 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22085
22086 VkViewport viewport{};
22087 viewport.maxDepth = 1.0f;
22088 viewport.minDepth = 0.0f;
22089 viewport.width = 512;
22090 viewport.height = 512;
22091 viewport.x = 0;
22092 viewport.y = 0;
22093 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22094 vkEndCommandBuffer(command_buffer[1]);
22095 }
22096 {
22097 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022098 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022099
22100 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22101 submit_info[0].pNext = NULL;
22102 submit_info[0].commandBufferCount = 1;
22103 submit_info[0].pCommandBuffers = &command_buffer[0];
22104 submit_info[0].signalSemaphoreCount = 1;
22105 submit_info[0].pSignalSemaphores = &semaphore;
22106 submit_info[0].waitSemaphoreCount = 0;
22107 submit_info[0].pWaitSemaphores = NULL;
22108 submit_info[0].pWaitDstStageMask = 0;
22109
22110 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22111 submit_info[1].pNext = NULL;
22112 submit_info[1].commandBufferCount = 1;
22113 submit_info[1].pCommandBuffers = &command_buffer[1];
22114 submit_info[1].waitSemaphoreCount = 1;
22115 submit_info[1].pWaitSemaphores = &semaphore;
22116 submit_info[1].pWaitDstStageMask = flags;
22117 submit_info[1].signalSemaphoreCount = 0;
22118 submit_info[1].pSignalSemaphores = NULL;
22119 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22120 }
22121
22122 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22123
22124 vkDestroyFence(m_device->device(), fence, nullptr);
22125 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22126 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22127 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22128
22129 m_errorMonitor->VerifyNotFound();
22130}
22131
22132TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
22133 m_errorMonitor->ExpectSuccess();
22134
Tony Barbour1fa09702017-03-16 12:09:08 -060022135 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022136 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22137
Tony Barbour552f6c02016-12-21 14:34:07 -070022138 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022139
22140 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22141 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22142 m_errorMonitor->VerifyNotFound();
22143 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22144 m_errorMonitor->VerifyNotFound();
22145 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22146 m_errorMonitor->VerifyNotFound();
22147
22148 m_commandBuffer->EndCommandBuffer();
22149 m_errorMonitor->VerifyNotFound();
22150}
22151
22152TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022153 TEST_DESCRIPTION(
22154 "Positive test where we create a renderpass with an "
22155 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22156 "has a valid layout, and a second subpass then uses a "
22157 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022158 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022159 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022160 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022161 if (!depth_format) {
22162 printf(" No Depth + Stencil format found. Skipped.\n");
22163 return;
22164 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022165
22166 VkAttachmentReference attach[2] = {};
22167 attach[0].attachment = 0;
22168 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22169 attach[1].attachment = 0;
22170 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22171 VkSubpassDescription subpasses[2] = {};
22172 // First subpass clears DS attach on load
22173 subpasses[0].pDepthStencilAttachment = &attach[0];
22174 // 2nd subpass reads in DS as input attachment
22175 subpasses[1].inputAttachmentCount = 1;
22176 subpasses[1].pInputAttachments = &attach[1];
22177 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022178 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022179 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22180 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22181 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22182 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22183 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22184 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22185 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22186 VkRenderPassCreateInfo rpci = {};
22187 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22188 rpci.attachmentCount = 1;
22189 rpci.pAttachments = &attach_desc;
22190 rpci.subpassCount = 2;
22191 rpci.pSubpasses = subpasses;
22192
22193 // Now create RenderPass and verify no errors
22194 VkRenderPass rp;
22195 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22196 m_errorMonitor->VerifyNotFound();
22197
22198 vkDestroyRenderPass(m_device->device(), rp, NULL);
22199}
22200
Tobin Ehlis01103de2017-02-16 13:22:47 -070022201TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22202 TEST_DESCRIPTION(
22203 "Create a render pass with depth-stencil attachment where layout transition "
22204 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22205 "transition has correctly occurred at queue submit time with no validation errors.");
22206
Tony Barbour1fa09702017-03-16 12:09:08 -060022207 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022208 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022209 if (!depth_format) {
22210 printf(" No Depth + Stencil format found. Skipped.\n");
22211 return;
22212 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070022213 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070022214 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022215 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22216 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022217 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022218 return;
22219 }
22220
22221 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022222 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22223
22224 // A renderpass with one depth/stencil attachment.
22225 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022226 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022227 VK_SAMPLE_COUNT_1_BIT,
22228 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22229 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22230 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22231 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22232 VK_IMAGE_LAYOUT_UNDEFINED,
22233 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22234
22235 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22236
22237 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22238
22239 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22240
22241 VkRenderPass rp;
22242 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22243 ASSERT_VK_SUCCESS(err);
22244 // A compatible ds image.
22245 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022246 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 -070022247 ASSERT_TRUE(image.initialized());
22248
22249 VkImageViewCreateInfo ivci = {
22250 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22251 nullptr,
22252 0,
22253 image.handle(),
22254 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022255 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022256 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22257 VK_COMPONENT_SWIZZLE_IDENTITY},
22258 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22259 };
22260 VkImageView view;
22261 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22262 ASSERT_VK_SUCCESS(err);
22263
22264 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22265 VkFramebuffer fb;
22266 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22267 ASSERT_VK_SUCCESS(err);
22268
22269 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22270 m_commandBuffer->BeginCommandBuffer();
22271 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22272 vkCmdEndRenderPass(m_commandBuffer->handle());
22273 m_commandBuffer->EndCommandBuffer();
22274 QueueCommandBuffer(false);
22275 m_errorMonitor->VerifyNotFound();
22276
22277 // Cleanup
22278 vkDestroyImageView(m_device->device(), view, NULL);
22279 vkDestroyRenderPass(m_device->device(), rp, NULL);
22280 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22281}
22282
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022283TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022284 TEST_DESCRIPTION(
22285 "Test that pipeline validation accepts matrices passed "
22286 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022287 m_errorMonitor->ExpectSuccess();
22288
Tony Barbour1fa09702017-03-16 12:09:08 -060022289 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022290 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22291
22292 VkVertexInputBindingDescription input_binding;
22293 memset(&input_binding, 0, sizeof(input_binding));
22294
22295 VkVertexInputAttributeDescription input_attribs[2];
22296 memset(input_attribs, 0, sizeof(input_attribs));
22297
22298 for (int i = 0; i < 2; i++) {
22299 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22300 input_attribs[i].location = i;
22301 }
22302
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022303 char const *vsSource =
22304 "#version 450\n"
22305 "\n"
22306 "layout(location=0) in mat2x4 x;\n"
22307 "out gl_PerVertex {\n"
22308 " vec4 gl_Position;\n"
22309 "};\n"
22310 "void main(){\n"
22311 " gl_Position = x[0] + x[1];\n"
22312 "}\n";
22313 char const *fsSource =
22314 "#version 450\n"
22315 "\n"
22316 "layout(location=0) out vec4 color;\n"
22317 "void main(){\n"
22318 " color = vec4(1);\n"
22319 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022320
22321 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22322 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22323
22324 VkPipelineObj pipe(m_device);
22325 pipe.AddColorAttachment();
22326 pipe.AddShader(&vs);
22327 pipe.AddShader(&fs);
22328
22329 pipe.AddVertexInputBindings(&input_binding, 1);
22330 pipe.AddVertexInputAttribs(input_attribs, 2);
22331
22332 VkDescriptorSetObj descriptorSet(m_device);
22333 descriptorSet.AppendDummy();
22334 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22335
22336 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22337
22338 /* expect success */
22339 m_errorMonitor->VerifyNotFound();
22340}
22341
22342TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22343 m_errorMonitor->ExpectSuccess();
22344
Tony Barbour1fa09702017-03-16 12:09:08 -060022345 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22347
22348 VkVertexInputBindingDescription input_binding;
22349 memset(&input_binding, 0, sizeof(input_binding));
22350
22351 VkVertexInputAttributeDescription input_attribs[2];
22352 memset(input_attribs, 0, sizeof(input_attribs));
22353
22354 for (int i = 0; i < 2; i++) {
22355 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22356 input_attribs[i].location = i;
22357 }
22358
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022359 char const *vsSource =
22360 "#version 450\n"
22361 "\n"
22362 "layout(location=0) in vec4 x[2];\n"
22363 "out gl_PerVertex {\n"
22364 " vec4 gl_Position;\n"
22365 "};\n"
22366 "void main(){\n"
22367 " gl_Position = x[0] + x[1];\n"
22368 "}\n";
22369 char const *fsSource =
22370 "#version 450\n"
22371 "\n"
22372 "layout(location=0) out vec4 color;\n"
22373 "void main(){\n"
22374 " color = vec4(1);\n"
22375 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022376
22377 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22378 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22379
22380 VkPipelineObj pipe(m_device);
22381 pipe.AddColorAttachment();
22382 pipe.AddShader(&vs);
22383 pipe.AddShader(&fs);
22384
22385 pipe.AddVertexInputBindings(&input_binding, 1);
22386 pipe.AddVertexInputAttribs(input_attribs, 2);
22387
22388 VkDescriptorSetObj descriptorSet(m_device);
22389 descriptorSet.AppendDummy();
22390 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22391
22392 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22393
22394 m_errorMonitor->VerifyNotFound();
22395}
22396
22397TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022398 TEST_DESCRIPTION(
22399 "Test that pipeline validation accepts consuming a vertex attribute "
22400 "through multiple vertex shader inputs, each consuming a different "
22401 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022402 m_errorMonitor->ExpectSuccess();
22403
Tony Barbour1fa09702017-03-16 12:09:08 -060022404 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22406
22407 VkVertexInputBindingDescription input_binding;
22408 memset(&input_binding, 0, sizeof(input_binding));
22409
22410 VkVertexInputAttributeDescription input_attribs[3];
22411 memset(input_attribs, 0, sizeof(input_attribs));
22412
22413 for (int i = 0; i < 3; i++) {
22414 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22415 input_attribs[i].location = i;
22416 }
22417
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022418 char const *vsSource =
22419 "#version 450\n"
22420 "\n"
22421 "layout(location=0) in vec4 x;\n"
22422 "layout(location=1) in vec3 y1;\n"
22423 "layout(location=1, component=3) in float y2;\n"
22424 "layout(location=2) in vec4 z;\n"
22425 "out gl_PerVertex {\n"
22426 " vec4 gl_Position;\n"
22427 "};\n"
22428 "void main(){\n"
22429 " gl_Position = x + vec4(y1, y2) + z;\n"
22430 "}\n";
22431 char const *fsSource =
22432 "#version 450\n"
22433 "\n"
22434 "layout(location=0) out vec4 color;\n"
22435 "void main(){\n"
22436 " color = vec4(1);\n"
22437 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022438
22439 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22440 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22441
22442 VkPipelineObj pipe(m_device);
22443 pipe.AddColorAttachment();
22444 pipe.AddShader(&vs);
22445 pipe.AddShader(&fs);
22446
22447 pipe.AddVertexInputBindings(&input_binding, 1);
22448 pipe.AddVertexInputAttribs(input_attribs, 3);
22449
22450 VkDescriptorSetObj descriptorSet(m_device);
22451 descriptorSet.AppendDummy();
22452 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22453
22454 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22455
22456 m_errorMonitor->VerifyNotFound();
22457}
22458
22459TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22460 m_errorMonitor->ExpectSuccess();
22461
Tony Barbour1fa09702017-03-16 12:09:08 -060022462 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022463 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22464
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022465 char const *vsSource =
22466 "#version 450\n"
22467 "out gl_PerVertex {\n"
22468 " vec4 gl_Position;\n"
22469 "};\n"
22470 "void main(){\n"
22471 " gl_Position = vec4(0);\n"
22472 "}\n";
22473 char const *fsSource =
22474 "#version 450\n"
22475 "\n"
22476 "layout(location=0) out vec4 color;\n"
22477 "void main(){\n"
22478 " color = vec4(1);\n"
22479 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022480
22481 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22482 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22483
22484 VkPipelineObj pipe(m_device);
22485 pipe.AddColorAttachment();
22486 pipe.AddShader(&vs);
22487 pipe.AddShader(&fs);
22488
22489 VkDescriptorSetObj descriptorSet(m_device);
22490 descriptorSet.AppendDummy();
22491 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22492
22493 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22494
22495 m_errorMonitor->VerifyNotFound();
22496}
22497
22498TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022499 TEST_DESCRIPTION(
22500 "Test that pipeline validation accepts the relaxed type matching rules "
22501 "set out in 14.1.3: fundamental type must match, and producer side must "
22502 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022503 m_errorMonitor->ExpectSuccess();
22504
22505 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22506
Tony Barbour1fa09702017-03-16 12:09:08 -060022507 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22509
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022510 char const *vsSource =
22511 "#version 450\n"
22512 "out gl_PerVertex {\n"
22513 " vec4 gl_Position;\n"
22514 "};\n"
22515 "layout(location=0) out vec3 x;\n"
22516 "layout(location=1) out ivec3 y;\n"
22517 "layout(location=2) out vec3 z;\n"
22518 "void main(){\n"
22519 " gl_Position = vec4(0);\n"
22520 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22521 "}\n";
22522 char const *fsSource =
22523 "#version 450\n"
22524 "\n"
22525 "layout(location=0) out vec4 color;\n"
22526 "layout(location=0) in float x;\n"
22527 "layout(location=1) flat in int y;\n"
22528 "layout(location=2) in vec2 z;\n"
22529 "void main(){\n"
22530 " color = vec4(1 + x + y + z.x);\n"
22531 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022532
22533 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22534 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22535
22536 VkPipelineObj pipe(m_device);
22537 pipe.AddColorAttachment();
22538 pipe.AddShader(&vs);
22539 pipe.AddShader(&fs);
22540
22541 VkDescriptorSetObj descriptorSet(m_device);
22542 descriptorSet.AppendDummy();
22543 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22544
22545 VkResult err = VK_SUCCESS;
22546 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22547 ASSERT_VK_SUCCESS(err);
22548
22549 m_errorMonitor->VerifyNotFound();
22550}
22551
22552TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022553 TEST_DESCRIPTION(
22554 "Test that pipeline validation accepts per-vertex variables "
22555 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022556 m_errorMonitor->ExpectSuccess();
22557
Tony Barbour1fa09702017-03-16 12:09:08 -060022558 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22560
22561 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022562 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022563 return;
22564 }
22565
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022566 char const *vsSource =
22567 "#version 450\n"
22568 "void main(){}\n";
22569 char const *tcsSource =
22570 "#version 450\n"
22571 "layout(location=0) out int x[];\n"
22572 "layout(vertices=3) out;\n"
22573 "void main(){\n"
22574 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22575 " gl_TessLevelInner[0] = 1;\n"
22576 " x[gl_InvocationID] = gl_InvocationID;\n"
22577 "}\n";
22578 char const *tesSource =
22579 "#version 450\n"
22580 "layout(triangles, equal_spacing, cw) in;\n"
22581 "layout(location=0) in int x[];\n"
22582 "out gl_PerVertex { vec4 gl_Position; };\n"
22583 "void main(){\n"
22584 " gl_Position.xyz = gl_TessCoord;\n"
22585 " gl_Position.w = x[0] + x[1] + x[2];\n"
22586 "}\n";
22587 char const *fsSource =
22588 "#version 450\n"
22589 "layout(location=0) out vec4 color;\n"
22590 "void main(){\n"
22591 " color = vec4(1);\n"
22592 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022593
22594 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22595 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22596 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22597 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22598
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022599 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22600 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022601
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022602 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022603
22604 VkPipelineObj pipe(m_device);
22605 pipe.SetInputAssembly(&iasci);
22606 pipe.SetTessellation(&tsci);
22607 pipe.AddColorAttachment();
22608 pipe.AddShader(&vs);
22609 pipe.AddShader(&tcs);
22610 pipe.AddShader(&tes);
22611 pipe.AddShader(&fs);
22612
22613 VkDescriptorSetObj descriptorSet(m_device);
22614 descriptorSet.AppendDummy();
22615 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22616
22617 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22618
22619 m_errorMonitor->VerifyNotFound();
22620}
22621
22622TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022623 TEST_DESCRIPTION(
22624 "Test that pipeline validation accepts a user-defined "
22625 "interface block passed into the geometry shader. This "
22626 "is interesting because the 'extra' array level is not "
22627 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022628 m_errorMonitor->ExpectSuccess();
22629
Tony Barbour1fa09702017-03-16 12:09:08 -060022630 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022631 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22632
22633 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022634 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022635 return;
22636 }
22637
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022638 char const *vsSource =
22639 "#version 450\n"
22640 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22641 "void main(){\n"
22642 " vs_out.x = vec4(1);\n"
22643 "}\n";
22644 char const *gsSource =
22645 "#version 450\n"
22646 "layout(triangles) in;\n"
22647 "layout(triangle_strip, max_vertices=3) out;\n"
22648 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22649 "out gl_PerVertex { vec4 gl_Position; };\n"
22650 "void main() {\n"
22651 " gl_Position = gs_in[0].x;\n"
22652 " EmitVertex();\n"
22653 "}\n";
22654 char const *fsSource =
22655 "#version 450\n"
22656 "layout(location=0) out vec4 color;\n"
22657 "void main(){\n"
22658 " color = vec4(1);\n"
22659 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022660
22661 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22662 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22663 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22664
22665 VkPipelineObj pipe(m_device);
22666 pipe.AddColorAttachment();
22667 pipe.AddShader(&vs);
22668 pipe.AddShader(&gs);
22669 pipe.AddShader(&fs);
22670
22671 VkDescriptorSetObj descriptorSet(m_device);
22672 descriptorSet.AppendDummy();
22673 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22674
22675 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22676
22677 m_errorMonitor->VerifyNotFound();
22678}
22679
22680TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022681 TEST_DESCRIPTION(
22682 "Test that pipeline validation accepts basic use of 64bit vertex "
22683 "attributes. This is interesting because they consume multiple "
22684 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022685 m_errorMonitor->ExpectSuccess();
22686
Tony Barbour1fa09702017-03-16 12:09:08 -060022687 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022688 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22689
22690 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022691 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022692 return;
22693 }
22694
22695 VkVertexInputBindingDescription input_bindings[1];
22696 memset(input_bindings, 0, sizeof(input_bindings));
22697
22698 VkVertexInputAttributeDescription input_attribs[4];
22699 memset(input_attribs, 0, sizeof(input_attribs));
22700 input_attribs[0].location = 0;
22701 input_attribs[0].offset = 0;
22702 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22703 input_attribs[1].location = 2;
22704 input_attribs[1].offset = 32;
22705 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22706 input_attribs[2].location = 4;
22707 input_attribs[2].offset = 64;
22708 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22709 input_attribs[3].location = 6;
22710 input_attribs[3].offset = 96;
22711 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022713 char const *vsSource =
22714 "#version 450\n"
22715 "\n"
22716 "layout(location=0) in dmat4 x;\n"
22717 "out gl_PerVertex {\n"
22718 " vec4 gl_Position;\n"
22719 "};\n"
22720 "void main(){\n"
22721 " gl_Position = vec4(x[0][0]);\n"
22722 "}\n";
22723 char const *fsSource =
22724 "#version 450\n"
22725 "\n"
22726 "layout(location=0) out vec4 color;\n"
22727 "void main(){\n"
22728 " color = vec4(1);\n"
22729 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022730
22731 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22732 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22733
22734 VkPipelineObj pipe(m_device);
22735 pipe.AddColorAttachment();
22736 pipe.AddShader(&vs);
22737 pipe.AddShader(&fs);
22738
22739 pipe.AddVertexInputBindings(input_bindings, 1);
22740 pipe.AddVertexInputAttribs(input_attribs, 4);
22741
22742 VkDescriptorSetObj descriptorSet(m_device);
22743 descriptorSet.AppendDummy();
22744 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22745
22746 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22747
22748 m_errorMonitor->VerifyNotFound();
22749}
22750
22751TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22752 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22753 m_errorMonitor->ExpectSuccess();
22754
Tony Barbour1fa09702017-03-16 12:09:08 -060022755 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022756
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022757 char const *vsSource =
22758 "#version 450\n"
22759 "\n"
22760 "out gl_PerVertex {\n"
22761 " vec4 gl_Position;\n"
22762 "};\n"
22763 "void main(){\n"
22764 " gl_Position = vec4(1);\n"
22765 "}\n";
22766 char const *fsSource =
22767 "#version 450\n"
22768 "\n"
22769 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22770 "layout(location=0) out vec4 color;\n"
22771 "void main() {\n"
22772 " color = subpassLoad(x);\n"
22773 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022774
22775 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22776 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22777
22778 VkPipelineObj pipe(m_device);
22779 pipe.AddShader(&vs);
22780 pipe.AddShader(&fs);
22781 pipe.AddColorAttachment();
22782 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22783
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022784 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22785 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022786 VkDescriptorSetLayout dsl;
22787 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22788 ASSERT_VK_SUCCESS(err);
22789
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022790 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022791 VkPipelineLayout pl;
22792 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22793 ASSERT_VK_SUCCESS(err);
22794
22795 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022796 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22797 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22798 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22799 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22800 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 -060022801 };
22802 VkAttachmentReference color = {
22803 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22804 };
22805 VkAttachmentReference input = {
22806 1, VK_IMAGE_LAYOUT_GENERAL,
22807 };
22808
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022809 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022810
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022811 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022812 VkRenderPass rp;
22813 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22814 ASSERT_VK_SUCCESS(err);
22815
22816 // should be OK. would go wrong here if it's going to...
22817 pipe.CreateVKPipeline(pl, rp);
22818
22819 m_errorMonitor->VerifyNotFound();
22820
22821 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22822 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22823 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22824}
22825
22826TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022827 TEST_DESCRIPTION(
22828 "Test that pipeline validation accepts a compute pipeline which declares a "
22829 "descriptor-backed resource which is not provided, but the shader does not "
22830 "statically use it. This is interesting because it requires compute pipelines "
22831 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022832 m_errorMonitor->ExpectSuccess();
22833
Tony Barbour1fa09702017-03-16 12:09:08 -060022834 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022835
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022836 char const *csSource =
22837 "#version 450\n"
22838 "\n"
22839 "layout(local_size_x=1) in;\n"
22840 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22841 "void main(){\n"
22842 " // x is not used.\n"
22843 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022844
22845 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22846
22847 VkDescriptorSetObj descriptorSet(m_device);
22848 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22849
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022850 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22851 nullptr,
22852 0,
22853 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22854 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22855 descriptorSet.GetPipelineLayout(),
22856 VK_NULL_HANDLE,
22857 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022858
22859 VkPipeline pipe;
22860 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22861
22862 m_errorMonitor->VerifyNotFound();
22863
22864 if (err == VK_SUCCESS) {
22865 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22866 }
22867}
22868
22869TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022870 TEST_DESCRIPTION(
22871 "Test that pipeline validation accepts a shader consuming only the "
22872 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022873 m_errorMonitor->ExpectSuccess();
22874
Tony Barbour1fa09702017-03-16 12:09:08 -060022875 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022876
22877 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022878 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22879 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22880 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022881 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022882 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022883 VkDescriptorSetLayout dsl;
22884 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22885 ASSERT_VK_SUCCESS(err);
22886
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022887 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022888 VkPipelineLayout pl;
22889 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22890 ASSERT_VK_SUCCESS(err);
22891
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022892 char const *csSource =
22893 "#version 450\n"
22894 "\n"
22895 "layout(local_size_x=1) in;\n"
22896 "layout(set=0, binding=0) uniform sampler s;\n"
22897 "layout(set=0, binding=1) uniform texture2D t;\n"
22898 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22899 "void main() {\n"
22900 " x = texture(sampler2D(t, s), vec2(0));\n"
22901 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022902 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22903
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022904 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22905 nullptr,
22906 0,
22907 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22908 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22909 pl,
22910 VK_NULL_HANDLE,
22911 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022912
22913 VkPipeline pipe;
22914 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22915
22916 m_errorMonitor->VerifyNotFound();
22917
22918 if (err == VK_SUCCESS) {
22919 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22920 }
22921
22922 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22923 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22924}
22925
22926TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022927 TEST_DESCRIPTION(
22928 "Test that pipeline validation accepts a shader consuming only the "
22929 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022930 m_errorMonitor->ExpectSuccess();
22931
Tony Barbour1fa09702017-03-16 12:09:08 -060022932 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022933
22934 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022935 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22936 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22937 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022938 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022939 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022940 VkDescriptorSetLayout dsl;
22941 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22942 ASSERT_VK_SUCCESS(err);
22943
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022944 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022945 VkPipelineLayout pl;
22946 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22947 ASSERT_VK_SUCCESS(err);
22948
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022949 char const *csSource =
22950 "#version 450\n"
22951 "\n"
22952 "layout(local_size_x=1) in;\n"
22953 "layout(set=0, binding=0) uniform texture2D t;\n"
22954 "layout(set=0, binding=1) uniform sampler s;\n"
22955 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22956 "void main() {\n"
22957 " x = texture(sampler2D(t, s), vec2(0));\n"
22958 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022959 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22960
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022961 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22962 nullptr,
22963 0,
22964 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22965 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22966 pl,
22967 VK_NULL_HANDLE,
22968 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022969
22970 VkPipeline pipe;
22971 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22972
22973 m_errorMonitor->VerifyNotFound();
22974
22975 if (err == VK_SUCCESS) {
22976 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22977 }
22978
22979 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22980 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22981}
22982
22983TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022984 TEST_DESCRIPTION(
22985 "Test that pipeline validation accepts a shader consuming "
22986 "both the sampler and the image of a combined image+sampler "
22987 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022988 m_errorMonitor->ExpectSuccess();
22989
Tony Barbour1fa09702017-03-16 12:09:08 -060022990 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022991
22992 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022993 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22994 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022995 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022996 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022997 VkDescriptorSetLayout dsl;
22998 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22999 ASSERT_VK_SUCCESS(err);
23000
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023001 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023002 VkPipelineLayout pl;
23003 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
23004 ASSERT_VK_SUCCESS(err);
23005
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023006 char const *csSource =
23007 "#version 450\n"
23008 "\n"
23009 "layout(local_size_x=1) in;\n"
23010 "layout(set=0, binding=0) uniform texture2D t;\n"
23011 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
23012 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
23013 "void main() {\n"
23014 " x = texture(sampler2D(t, s), vec2(0));\n"
23015 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023016 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
23017
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070023018 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
23019 nullptr,
23020 0,
23021 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23022 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23023 pl,
23024 VK_NULL_HANDLE,
23025 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023026
23027 VkPipeline pipe;
23028 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23029
23030 m_errorMonitor->VerifyNotFound();
23031
23032 if (err == VK_SUCCESS) {
23033 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23034 }
23035
23036 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23037 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23038}
23039
Tony Barbour3ed87a02017-03-15 16:19:02 -060023040TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023041 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23042
Tony Barbour3ed87a02017-03-15 16:19:02 -060023043 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023044 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023045
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023046 // Ensure that extension is available and enabled.
23047 uint32_t extension_count = 0;
23048 bool supports_maintenance1_extension = false;
23049 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23050 ASSERT_VK_SUCCESS(err);
23051 if (extension_count > 0) {
23052 std::vector<VkExtensionProperties> available_extensions(extension_count);
23053
23054 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23055 ASSERT_VK_SUCCESS(err);
23056 for (const auto &extension_props : available_extensions) {
23057 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23058 supports_maintenance1_extension = true;
23059 }
23060 }
23061 }
23062
23063 // Proceed if extension is supported by hardware
23064 if (!supports_maintenance1_extension) {
23065 printf(" Maintenance1 Extension not supported, skipping tests\n");
23066 return;
23067 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023068
23069 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023070 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023071 VkCommandBuffer cmd_buf;
23072 VkCommandBufferAllocateInfo alloc_info;
23073 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23074 alloc_info.pNext = NULL;
23075 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023076 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023077 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23078 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23079
23080 VkCommandBufferBeginInfo cb_binfo;
23081 cb_binfo.pNext = NULL;
23082 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23083 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23084 cb_binfo.flags = 0;
23085 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23086 // Set Negative height, should give error if Maintenance 1 is not enabled
23087 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23088 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23089 vkEndCommandBuffer(cmd_buf);
23090
23091 m_errorMonitor->VerifyNotFound();
23092}
23093
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023094TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23095 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23096
23097 ASSERT_NO_FATAL_FAILURE(Init());
23098
23099 uint32_t extension_count = 0;
23100 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23101 ASSERT_VK_SUCCESS(err);
23102
23103 if (extension_count > 0) {
23104 std::vector<VkExtensionProperties> available_extensions(extension_count);
23105 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23106 ASSERT_VK_SUCCESS(err);
23107
23108 for (const auto &extension_props : available_extensions) {
23109 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23110 // Create two pNext structures which by themselves would be valid
23111 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23112 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23113 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23114 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23115 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23116
23117 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23118 dedicated_buffer_create_info_2.pNext = nullptr;
23119 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23120
23121 uint32_t queue_family_index = 0;
23122 VkBufferCreateInfo buffer_create_info = {};
23123 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23124 buffer_create_info.pNext = &dedicated_buffer_create_info;
23125 buffer_create_info.size = 1024;
23126 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23127 buffer_create_info.queueFamilyIndexCount = 1;
23128 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23129
23130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23131 VkBuffer buffer;
23132 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23133 m_errorMonitor->VerifyFound();
23134 }
23135 }
23136 }
23137}
23138
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023139TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23140 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23141
Tony Barbour1fa09702017-03-16 12:09:08 -060023142 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023143
23144 // Positive test to check parameter_validation and unique_objects support
23145 // for NV_dedicated_allocation
23146 uint32_t extension_count = 0;
23147 bool supports_nv_dedicated_allocation = false;
23148 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23149 ASSERT_VK_SUCCESS(err);
23150
23151 if (extension_count > 0) {
23152 std::vector<VkExtensionProperties> available_extensions(extension_count);
23153
23154 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23155 ASSERT_VK_SUCCESS(err);
23156
23157 for (const auto &extension_props : available_extensions) {
23158 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23159 supports_nv_dedicated_allocation = true;
23160 }
23161 }
23162 }
23163
23164 if (supports_nv_dedicated_allocation) {
23165 m_errorMonitor->ExpectSuccess();
23166
23167 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23168 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23169 dedicated_buffer_create_info.pNext = nullptr;
23170 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23171
23172 uint32_t queue_family_index = 0;
23173 VkBufferCreateInfo buffer_create_info = {};
23174 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23175 buffer_create_info.pNext = &dedicated_buffer_create_info;
23176 buffer_create_info.size = 1024;
23177 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23178 buffer_create_info.queueFamilyIndexCount = 1;
23179 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23180
23181 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023182 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023183 ASSERT_VK_SUCCESS(err);
23184
23185 VkMemoryRequirements memory_reqs;
23186 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23187
23188 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23189 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23190 dedicated_memory_info.pNext = nullptr;
23191 dedicated_memory_info.buffer = buffer;
23192 dedicated_memory_info.image = VK_NULL_HANDLE;
23193
23194 VkMemoryAllocateInfo memory_info = {};
23195 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23196 memory_info.pNext = &dedicated_memory_info;
23197 memory_info.allocationSize = memory_reqs.size;
23198
23199 bool pass;
23200 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23201 ASSERT_TRUE(pass);
23202
23203 VkDeviceMemory buffer_memory;
23204 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23205 ASSERT_VK_SUCCESS(err);
23206
23207 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
23208 ASSERT_VK_SUCCESS(err);
23209
23210 vkDestroyBuffer(m_device->device(), buffer, NULL);
23211 vkFreeMemory(m_device->device(), buffer_memory, NULL);
23212
23213 m_errorMonitor->VerifyNotFound();
23214 }
23215}
23216
23217TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23218 VkResult err;
23219
23220 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23221
Tony Barbour1fa09702017-03-16 12:09:08 -060023222 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023223 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23224
23225 std::vector<const char *> device_extension_names;
23226 auto features = m_device->phy().features();
23227 // Artificially disable support for non-solid fill modes
23228 features.fillModeNonSolid = false;
23229 // The sacrificial device object
23230 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23231
23232 VkRenderpassObj render_pass(&test_device);
23233
23234 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23235 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23236 pipeline_layout_ci.setLayoutCount = 0;
23237 pipeline_layout_ci.pSetLayouts = NULL;
23238
23239 VkPipelineLayout pipeline_layout;
23240 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23241 ASSERT_VK_SUCCESS(err);
23242
23243 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23244 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23245 rs_ci.pNext = nullptr;
23246 rs_ci.lineWidth = 1.0f;
23247 rs_ci.rasterizerDiscardEnable = true;
23248
23249 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23250 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23251
23252 // Set polygonMode=FILL. No error is expected
23253 m_errorMonitor->ExpectSuccess();
23254 {
23255 VkPipelineObj pipe(&test_device);
23256 pipe.AddShader(&vs);
23257 pipe.AddShader(&fs);
23258 pipe.AddColorAttachment();
23259 // Set polygonMode to a good value
23260 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23261 pipe.SetRasterization(&rs_ci);
23262 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23263 }
23264 m_errorMonitor->VerifyNotFound();
23265
23266 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23267}
23268
Chris Forbes94196952017-04-06 16:30:59 -070023269TEST_F(VkPositiveLayerTest, LongSemaphoreChain)
23270{
23271 m_errorMonitor->ExpectSuccess();
23272
23273 ASSERT_NO_FATAL_FAILURE(Init());
23274 VkResult err;
23275
23276 std::vector<VkSemaphore> semaphores;
23277
23278 const int chainLength = 32768;
23279 VkPipelineStageFlags flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
23280
23281 for (int i = 0; i < chainLength; i++) {
23282 VkSemaphoreCreateInfo sci = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
23283 VkSemaphore semaphore;
23284 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &semaphore);
23285 ASSERT_VK_SUCCESS(err);
23286
23287 semaphores.push_back(semaphore);
23288
Chris Forbesfc50aaa2017-05-01 10:20:17 -070023289 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO,
23290 nullptr,
23291 semaphores.size() > 1 ? 1u : 0u,
23292 semaphores.size() > 1 ? &semaphores[semaphores.size() - 2] : nullptr,
23293 &flags,
23294 0,
23295 nullptr,
23296 1,
23297 &semaphores[semaphores.size() - 1]};
Chris Forbes94196952017-04-06 16:30:59 -070023298 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
23299 ASSERT_VK_SUCCESS(err);
23300 }
23301
23302 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23303 VkFence fence;
23304 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23305 ASSERT_VK_SUCCESS(err);
23306 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &semaphores.back(), &flags, 0, nullptr, 0, nullptr };
23307 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23308 ASSERT_VK_SUCCESS(err);
23309
23310 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
23311
23312 for (auto semaphore : semaphores)
23313 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
23314
23315 vkDestroyFence(m_device->device(), fence, nullptr);
23316
23317 m_errorMonitor->VerifyNotFound();
23318}
23319
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023320#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023321TEST_F(VkPositiveLayerTest, LongFenceChain)
23322{
23323 m_errorMonitor->ExpectSuccess();
23324
Tony Barbour1fa09702017-03-16 12:09:08 -060023325 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023326 VkResult err;
23327
23328 std::vector<VkFence> fences;
23329
23330 const int chainLength = 32768;
23331
23332 for (int i = 0; i < chainLength; i++) {
23333 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23334 VkFence fence;
23335 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23336 ASSERT_VK_SUCCESS(err);
23337
23338 fences.push_back(fence);
23339
23340 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23341 0, nullptr, 0, nullptr };
23342 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23343 ASSERT_VK_SUCCESS(err);
23344
23345 }
23346
23347 // BOOM, stack overflow.
23348 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23349
23350 for (auto fence : fences)
23351 vkDestroyFence(m_device->device(), fence, nullptr);
23352
23353 m_errorMonitor->VerifyNotFound();
23354}
23355#endif
23356
Cody Northrop1242dfd2016-07-13 17:24:59 -060023357#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023358const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023359static bool initialized = false;
23360static bool active = false;
23361
23362// Convert Intents to argv
23363// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023364std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023365 std::vector<std::string> args;
23366 JavaVM &vm = *app.activity->vm;
23367 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023368 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023369
23370 JNIEnv &env = *p_env;
23371 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023372 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023373 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023374 jmethodID get_string_extra_method =
23375 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023376 jvalue get_string_extra_args;
23377 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023378 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023379
23380 std::string args_str;
23381 if (extra_str) {
23382 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23383 args_str = extra_utf;
23384 env.ReleaseStringUTFChars(extra_str, extra_utf);
23385 env.DeleteLocalRef(extra_str);
23386 }
23387
23388 env.DeleteLocalRef(get_string_extra_args.l);
23389 env.DeleteLocalRef(intent);
23390 vm.DetachCurrentThread();
23391
23392 // split args_str
23393 std::stringstream ss(args_str);
23394 std::string arg;
23395 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023396 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023397 }
23398
23399 return args;
23400}
23401
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023402void addFullTestCommentIfPresent(const ::testing::TestInfo &test_info, std::string &error_message) {
23403 const char *const type_param = test_info.type_param();
23404 const char *const value_param = test_info.value_param();
Cody Northropb94529f2017-04-05 13:05:51 -060023405
23406 if (type_param != NULL || value_param != NULL) {
23407 error_message.append(", where ");
23408 if (type_param != NULL) {
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023409 error_message.append("TypeParam = ").append(type_param);
23410 if (value_param != NULL) error_message.append(" and ");
Cody Northropb94529f2017-04-05 13:05:51 -060023411 }
23412 if (value_param != NULL) {
23413 error_message.append("GetParam() = ").append(value_param);
23414 }
23415 }
23416}
23417
23418// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23419class LogcatPrinter : public ::testing::EmptyTestEventListener {
23420 // Called before a test starts.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023421 virtual void OnTestStart(const ::testing::TestInfo &test_info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023422 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23423 }
23424
23425 // Called after a failed assertion or a SUCCEED() invocation.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023426 virtual void OnTestPartResult(const ::testing::TestPartResult &result) {
Cody Northropb94529f2017-04-05 13:05:51 -060023427 // If the test part succeeded, we don't need to do anything.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023428 if (result.type() == ::testing::TestPartResult::kSuccess) return;
Cody Northropb94529f2017-04-05 13:05:51 -060023429
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023430 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s", result.failed() ? "*** Failure" : "Success",
23431 result.file_name(), result.line_number(), result.summary());
Cody Northropb94529f2017-04-05 13:05:51 -060023432 }
23433
23434 // Called after a test ends.
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023435 virtual void OnTestEnd(const ::testing::TestInfo &info) {
Cody Northropb94529f2017-04-05 13:05:51 -060023436 std::string result;
23437 if (info.result()->Passed()) {
23438 result.append("[ OK ]");
23439 } else {
23440 result.append("[ FAILED ]");
23441 }
23442 result.append(info.test_case_name()).append(".").append(info.name());
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023443 if (info.result()->Failed()) addFullTestCommentIfPresent(info, result);
Cody Northropb94529f2017-04-05 13:05:51 -060023444
23445 if (::testing::GTEST_FLAG(print_time)) {
23446 std::ostringstream os;
23447 os << info.result()->elapsed_time();
23448 result.append(" (").append(os.str()).append(" ms)");
23449 }
23450
23451 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23452 };
23453};
23454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023455static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023456
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023457static void processCommand(struct android_app *app, int32_t cmd) {
23458 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023459 case APP_CMD_INIT_WINDOW: {
23460 if (app->window) {
23461 initialized = true;
23462 }
23463 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023464 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023465 case APP_CMD_GAINED_FOCUS: {
23466 active = true;
23467 break;
23468 }
23469 case APP_CMD_LOST_FOCUS: {
23470 active = false;
23471 break;
23472 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023473 }
23474}
23475
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023476void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023477 app_dummy();
23478
Cody Northrop1242dfd2016-07-13 17:24:59 -060023479 int vulkanSupport = InitVulkan();
23480 if (vulkanSupport == 0) {
23481 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23482 return;
23483 }
23484
23485 app->onAppCmd = processCommand;
23486 app->onInputEvent = processInput;
23487
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023488 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023489 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023490 struct android_poll_source *source;
23491 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023492 if (source) {
23493 source->process(app, source);
23494 }
23495
23496 if (app->destroyRequested != 0) {
23497 VkTestFramework::Finish();
23498 return;
23499 }
23500 }
23501
23502 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023503 // Use the following key to send arguments to gtest, i.e.
23504 // --es args "--gtest_filter=-VkLayerTest.foo"
23505 const char key[] = "args";
23506 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023507
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023508 std::string filter = "";
23509 if (args.size() > 0) {
23510 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23511 filter += args[0];
23512 } else {
23513 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23514 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023515
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023516 int argc = 2;
23517 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23518 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023519
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023520 // Route output to files until we can override the gtest output
23521 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23522 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023523
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023524 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023525
Dave Houlton11dcd5e2017-04-25 16:00:10 -060023526 ::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
Cody Northropb94529f2017-04-05 13:05:51 -060023527 listeners.Append(new LogcatPrinter);
23528
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023529 VkTestFramework::InitArgs(&argc, argv);
23530 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023531
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023532 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023533
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023534 if (result != 0) {
23535 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23536 } else {
23537 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23538 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023539
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023540 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023542 fclose(stdout);
23543 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023544
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023545 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023546 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023547 }
23548 }
23549}
23550#endif
23551
Tony Barbour300a6082015-04-07 13:44:53 -060023552int main(int argc, char **argv) {
23553 int result;
23554
Cody Northrop8e54a402016-03-08 22:25:52 -070023555#ifdef ANDROID
23556 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023557 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023558#endif
23559
Tony Barbour300a6082015-04-07 13:44:53 -060023560 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023561 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023562
23563 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23564
23565 result = RUN_ALL_TESTS();
23566
Tony Barbour6918cd52015-04-09 12:58:51 -060023567 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023568 return result;
23569}